Spring Security 5.5发布,正式实装OAuth2.0的第五种授权模式
The following article is from 码农小胖哥 Author 请关注星标
今天Spring Security 5.5发布了,主要涉及OAuth2.0和SAML2.0两个协议。其中最大的亮点是支持了OAuth2.0的另一种授权模式jwt-bearer
。这个模式可能对大家比较陌生,说实话胖哥也没在实际开发中玩过这种模式,不过它并不是刚出的规范,这是2015年5月起草的RFC7523的一部分,如今正式实装到Spring Security中,今天就和大家一起学习一下这个规范。
JWT Bearer 授权模式
通常出现在各大技术社区的OAuth2.0有四大授权模式:
授权码模式 grant_type=authorization_code
。隐藏模式 response_type=token
。密码模式 grant_type=password
。凭据模式 grant_type=client_credentials
。
其实这几种模式中都会用到Bearer Token
,甚至Token
直接选用JWT技术。那么它作为一种授权模式是如何定义的呢?
JWT Bearer 授权
首先jwt-bearer
认证请求也要携带grant_type
参数来表明使用的授权模式:
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer
这个grant_type
有点长!还要携带assertion
参数,这个参数对应的值只能是一个JWT
,另外也可以携带(可选)scope
参数以表明请求的作用域。根据上面的描述,一个jwt-bearer
类型的授权模式大致是这样的:
POST /token/oauth2 HTTP/1.1
Host: felord.cn
Content-Type: application/x-www-form-urlencoded
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiJhbGwiLCJhdWQiOiJGZWxvcmRjbiIsInJv.
ER2U4CAt1xYxXBmnVQsrirkMwPwxwjWxjs
其实也就是说用户如果要请求授权要先有一个JWT
,我个人估计有可能是可以被授权服务器信任的第三方JWT
凭据,凭据校验通过用户就可以得到相应的授权去访问特定的资源。
客户端身份认证
RFC7523还规定JWT Bearer还可以用于客户端身份验证。客户端携带一个client_assertion_type
参数:
client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
同Beaerer JWT授权类似,还要携带一个client_assertion
参数,这个参数同样要带一个JWT
。请求实例如下:
POST /token/oauth2 HTTP/1.1
Host: felord.cn
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&
code=n0esc3NRze7LTCu7iYzS6a5acc3f0ogp4&
client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3A
client-assertion-type%3Ajwt-bearer&
client_assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiJhbGwiLCJhdWQiOiJGZWxvcmRjbiIsInJv.
ER2U4CAt1xYxXBmnVQsrirkMwPwxwjWxjs
场景
那么场景是什么?根据RFC723的描述,该模式用于当客户端希望利用一个现有的、可信任的、使用JWT语义表达的关系来获取Access Token
,它不需要在授权服务器上直接进行用户批准(User Approval)步骤。
另外jwt-bearer
也被定义用于客户端身份验证机制,来判断客户端的身份是否合规。客户端使用JWT
进行身份认证和客户端使用JWT
进行授权是分离的行为。当然这两种行为可以组合使用,也可以分离使用。客户端使用JWT
进行身份验证仅是客户端向令牌端点进行身份验证一种替代方法。
❝
个人感觉就是方便在已经有JWT体系上使用OAuth2.0协议。
总结
今天主要对jwt-bearer
授权模式的协议进行了分享,和其它模式比较起来jwt-bearer
还很新,虽然目前还没有大规模运用,不过目前我在国外的技术社区已经发现了很多关于这种模式的问题和讨论,看来这个模式还是有点东西的,需要留意一下。好了今天的分享就到这里,更多前沿技术资讯请关注:码农小胖哥,多多点赞、转发、再看。
推荐关注本文作者:码农小胖哥
分享高质量编程知识,探讨IT人生
技术干货,实战技巧,面试技巧,前沿资讯一个都不能少
往期推荐