springsecurityoauth2实战(仿微博第三方登录)
- 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 登录
2. 输入 qq 账号和密码
3. 点击授权并登录进入微博首页
工程搭建
简单看下即可。详细请参考
spring-security-oauth2-sample
最外层 spring-security-oauth2-samples
是 父工程, 父工程下面包含了两个模块
1. qq-oauth2
qq 的认证授权中心
- 端口 8082
- url 根路径 http://localhost:8082/qq
2. weibo-demo
微博的 demo ,主要提供了页面跳转,与 qq 认证中心交互(获取授权码,获取 token)。
- 端口 8081
- url 根路径 http://localhost:8081/weibo
最终效果流程图
1. 选择 qq 登陆
通过
http://localhost:8081/weibo/loginPage
进入 微博首页,然后选择 qq 登陆
2. 进入 qq 提供的登陆页面
这个页面是 spring-secutiry 框架内置的一个登陆页面
选择授权,并确认(这个页面也是内置的,可以通过配置省略这个步骤,一般做法都会把这一步省略掉,登录按钮改成 ”授权并登录“)
3. 进入微博首页
把获取到的用户信息显示在首页
详细流程图
下面是仿照 微博 第三方登录画的流程图,真实的微博认证登录流程不清楚。
并且以下只保留了主要流程, 省略了部分步骤(参数校验等)。
模块详细说明
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<Map> 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 中的代码进行说明。
以上是 springsecurityoauth2实战(仿微博第三方登录) 的全部内容, 来源链接: utcz.com/z/516448.html