SpringBoot使用security实现OAuth2

本文详细介绍了如何使用SpringBoot结合SpringSecurity实现OAuth2授权码模式,包括Authorization Server Configuration和Resource Server Configuration的配置,以及授权码模式的工作流程。文中还提到了授权服务器和资源服务器的配置细节,如ClientDetailsServiceConfigurer、AuthorizationServerSecurityConfigurer、AuthorizationServerEndpointConfigurer等,并强调了安全性和实际应用中的注意事项。
摘要由CSDN通过智能技术生成

SpringBoot使用security实现OAuth2

OAuth2

OAuth是一个开放标准,允许用户授权地方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或者分享他们数据的所有内容。

我们从一个常见的例子来看:

我们打王者,第一次登录的时候要求我们选择微信登录还是QQ登录,这时假设我们点击QQ登录,那么就会跳转到一个认证界面,询问我们是否同意王者使用QQ的数据,例如好友列表等等。当我们点击同意之后就会跳转回王者,之后进入王者我们可以发现好友列表内容就是我们的QQ中的好友列表。并且过段时间不登录之后,我们会发现又要再次认证,这是因为之前的认证令牌过期了,需要重新申请。

这就是OAuth的一个大概思路流程

  1. 客户端要求用户给予授权
  2. 用户同意授权
  3. 客户端通过获得授权向认证服务器申请token
  4. 认证服务器对客户端进行认证,通过认证之后发放token
  5. 客户端可以通过token向资源服务器申请资源
  6. 资源服务器确认通过之后,向客户端开放资源

OAuth2又分为四种不同的授权模式(简化模式和密码模式由于安全度太低已被遗弃):

  1. 授权码模式:这是最常用也是安全度最高的一种模式,通过获取授权码增加安全性
  2. 简化模式:直接申请令牌并且返回令牌,主要用于申请端只有前端没有服务器的情况,例如微信小程序
  3. 密码模式:需要用户提供账号密码,通过账号密码获取token,这种模式安全度极低,不推荐
  4. 客户端模式:与用户无关的一种模式,直接是服务器之间的通信,例如内部系统间的API调用

接下来主要讲讲授权码这个核心授权模式

授权码模式

授权码模式authorization code,指的是客户端首先向认证服务器申请一个授权码,然后通过该授权码再去向授权服务器申请token

     +----------+
     | Resource |
     |   Owner  |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier      +---------------+
     |         -+----(A)-- & Redirection URI ---->|               |
     |  User-   |                                 | Authorization |
     |  Agent  -+----(B)-- User authenticates --->|     Server    |
     |          |                                 |               |
     |         -+----(C)-- Authorization Code ---<|               |
     +-|----|---+                                 +---------------+
       |    |                                         ^      v
      (A)  (C)                                        |      |
       |    |                                         |      |
       ^    v                                         |      |
     +---------+                                      |      |
     |         |>---(D)-- Authorization Code ---------'      |
     |  Client |          & Redirection URI                  |
     |         |                                             |
     |         |<---(E)----- Access Token -------------------'
     +---------+       (w/ Optional Refresh Token)

步骤如下:

A 用户访问客户端,客户端将用户导向认证服务器,并且携带重定向URI

https://authorization-server.com/auth?
response_type=code
&client_id=CLIENT_ID
&redirect_uri=REDIRECT_URI
&scope=photos
&state=1234zyx
&code_challenge=CODE_CHALLENGE
&code_challenge_method=S256

response_type=code 表示授权类型为授权码模式

client_id 表示客户端ID,第一次创建应用的时候获得

redirect_uri 表示重定向URI用户在认证完成之后将用户返回到特定URI

scope 表示申请的权限范围,例如READ

state 应用随机指定的值,用于后期验证

code_challenge code_challenge=transform(code_verifier,[Plain|S256])

如果method=Plain,那么code-challenge=code_verifier

如果method=S256,那么code_challenge等于code_verifierSha256哈希

在授权码请求中带上code_challenge以及method,这两者与服务器颁发的授权码绑定。

code_verifier为客户端生成一个的随机字符串

客户端在用授权码换取token时,带上初始生成的code verifier,根据绑定的方法进行计算,计算结果与code_challenge相比,如果一致再颁发token

code_challenge_method=S256 标明使用S256 Hashing方法

B 用户选择是否对客户端授权

C 授权之后,认证服务器将用户导向之前传入的重定向URI,并且附上授权码

如果用户点击了Allow了,那么服务器将重定向并且附上授权码

https://example-app.com/cb?code=AUTH_CODE_HERE&state=1234zyx

code即为授权码,授权码有效期很短,一般为10分钟,并且客户端只能使用一次。该码与客户端ID和重定向URI是一对一关系

state之前传入的state

我们首先要比较传入的state与之前的state是否相同(之前的state可以存在cookie中),用于确认没有被劫持。<

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值