Spring Security 实战干货:OAuth2授权回调的核心认证流程

公众号程序猿DD

共 1928字,需浏览 4分钟

 ·

2020-12-16 23:23

1. 前言

我们在上一篇 Spring Security 实战干货:OAuth2 授权回调的处理机制 对 OAuth2 服务端调用客户端回调的流程进行了图解, 今天我们来深入了解 OAuth2 在回调中进行认证细节。

2. AuthenticationManager

当 Spring Security 拦截到回调接口后会封装一个OAuth2LoginAuthenticationToken交给AuthenticationManager进行认证。在之前 Spring Security 实战干货:理解 AuthenticationManager 一文中我们正好对AuthenticationManager的机制有详细的讲解,所以要快速理解本文应该去看看这一篇。

其中登录认证凭据封装为UsernamePasswordAuthenticationToken 然后根据 Token 的类型找到对应的AuthenticationProvider进行认证。

3. OAuth2 对应的 AuthenticationProvider

那么 OAuth2 登录有异曲同工之妙,我们需要找到OAuth2LoginAuthenticationToken对应的AuthenticationProvider。这里找到了两个:

  • OAuth2LoginAuthenticationProvider
  • OidcAuthorizationCodeAuthenticationProvider

这两个各自对应的场景是什么呢,OAuth2LoginAuthenticationToken中有以下片段:

if (loginAuthenticationToken.getAuthorizationExchange()
   .getAuthorizationRequest().getScopes().contains("openid")) {
   // This is an OpenID Connect Authentication Request so return null
   // and let OidcAuthorizationCodeAuthenticationProvider handle it instead
   return null;
}

意思是说scopes中如果包含了openid就直接返回null,不会被OAuth2LoginAuthenticationToken处理,而OidcAuthorizationCodeAuthenticationProvider中正好相反。根据以往文章的脉络OAuth2LoginAuthenticationProvider就是我们需要的。

有兴趣可了解基于OIDC的 OAuth2 认证。

4. OAuth2LoginAuthenticationProvider

OAuth2LoginAuthenticationProvider实现了授权回调的认证过程:

OAuth2LoginAuthenticationProvider 认证流程

从上图中我们可以看出具体认证由OAuth2AuthorizationCodeAuthenticationProvider来负责,认证通过后会去获取用户的信息并封装为OAuth2User,最终生成授权成功的OAuth2LoginAuthenticationToken

基于篇幅的原因,下一篇我们会分析OAuth2AuthorizationCodeAuthenticationProvider的处理机制。系列博文请访问felord.cn


推荐关注本文作者:码农小胖哥

一个坚持分享原创干货的Java开发者



【往期推荐】

超卖 100 瓶茅台的事故分析

2020-12-15

重磅!GitHub 全部源代码被泄露?

2020-12-15

这本空降京东当当新书榜TOP1的“算法小抄”是什么来头?

2020-12-14

Redis 的 8 大数据类型,写得非常好!

2020-12-14

Spring Boot 的2020最后一击:2.4.1、2.3.7、2.2.12 发布

2020-12-13

排名前 16 的 Java 工具类,哪个你没用过?

2020-12-13


深度内容

推荐加入


欢迎加入知识星球,一起探讨技术架构,交流技术人生。
加入方式,长按下方二维码:
已在知识星球更新如下:

素质二连,走一个


浏览 8
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报