5 客户端认证 OAuth2ClientAuthenticationFilter

客户端认证

https://openid.net/specs/openid-connect-core-1_0.html#ClientAuthentication
https://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml#token-endpoint-auth-method

当访问 OAuth2 相关接口时(/oauth2/token/oauth2/introspect/oauth2/revoke),授权服务器需要进行客户端认证
Spring Authorization Server 截至目前支持如下五种客户端认证方式:client_secret_basicclient_secret_postclient_secret_jwtprivate_key_jwtnone (针对公共客户端)
在这里插入图片描述

OAuth2ClientAuthenticationFilter

实现客户端认证的拦截器就是 OAuth2ClientAuthenticationFilter 其核心代码如下:
在这里插入图片描述
其核心逻辑就是通过 authenticationConverterrequest 中解析出客户端认证信息,构建成 Authentication,再通过 authenticationManagerAuthentication 进行认证。
不同的解析方式实际上就代表不同的认证方式(传参不同)。

DelegatingAuthenticationConverter

在这里插入图片描述
authenticationConverter 的类型实际上是 DelegatingAuthenticationConverter,它持有一个 AuthenticationConverter 列表(不同的认证请求,其参数不同,所以会有不同的AuthenticationConverter实现类)。
DelegatingAuthenticationConverter 在解析请求时会遍历 AuthenticationConverter 列表,当某个 AuthenticationConverter 解析成功时,立即返回,这也能确定此请求是什么认证方式,后续再执行对应的认证逻辑。

ProviderManager

authenticationManager 的类型实际上是 ProviderManager,它持有一个 AuthenticationProvider 列表(不同的认证方式,其认证逻辑不同,所以会有不同的AuthenticationProvider实现类)。
ProviderManager 在执行认证时会遍历 AuthenticationProvider 列表,当某个 AuthenticationProvider 认证成功时,立马返回。

  • 往 ProviderManager 中添加 AuthenticationProvider 的核心代码如下:(被框架封装了一层,显得不是很直观)
    OAuth2ClientAuthenticationConfigurer#createDefaultAuthenticationProviders

小结

每种客户端认证方式实际就是一个 AuthenticationConverter 搭配一个 AuthenticationProvider 组合而成,一个负责解析请求参数,一个负责处理请求参数,执行认证逻辑!

题外话:上面说的这个实现模式,实际上是参照了 Spring Security 中用户认证的实现方式。毕竟 SAS 是基于 Spring Security 实现的。
在用户认证中,UsernamePasswordAuthenticationFilter 是直接将 request 解析成 UsernamePasswordAuthenticationToken,再交给 authenticationManager 进行认证(真正作用的是 DaoAuthenticationProvider)。
而 OAuth2ClientAuthenticationFilter 相当于做了更灵活的处理,支持多种解析方式和认证策略。
这也给我们一个启发,当我们需要做用户认证方式扩展时(比如增加个手机号登录),实际上也可以参照这种方式。

客户端认证方式

client_secret_basic

将 clientId 和 clientSecret 通过 ‘:’ 号拼接,并使用 Base64 进行编码得到一个字符串。将此编码字符串放到请求头(Authorization)去请求授权服务器接口。授权服务器会通过 client_secret 进行验证。

  • 传参:(请求头)
    Authorization: Basic {Base64.encode(client_id:client_secret)}

  • 核心类:
    ClientSecretBasicAuthenticationConverter
    ClientSecretAuthenticationProvider

client_secret_post

将 clientId 和 clientSecret 放到请求体(表单)中去请求授权服务器接口。授权服务器会通过 client_secret 进行验证。

  • 传参:(表单)
    client_id
    client_secret

  • 核心类:
    ClientSecretPostAuthenticationConverter
    ClientSecretAuthenticationProvider

client_secret_jwt

客户端使用 client_secret 通过 HMAC 算法生成 jwt,调用 授权服务器接口。授权服务器会通过 HMAC 算法验证 jwt。

  • 传参:
    client_id
    client_assertion_type:固定值 urn:ietf:params:oauth:client-assertion-type:jwt-bearer
    client_assertion:client生成的jwt,详见 authorization-server-clientauth.ClientJwtTest

  • 核心类:
    JwtClientAssertionAuthenticationConverter
    JwtClientAssertionAuthenticationProvider

private_key_jwt

