在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2AuthorizationRequestRedirectFilter,并找到了真正发起OAuth2授权请求的方法sendRedirectForAuthorization。但是这个方法并没有细说,所以今天接着上一篇把这个坑给补上。
2. sendRedirectForAuthorization
这个sendRedirectForAuthorization方法没多少代码,它的主要作用就是向第三方平台进行授权重定向访问。它所有的逻辑都和OAuth2AuthorizationRequest有关,因此我们对OAuth2AuthorizationRequest进行轻描淡写是不行的,我们必须掌握OAuth2AuthorizationRequest是怎么来的,干嘛用的。
OAuth2AuthorizationRequestResolver
这就需要去分析解析类OAuth2AuthorizationRequestResolver,其核心方法有两个重载,这里分析一个就够了。
- @Override
- public OAuth2AuthorizationRequest resolve(HttpServletRequest request) {
- // registrationId是通过uri路径参数/oauth2/authorization/{registrationId}获得的
- String registrationId = this.resolveRegistrationId(request);
- // 然后去请求对象request中提取key为action的参数,默认值是login
- String redirectUriAction = getAction(request, "login");
- // 然后进入根本的解析方法
- return resolve(request, registrationId, redirectUriAction);
- }
- 复制代码
上面方法里面的resolve(request, registrationId, redirectUriAction)方法才是最终从/oauth2/authorization提取OAuth2AuthorizationRequest的根本方法。代码太多但是我尽量通俗易懂的来进行图解。resolve方法会根据不同的授权方式(AuthorizationGrantType)来组装不同的OAuth2AuthorizationRequest。
3. OAuth2AuthorizationRequest
接下来就是OAuth2.0协议的核心重中之重了,可能以后你定制化的参考就来自这里,这是圈起来要考的知识点。我会对OAuth2AuthorizationRequestResolver在各种授权方式下的OAuth2AuthorizationRequest对象的解析进行一个完全的总结归纳。大致分为以下两部分:
3.1 由AuthorizationGrantType决定的
在不同AuthorizationGrantType下对OAuth2AuthorizationRequest的梳理。涉及到的成员变量有:
其中类似{registrationId} 的形式表示 {registrationId}是一个变量,例如 registrationId=gitee。
在OAuth2客户端配置spring.security.client.registration.{registrationId}的前缀中有以下五种情况。
当 scope 不包含openid而且client-authentication-method不为none时上述四个参数:
- {
- "authorizationGrantType": "authorization_code",
- "responseType": "code",
- "additionalParameters": {},
- "attributes": {
- "registration_id": "{registrationId}"
- }
- }
- 复制代码
当 scope 包含openid而且client-authentication-method不为none时上述四个参数:
- {
- "authorizationGrantType": "authorization_code",
- "responseType": "code",
- "additionalParameters": {
- "nonce": "{nonce}的Hash值"
- },
- "attributes": {
- "registration_id": "{registrationId}",
- "nonce": "{nonce}"
- }
- }
当 scope不包含openid而且client-authentication-method为none时上述四个参数:
- {
- "authorizationGrantType": "authorization_code",
- "responseType": "code",
- "additionalParameters": {
- "code_challenge": "{codeVerifier}的Hash值",
- // code_challenge_method 当不是SHA256可能没有该key
- "code_challenge_method": "S256(如果是SHA256算法的话)"
- },
- "attributes": {
- "registration_id": "{registrationId}",
- "code_verifier": "Base64生成的安全{codeVerifier}"
- }
- }
当 scope包含openid而且client-authentication-method为none时上述四个参数:
- {
- "authorizationGrantType": "authorization_code",
- "responseType": "code",
- "additionalParameters": {
- "code_challenge": "{codeVerifier}的Hash值",
- // code_challenge_method 当不是SHA256可能没有该key
- "code_challenge_method": "S256(如果是SHA256算法的话)",
- "nonce": "{nonce}的Hash值"
- },
- "attributes": {
- "registration_id": "{registrationId}",
- "code_verifier": "Base64生成的安全{codeVerifier}",
- "nonce": "{nonce}"
- }
- }
implicit下要简单的多:
- {
- "authorizationGrantType": "implicit",
- "responseType": "token",
- "attributes": {}
- }
3.2 固定规则部分
上面是各种不同AuthorizationGrantType下的OAuth2AuthorizationRequest的成员变量个性化取值策略, 还有几个参数的规则是固定的:
authorizationRequestUri的构建机制
如果不显式提供authorizationRequestUri就会通过OAuth2AuthorizationRequest中的
按照下面的规则进行拼接成authorizationUri的参数串,参数串的key和value都要进行URI编码。
- authorizationUri?response_type={responseType.getValue()}&client_id={clientId}&scope={scopes元素一个字符间隔}&state={state}&redirect_uri={redirectUri}&{additionalParameter展开进行同样规则的KV参数串}
然后OAuth2AuthorizationRequestRedirectFilter负责重定向到authorizationRequestUri向第三方请求授权。
redirectUri
第三方收到响应会调用redirectUri,回调也是有一定默认规则的,它遵循{baseUrl}/{action}/oauth2/code/{registrationId}的路径参数规则。
4. 总结
通过对OAuth2AuthorizationRequest请求对象的规则进行详细分析,我们应该能大致的知道的过滤器OAuth2AuthorizationRequestRedirectFilter流程:
那么Spring Security OAuth2如何对第三方的回调相应进行处理呢?关注:码农小胖哥 为你揭晓这个答案。
一、正则表达式概述 二、正则表达式在VBScript中的应用 三、正则表达式在VavaScr...
计算属性computed: 支持缓存,只有依赖数据发生改变,才会重新进行计算 不支持...
前言 相信大家都知道在IDE中代码的智能提示几乎都是标配,虽然一些文本编辑器也...
微信文件传输助手是微信电脑版与手机微信之间相互传输图片等文件的好工具,但很...
本文将研究 ES6 的 for ... of 循环。 旧方法 在过去,有两种方法可以遍历 javas...
ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可...
歌词编辑器 歌词编辑器 第一步:选择要播放的歌曲并播放 第二步:填写全部的歌词...
【排序算法】之lowb三人组冒泡、插入、选择 什么是lowb三人组 冒泡排序bubble so...
vbs:把一段文字中指定字符颜色变成红色的正则 functionc(Tstr,Word) Dimre Setre...
一石激起千层浪,继中国区浩浩荡荡的大裁员告一段落之后,甲骨文并未因此收起手...