SpringSecurity中WebSecurity和HttpSecurity的关系-SpringSecurity5.5正式实装OAuth2.0的第五种授权模式-《Java笔记》

admin 2025-10-19 04:35:24 编程 来源:ZONE.CI 全球网 0 阅读模式

Java Spring Spring Security OAuth2.0Spring 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参数来表明使用的授权模式:

  1. grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer

这个grant_type有点长!还要携带assertion参数,这个参数对应的值只能是一个JWT,另外也可以携带(可选)scope参数以表明请求的作用域。根据上面的描述,一个jwt-bearer类型的授权模式大致是这样的:

  1. POST /token/oauth2 HTTP/1.1
  2. Host: fcant.cn
  3. Content-Type: application/x-www-form-urlencoded
  4. grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
  5. &assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
  6. eyJzdWIiOiJhbGwiLCJhdWQiOiJGZWxvcmRjbiIsInJv.
  7. ER2U4CAt1xYxXBmnVQsrirkMwPwxwjWxjs

其实也就是说用户如果要请求授权要先有一个JWT,是可以被授权服务器信任的第三方JWT凭据,凭据校验通过用户就可以得到相应的授权去访问特定的资源。

客户端身份认证

RFC7523还规定JWT Bearer还可以用于客户端身份验证。客户端携带一个client_assertion_type参数:

  1. client_assertion_type=urnietfparamsoauthclient-assertion-typejwt-bearer

同Beaerer JWT授权类似,还要携带一个client_assertion参数,这个参数同样要带一个JWT。请求实例如下:

  1. POST /token/oauth2 HTTP/1.1
  2. Host: fcant.cn
  3. Content-Type: application/x-www-form-urlencoded
  4. grant_type=authorization_code&
  5. code=n0esc3NRze7LTCu7iYzS6a5acc3f0ogp4&
  6. client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3A
  7. client-assertion-type%3Ajwt-bearer&
  8. client_assertion=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.
  9. eyJzdWIiOiJhbGwiLCJhdWQiOiJGZWxvcmRjbiIsInJv.
  10. ER2U4CAt1xYxXBmnVQsrirkMwPwxwjWxjs

场景

那么场景是什么?根据RFC723的描述,该模式用于当客户端希望利用一个现有的、可信任的、使用JWT语义表达的关系来获取Access Token,它不需要在授权服务器上直接进行用户批准(User Approval)步骤。另外jwt-bearer也被定义用于客户端身份验证机制,来判断客户端的身份是否合规。客户端使用JWT进行身份认证和客户端使用JWT进行授权是分离的行为。当然这两种行为可以组合使用,也可以分离使用。客户端使用JWT进行身份验证仅是客户端向令牌端点进行身份验证一种替代方法。

以太坊cppgolang区别 编程

以太坊cppgolang区别

以太坊是一种去中心化的开源平台,它采用智能合约技术,旨在构建和运行不受干扰的分布式应用程序。作为目前最受欢迎的区块链平台之一,以太坊提供了多种编程语言的支持,其
progolang 编程

progolang

Go语言(Golang)是由Google开发的一门静态类型编程语言。作为一名专业的Golang开发者,我深知这门语言的优势和特点。在本文中,我将介绍Golang
golangn个发送者 编程

golangn个发送者

Golang是一种开源的编程语言,由Google团队开发,旨在提高程序的并发性和简化软件开发过程。在Go语言中,有时需要向多个接收者发送信息。本文将介绍如何在G
golang技能图谱 编程

golang技能图谱

从互联网行业的快速发展到人工智能技术的日益成熟,各种编程语言也应运而生。而在这众多的编程语言中,Golang(即Go)作为一门强大且高效的开发语言备受关注。Go
评论:0   参与:  6