客户端自己维护密钥对,使用私钥生成 jwt,并将公钥暴露给 授权服务器。授权服务器通过客户端的公钥验证 jwt。

  • 传参:
    client_assertion_type 固定值 urn:ietf:params:oauth:client-assertion-type:jwt-bearer
    client_assertion client生成的jwt,详见 private_key_jwt_client.ClientJwtTest

  • 核心类:
    JwtClientAssertionAuthenticationConverter
    JwtClientAssertionAuthenticationProvider

none

PKCE(Proof Key for Code Exchange) 流程
公共客户端没有后端,所以授权成功后会携带code到前端,利用code就能获取token(即使有secret也是存在前端),这样code一旦泄露就能获取到token,很容易被盗用。
所以,公共客户端在每次获取授权时随机生成一个密文一起发给授权服务器,授权服务器缓存起来,
当公共客户端利用code获取token时需要携带密文对应的明文,授权服务器会计算明文,比对是否和原先的密文相同。相同则发放token。这样就避免了code被盗用。

  • 访问授权页传参(授权码流程):
    code_challenge client生成的密文,详见 authorization-server-clientauth.ClientPkceTest
    code_challenge_method 固定值 S256

  • 获取Token时传参:
    code_verifier 明文
    client_id

  • 核心类:
    PublicClientAuthenticationConverter
    PublicClientAuthenticationProvider

小结

上文只是从大方向上介绍了客户端认证的不同方式,不同认证方式的实现以及细节各不相同,后续我打算结合一些具体示例来讲解,进而深入到源码进行分析。敬请期待。


end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/27151.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

outlook突然变得很慢很卡

​outlook之前用的好好的,突然有一天变得很卡,特别是在上传附件后。 可能原因:没有勾选使用缓存Exchange模式,导致没有生成本地的同步ost文件,而是直接从服务器存取数据。 对应解决办法:到账户设置里&#…

学术海报Poster-- 模板分享

学术海报Poster-- 模板分享 0、引言1、下载地址百度网盘链接地址CSDN托管 2、模板样例 ⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟 🌈更多学习内容…

世界杯球队分析

文章目录 1. 本文思路2.数据介绍2.1 results.csv数据集2.2 shootouts.csv数据集 3. 数据分析3.1 多维度分析3.2 数据分析案例3.2.1 导入模块3.2.2 导入数据1.遍历目录2.读取数据 3.2.3 查看描述数据1.查看数据2. 获取所有世界杯比赛的数据3. 查看包含FIFA的类型4. 获取世界杯数…

NBA比赛数据分析与预测

我的任务利用13到16年的NBA比赛统计数据,去预测17年的每场NBA比赛。数据是从http://www.basketball-reference.com/这个网站获得的。前期参考了https://www.shiyanlou.com/courses/782/labs/2647/document这里的分析与实现方法。这个实验楼里实现用了LogisticRegres…

使用python爬取足球比赛数据,关于足球预测策略模型,这是我见过唯一三年都盈利的

市场上有很多基于程序自动化的足球预测模型,我本人也不断摸索,自学python,最终实现了程序预测的自动化,并且验证了很多策略,几乎所有的模型都是阶段性表现很不错,但是长期总体下来,都达不到预期…

大数据+NCAA=?球迷情绪预测体育赛事结果

点击上方蓝字关注我们 每年三月,有一项赛事将吸引全世界篮球迷的眼光,那就是全国大学篮球联赛(NCAA)的“疯狂三月”。 “疯狂三月”指的是NCAA男子甲组(Division 1)篮球锦标赛,赛程从3月中旬持…

生成模型的2022年——人工智能AIGC顶级论文回顾

2022年是生成模型奇幻发展的一年,Stable Diffusion🎨创造了超现实主义的艺术, ChatGPT 💬回答了生命意义的问题,Make a Video🎥从文本生成了栩栩如生的马儿,DreamFusion✨生成了不可思议的三维模…

大语言模型

前言: Open AI推出Chat GPT后,风靡全球。AI的强大表现让人折服,带来的商业效应已经逐渐扩散开来。随着人工智能越来越强,未来人们的生活受到影响也会越来越广泛。 继 OpenAI 推出 ChatGPT 后,微软迅速上线基于 GPT 模型…

OpenAI 利用基于“一致性”的图像生成器超越扩散模型

图像生成领域发展迅速。 尽管 Midjourney 和 Stable Diffusion 等流行工具使用的扩散模型可能看起来是我们所拥有的最好的,但下一个东西总是会出现——OpenAI 可能会用“一致性模型”来解决它,它已经可以完成简单的任务和 数量级比 DALL-E 之类的快。 该…

