spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程

前言

很久之前写了 4 篇关于 spring security 的入门实战文章

  • Spring Security 入门 - 01 将 Spring security 引入到工程
  • Spring security 入门 - 02 自定义用户登录页面和登录处理逻辑
  • Spring security 入门 - 03 自定义登录成功后的处理逻辑
  • Spring security 入门 - 04整合 jwt

而在上一篇文章 结合第三方登录案例理解 OAuth2.0 授权码方式 又加深了对 oAuth2.0 协议 - 授权码模式 的理解。

接下来要做的是开发一个基于 spring security oauth2仿微博第三方登录

本文要做的事情是:

  • 工程搭建
  • 微博第三方登录流程分析

阅读正文前,请确保已经了解了 oauth2.0 的相关内容,以及 spring-securiy 的入门使用。

正文

几点声明

  • 本文案例是基于 授权码模式
  • springboot 版本 2.1.6.RELEASE
  • spring-security-oauth2 版本 2.2.0.RELEASE
  • 使用 fastjson 进行 json 字符串与对象之间的转换
  • 页面跳转会从 controller 跳到 前台页面
  • 页面编写使用了 thymeleaf 模版引擎

需要注意的主要是版本问题,其他的只是简单声明下。

微博第三方登录流程

先来熟悉下微博的第三方登录流程。

1. 选择 qq 登录

spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第1张图片

2. 输入 qq 账号和密码

spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第2张图片

3. 点击授权进入微博首页

在这里插入图片描述

工程搭建

简单看下即可。详细请参考 spring-security-oauth2-sample
spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第3张图片
最外层 spring-security-oauth2-samples 是 父工程, 父工程下面包含了两个模块

1. qq-oauth2

qq 的认证授权中心

  • 端口 8082
  • url 根路径 http://localhost:8082/qqspring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第4张图片

2. weibo-demo

微博的 demo ,主要提供了页面跳转,与 qq 认证中心交互(获取授权码,获取 token)。

  • 端口 8081
  • url 根路径 http://localhost:8081/weibo
    spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第5张图片

最终效果流程图

1. 选择 qq 登陆

通过

http://localhost:8081/weibo/loginPage

进入 微博首页,然后选择 qq 登陆

在这里插入图片描述

2. 进入 qq 提供的登陆页面

这个页面是 spring-secutiry 框架内置的一个登陆页面
spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第6张图片
选择授权,并确认(这个页面也是内置的,可以通过配置省略这个步骤,一般做法都会把这一步省略掉,登录按钮改成 ”授权并登录“)
spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第7张图片

3. 进入微博首页

把获取到的用户信息显示在首页
在这里插入图片描述

详细流程图

下面是仿照 微博 第三方登录画的流程图,真实的微博认证登录流程不清楚。
并且以下只保留了主要流程, 省略了部分步骤(参数校验等)。
spring security oauth2 实战(仿微博第三方登录) - 工程搭建及登陆流程_第8张图片

模块详细说明

weibo-demo

该模块提供了以下功能:

  • 跳转到微博登陆页(PageController#loginPage())
  • 在登陆页面跳转到 qq 登陆页面(login.html#a标签)
  • 点击 qq 登陆,访问 qq 认证中心获取授权码 code /qq/oauth/authorize?redict_uri=callback
  • 提供一个callback 接口(/weibo/oauth/authorize/callback),接收上一步返回的 code,然后拿到 code 等参数去获取 token,再拿到 token 去获取 qq 授权访问的资源 , 最后返回微博首页。

篇幅原因,这里只贴一下核心代码


    @RequestMapping("oauth/authorize/callback")
    public ModelAndView getAuthorizeCode(String code) {
        // 1. 拿到 qq 传来的 授权码code,再次发送请求到qq 认证中心获取 token
        String accessToken = sendGetTokenRequest(code);
        // 2. 通过 token,获取用户信息
        HttpHeaders headers1 = new HttpHeaders();
        headers1.add("Authorization", "Bearer " + accessToken);
        ResponseEntity userInfo = restTemplate.exchange("http://localhost:8082/qq/getUser", HttpMethod.GET,
                new HttpEntity<>(null, headers1), Map.class);
        // 3. 携带用户信息,返回首页
        return new ModelAndView("index", "user", userInfo.getBody());
    }

qq-oauth2

该模块包含三个核心配置类,

  • spring-security 的基础配置类
  • 授权服务器配置类
  • 资源服务器配置类

还提供了一个获取用户信息的接口 /getUser, 需要通过 token 获取。

一些重要参数:

  • weibo-demo 作为客户端去 qq 进行认证授权,所以 qq 会分配给它一个 client_id 和 secret。

  • qq 登陆需要用到 qq 的 username 和 password。

  • 本文采用的授权码模式,也就是 grant_type=authorization_code

  • redirect_uri=回调地址, 该参数上面用到了两次,第一次是让 qq 认证中心知道如何把 code 传给 微博, 第二个次是作为校验。所以两次参数的值应该是一样的,这也是 阮一峰文章中的一个错误。

  • 其他参数就不展开讲了

总结

本文主要描述了整个项目的框架搭建,以及各个模块的作用,

  • weibo-demo
    作为客户端,去 qq 进行登录认证,最终获取 token
    拿到 token 后,就可以去访问 qq 授权访问的资源 /getUser
  • qq-oauth2
    既是认证服务器,也是资源服务器。

整个登陆的流程图,也是基于自己的一个理解。 下篇文章会对 demo 中的代码进行说明。

你可能感兴趣的:(springsecurity)