# spring-oauth2

# 授权码模式

这种模式是四种模式中最安全的一种模式,也叫授权码模式。一般用于client是Web服务器端应用或第三方的原生App调用资源服务的时候。因为在这种模式中access_token不会经过浏览器或移动端的App,而是直接从服务端去交换,这样就最大限度的减小了令牌泄漏的风险。

# 登录
地址:http://localhost:8080/auth/login  输入用户名密码 zhangsan/123456

接着我们访问 http://localhost:8080/auth/oauth/authorize?client_id=c1&response_type=code&scope=all&redirect_uri=https://www.baidu.com

*分析:c1 我们把它当成平台A,平台A想拿到用户张三的个人信息,首先,我们的平台A要主动去访问auth认证授权服务的授权端点*

平台A的信息:

- client_id:c1
- response_type:code
- scope:all
- redirect_uri:https://www.baidu.com

*平台A输入的信息会和 auth认证授权服务存储的信息做对比,如果一致,代表平台A是一个合法的平台。这个时候 auth认证授权服务就会提醒 zhangsan 用户,你是同意还是拒绝平台A访问你的一个信息,这个时候点击 Approve 再点击 Authorize 浏览器的地址栏变化 https://www.baidu.com/?code=DwmpU1 看到了一个授权码*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# oauth2.0的协议思路
  • 平台A获取到授权码,请求 auth认证授权服务申请令牌,此过程用户看不到,平台A请求 auth认证授权服务,请求携带授权码。

  • auth认证授权服务验证平台A请求的授权码,如果合法则给平台A颁发令牌,令牌是平台A拿到张三用户个人信息的通行证

# 申请令牌接口

post

http://localhost:8080/auth/oauth/token?client_id=c1&client_secret=secret&grant_type=authorization_code&code=rdP7m1&redirect_uri=https://www.baidu.com

参数列表如下:

- client_id:客户端唯一标识
- client_secret:客户端秘钥
- grant_type:授权类型,填写authorization_code,表示授权码模式
- code:授权码,就是刚刚获取的授权码,**注意:授权码只使用一次就无效了,需要重新申请**
- redirect_uri:申请授权码时的跳转url,**一定和申请授权码时用的redirect_uri一致**
1
2
3
4
5
6
7
8
9

认证授权服务器返回令牌(access_token)

{
"access_token": "0839524f-3421-48d5-95a5-42a278f8d08a",
"token_type": "bearer",
"refresh_token": "626f8b9f-8fec-49b5-81dc-ac998277249b",
"expires_in": 7199,
"scope": "all"
}
1
2
3
4
5
6
7

# 密码模式

  • 张三将用户名、密码发送给平台A

  • 平台A拿着张三的用户名、密码向 auth认证授权服务(微信认证授权服务)请求令牌(access_token)

# 申请令牌接口

post

http://localhost:8080/auth/oauth/token?client_id=c1&client_secret=secret&grant_type=password&username=zhangsan&password=123456
1
最后更新于: 2022-08-27 21:46:48