扩散模型和Transformer梦幻联动!替换U-Net,一举拿下新SOTA!

点击下方卡片,关注“CVer”公众号 AI/CV重磅干货,第一时间送达 点击进入—>扩散模型微信技术交流群 转载自:量子位 “U-Net已死,Transformer成为扩散模型新SOTA了!” 就在ChatGPT占尽AI圈风头时,纽约大学…

扩散模型diffusion model用于图像恢复任务详细原理 (去雨,去雾等皆可),附实现代码

文章目录 1. 去噪扩散概率模型2. 前向扩散3. 反向采样3. 图像条件扩散模型4. 可以考虑改进的点5. 实现代码 话不多说,先上代码: 扩散模型diffusion model用于图像恢复完整可运行代码,附详细实验操作流程 令外一篇简化超分扩散模型SR3来实现图…

0基础学习diffusion_model扩散模型【易理解的公式推导】Denoising Diffusion Probabilistic Models

0基础学习diffusion_model扩散模型【易理解的公式推导】 一、概述二、扩散过程(已知X0求Xt)三、逆扩散过程(已知Xt求Xt-1)1。算法流程图四、结论五、损失函数六、心得体会(优缺点分析)一、概述 DDPM论文链接: Jonathan Ho_Denoising Diffusion Probabilistic Models(NeurIPS…

07.04.2023 日语笔记

貰『もら』える(可以……吗?) コーヒーをテイクアウトでもらえますか。(可以打包咖啡吗?) マグカップで、飲み物をもらえますか。(可以自带杯子吗?) マグカップ&#x…

红蓝宝书1000题 新日本语能力考试N1文字.词汇.文法 练习+详解

红蓝宝书1000题 新日本语能力考试N1文字.词汇.文法 练习详解pdf百度云免费下载 本书是继《新版中日交流标准日本语》初、中级后,由人民教育出版社与日本光村图书出版株式会社通力合作、精心编写的一套日语自学读本。 本书由知名的日本语学、汉学以及日语教育界的学者执笔,充分…

apple watch可以使用第三方表盘了,Apple Watch 更换第三方表盘需求

apple watch可以使用第三方表盘了,Apple Watch 更换第三方表盘需求 对于 Apple Watch 用户来说,表盘的选择太少而且过于单调。那么,自带的表盘看腻了如何更换第三方表盘呢? 前几代apple watch无法使用新表盘,想要实现更…

Applewatch6/ Applese价格曝光 苹果最新款手表参数区别对比

价格方面,Apple Watch Series 6GPS 版 3199 元起售,蜂窝网络版 3999 元起售。Apple Watch SE GPS 版 2199 元起售,蜂窝网络版 2499 元起售。 Apple Watch Series 6 新品活动 优惠空前机会不容错过 https://www.apple.com.cn/6 Apple Watch Se…

苹果手表计算机功能键,Apple Watch上的2个按键是这么玩的

原标题:Apple Watch上的2个按键是这么玩的 点评:苹果不说,但是你要知道的用法。 Apple Watch是苹果全新的产品,代表了苹果全新的设计理念,如此一来,操作和交互方式就与手机自然也有所不同。结果有的小伙伴把…

如何设置并将你的iWatch和iPhone配对

如何设置并将你的iWatch和iPhone配对 一旦你买到一个iWatch,拿回家并拆封,下面教你如何设置。 iWatch是这样一个装置,它被设计出来和你的iPhone一起使用。它可以说是一个iPhone配件,它们的关系非常亲密。这也是为什么设置iWatch感…

Apple Watch发售在即 苹果门店大变脸

本周五,苹果公司将正式发售人气如虹的智能手表Apple Watch,有意购买者将有机会尝试不同尺寸、表带款式和设定,并在4月24日正式铺货前先行预订。 苹果零售业务主管安吉拉阿伦茨(Angela Ahrendts)一直在和首席设计师乔尼…

android+wear+和iphone,Android Wear手表兼容iPhone:和苹果抢用户

原标题:Android Wear手表兼容iPhone:和苹果抢用户 北京时间9月1日早间消息,不愿使用Apple Watch智能手表的用户现在有了新选择:Android Wear设备。 Android Wear首席产品经理杰夫常(Jeff Chang)表示,Android Wear将通过…