【Oauth2】五、登陆认证过滤器OAuth2LoginAuthenticationFilter

一、OAuth2LoginAuthenticationFilter

当gitee收到OAuth2授权请求后,会向浏览器发出302重定向到redirect_uri的响应。由于默认情况下回调的路径满足/login/oauth2/code/*,该路径会被OAuth2LoginAuthenticationFilter登录认证过滤器拦截处理。

二、OAuth2LoginAuthenticationFilter的结构

在这里插入图片描述

1、 DEFAULT_FILTER_PROCESSES_URI = “/login/oauth2/code/*”;

默认拦截路径

2、 ClientRegistrationRepository

客户端信息

3、OAuth2AuthorizedClientRepository ;

OAuth2 授权客户端存储库

4、AuthorizationRequestRepository authorizationRequestRepository

从http中操作授权的OAuth2 客户端

5、 Converter<OAuth2LoginAuthenticationToken, OAuth2AuthenticationToken> authenticationResultConverter

token转换器

三、OAuth2登录认证逻辑

OAuth2LoginAuthenticationFilter的核心都在attemptAuthentication
方法中。主要执行了以下逻辑:

  1. 校验逻辑
  • 校验是否是授权请求的响应。
  • 校验当前授权请求的是否真实存在,防止伪造。
  • 校验当前授权请求的OAuth2客户端是否合规。
  1. 组装OAuth2LoginAuthenticationToken并交给OAuth2LoginAuthenticationProvider处理认证
  2. 认证过的OAuth2LoginAuthenticationToken通过authenticationResultConverter函数转换为OAuth2AuthenticationToken
  3. 初始化已认证OAuth2客户端对象OAuth2AuthorizedClient并持久化
  4. 将步骤③生成的OAuth2AuthenticationToken返回
    在这里插入图片描述
    在这里插入图片描述

四、OAuth2LoginAuthenticationProvider

1、springsecurity的认证体系

在这里插入图片描述

2 、AuthenticationProvider

spring中默认支持17中的认证方式
在这里插入图片描述

3、OAuth2LoginAuthenticationToken对应的AuthenticationProvider

  • OAuth2LoginAuthenticationProvider,用于普通OAuth2登录认证。
  • OidcAuthorizationCodeAuthenticationProvider,用于OIDC认证。
    在这里插入图片描述

4、OAuth2LoginAuthenticationProvider

OAuth2LoginAuthenticationProvider负责使用授权服务器的令牌端点(token-uri)对授权代码凭证进行身份验证,如果认证有效,则将其交换为访问令牌凭证OAuth2AccessToken。
它还将使用OAuth2UserService从用户信息端点(user-info-uri)获取最终用户(资源所有者)的用户信息,用户信息以OAuth2User的形式创建一个Principal 。然后将OAuth2User关联到OAuth2LoginAuthenticationToken以完成身份验证。流程图如下:
在这里插入图片描述
从上面的描述和流程图中可以以下总结两个重点:

五、OAuth2AuthorizationCodeAuthenticationProvider

OAuth2LoginAuthenticationProvider里面还套了个OAuth2AuthorizationCodeAuthenticationProvider。它负责使用授权服务器的令牌端点对授权代码凭证进行身份验证。

  • 验证授权码
    首先从OAuth2AuthorizationCodeAuthenticationToken中的OAuth2AuthorizationExchange提取OAuth2AuthorizationResponse,判断是否是OAuth2异常响应。

如果不是,再和授权请求对象OAuth2AuthorizationRequest中的state值作一致性比较,一次OAuth2授权请求前后state必须保持一致。

  • 获取OAuth2AccessToken
    然后通过OAuth2AccessTokenResponseClient,底层用的是RestTemplate,按照OAuth2的token-uri封装就行了。后面的微信OAuth2网页授权中我们会定制该接口。

  • 获取OAuth2User
    拿到OAuth2AccessToken后跳回OAuth2LoginAuthenticationProvider。有了token自然能去调用个人信息接口user-info-uri了,Spring Security将这一流程抽象为OAuth2UserService接口:‘
    在这里插入图片描述

这个接口很多时候底层也是通过RestTemplate实现的。而且在实际开发中OAuth2UserService大概率要自定义,同样在后面的微信OAuth2网页授权中我们会定制该接口。
额外的逻辑
OAuth2LoginAuthenticationProvider到这里就执行完了,后面处理的都是AbstractAuthenticationProcessingFilter的逻辑,和Form Login的逻辑流程一致=需要着重强调的是已认证OAuth2客户端对象会被存储起来,当前已认证的OAuth2AuthenticationToken会被存进安全上下文SecurityContext中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!关于微信登录的OAuth2认证流程,我可以帮您介绍一下。首先,您需要在微信开放平台上创建一个应用,并获取应用的AppID和AppSecret。然后,您可以按照以下步骤进行微信登录的认证流程: 1. 在您的登录页面上显示微信登录按钮,让用户点击该按钮进行微信登录。 2. 当用户点击微信登录按钮后,将会跳转至微信授权页面。您需要将用户授权跳转链接设置为如下格式: ``` https://open.weixin.qq.com/connect/qrconnect?appid={appid}&redirect_uri={redirect_uri}&response_type=code&scope=snsapi_login&state={state}#wechat_redirect ``` 其中,{appid}是您的应用AppID,{redirect_uri}是用户授权完成后的回调地址,{state}是您自定义的参数,用于校验请求的合法性。 3. 用户在微信授权页面进行登录,并确认授权。 4. 微信服务器会将授权码(code)返回给您的回调地址,您需要在回调页面中获取该授权码。 5. 使用授权码向微信服务器发送请求,获取访问令牌(access_token)和用户唯一标识(openid)。请求示例如下: ``` https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code ``` 其中,{appid}是您的应用AppID,{secret}是您的应用AppSecret,{code}是获取到的授权码。 6. 微信服务器会返回访问令牌和用户唯一标识等信息。 7. 您可以使用访问令牌和用户唯一标识来调用微信开放平台的其他接口,获取用户信息或进行其他操作。 以上就是使用OAuth2进行微信登录认证的基本流程。希望对您有所帮助!如有任何疑问,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值