oauth2 java 客户端_Spring Security 实战干货:客户端OAuth2授权请求的入口

正版spring security实战编程与

54.9元

(需用券)

去购买 >

a558c348652cbcf13105633fc3598b19.png

f5b9560975c9f4b9ac40cefb80ea1fa9.png

1. 前言

在Spring Security 实战干货:OAuth2第三方授权初体验一文中我先对OAuth2.0涉及的一些常用概念进行介绍,然后直接通过一个DEMO来让大家切身感受了OAuth2.0第三方授权功能。今天我们来一步一步分析这其中的机制。

2. 抓住源头

http://localhost:8082/oauth2/authorization/gitee

上面这个请求URL是我们在上一篇文章中提到的客户端进行第三方认证操作的起点,默认格式为{baseUrl}/oauth2/authorization/{clientRegistrationId},其中clientRegistrationId代表着一个第三方标识,可以是微信、支付宝等开放平台,这里为gitee。用户点击了这个请求后就开始了授权之旅。假如大家都是从零开始的小白,肯定是要从这个入口来一步一步探寻其中的机制的。Spring Security一定是拦截到了/oauth2/authorization后才启用了OAuth2相关的处理逻辑。那就去抓住这个源头!从源码中搜索嘛!IDEA 快捷键CTRL SHIFT R 就可以全局搜索结果了。

f5be0640585b97b5c03d116e737aafc9.png

不出所料找到了三个地方,记下来一个一个看!

OAuth2AuthorizationRequestRedirectWebFilter

先来看第一个OAuth2AuthorizationRequestRedirectWebFilter,它实现了Spring Webflux的WebFilter接口,这显然是Webflux的东西,如果你用到Webflux的话这个会有用,但是不是现在我们用的。

DefaultOAuth2AuthorizationRequestResolver

第二个是干嘛的呢,从名称上看着是一个默认OAuth2授权请求解析器。有时候名称起的好就知道这个东西大致上干嘛的,不得不说优秀框架细节抓的很好。它实现了接口OAuth2AuthorizationRequestResolver:

public interface OAuth2AuthorizationRequestResolver {

/**

* 从HttpServletRequest对象中解析封装 OAuth2AuthorizationRequest

*/

OAuth2AuthorizationRequest resolve(HttpServletRequest request);

/**

* 从HttpServletRequest对象以及clientRegistrationId中解析封装 OAuth2AuthorizationRequest

*/

OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId);

}

也就是说当我们请求/oauth2/authorization时,DefaultOAuth2AuthorizationRequestResolver 会从/oauth2/authorization对应的HttpServletRequest中提取数据封装到OAuth2AuthorizationRequest请求对象中做进一步使用。

注意:/oauth2/authorization这个默认拦截标识也是可以自定义的。

OAuth2AuthorizationRequest

这里简单提一下OAuth2AuthorizationRequest 封装了我们上一文所描述的一些OAuth2相关概念参数,后续这个请求类我们会用到它。

public final class OAuth2AuthorizationRequest implements Serializable {

private static final long serialVersionUID = 520L;

private String authorizationUri;

private AuthorizationGrantType authorizationGrantType;

private OAuth2AuthorizationResponseType responseType;

private String clientId;

private String redirectUri;

private Set scopes;

private String state;

private Map additionalParameters;

private String authorizationRequestUri;

private Map attributes;

// 其它方法略

}

OAuth2AuthorizationRequestRedirectFilter

就剩下这个线索了,一看到它继承了OncePerRequestFilter我就知道肯定是他了。甚至它的成员变量包含了用来解析OAuth2请求的OAuth2AuthorizationRequestResolver。到这里我们的路子就走对了,开始分析这个过滤器,下面是其核心过滤逻辑,这就是我们想要知道的OAuth2授权请求是如何被拦截处理的逻辑。

protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)

throws ServletException, IOException {

try {

OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestResolver.resolve(request);

if (authorizationRequest != null) {

this.sendRedirectForAuthorization(request, response, authorizationRequest);

return;

}

} catch (Exception failed) {

this.unsuccessfulRedirectForAuthorization(request, response, failed);

return;

}

try {

filterChain.doFilter(request, response);

} catch (IOException ex) {

throw ex;

} catch (Exception ex) {

// Check to see if we need to handle ClientAuthorizationRequiredException

Throwable[] causeChain = this.throwableAnalyzer.determineCauseChain(ex);

ClientAuthorizationRequiredException authzEx = (ClientAuthorizationRequiredException) this.throwableAnalyzer

.getFirstThrowableOfType(ClientAuthorizationRequiredException.class, causeChain);

if (authzEx != null) {

try {

OAuth2AuthorizationRequest authorizationRequest = this.authorizationRequestResolver.resolve(request, authzEx.getClientRegistrationId());

if (authorizationRequest == null) {

throw authzEx;

}

this.sendRedirectForAuthorization(request, response, authorizationRequest);

this.requestCache.saveRequest(request, response);

} catch (Exception failed) {

this.unsuccessfulRedirectForAuthorization(request, response, failed);

}

return;

}

if (ex instanceof ServletException) {

throw (ServletException) ex;

} else if (ex instanceof RuntimeException) {

throw (RuntimeException) ex;

} else {

throw new RuntimeException(ex);

}

}

}

doFilterInternal对应的流程如下:

fb2ed7db58518cacd34f3817a438de5d.png

根据这个流程,如果要搞清楚Spring Security OAuth2是如何重定向到第三方的话就要深入研究sendRedirectForAuthorization方法,基于篇幅原因我会在下一篇进行分析。

3. 总结

今天我们从源头一步一步找到OAuth2授权的处理入口,并初步分析了几个关键组件的作用以及核心拦截器的拦截逻辑。后续我们将层层深入循序渐进地搞清楚其运作流程,不要走开,锁定:码农小胖哥 循序渐进学习Spring Security OAuth2 。

关注公众号:Felordcn 获取更多资讯

个人博客:https://felord.cn

java 11官方入门(第8版)教材

79.84元

包邮

(需用券)

去购买 >

f0f3f55624fb396b1764d42d6df88864.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值