Oauth2协议标准对接流程

Oauth2协议标准对接

OAuth 2.0 协议支持不同的授权模式,每种模式都有其适用场景和流程:

在这里插入图片描述

a. 授权码模式 (Authorization Code Grant)

流程概述:最常见的模式,适用于需要通过浏览器与用户交互的场景。授权码模式通常用于 Web 应用,支持两步流程:

  • 获取授权码:用户授权后,授权服务器通过重定向将用户引导回客户端,并附带一个授权码 code
  • 通过授权码获取访问令牌:客户端使用该 code 通过后台与授权服务器交互,获得 access_token。授权码模式的优点是,access_token 在服务器端获取,而不会暴露给浏览器,因此相对更加安全。
b. 简化模式 (Implicit Grant)

流程概述:适用于客户端无法安全存储凭证的情况,例如前端的单页应用(SPA)。流程简化为一个步骤:

  • 用户授权后,授权服务器通过重定向直接将 access_token 返回给客户端。

这种方式通常不需要 authorization_code,直接返回 access_token,适用于短期会话

c. 资源所有者密码模式 (Resource Owner Password Credentials Grant)
  • 流程概述:适用于客户端是受信任的应用(如移动应用)。客户端直接收集用户的用户名和密码,使用这些凭证请求 access_token

这种方式需要用户的凭证(用户名和密码),通常不涉及授权码 code

d. 客户端凭证模式 (Client Credentials Grant)
  • 流程概述:用于服务到服务的授权。客户端直接通过自己的客户端凭证(client_idclient_secret)获取 access_token,不涉及用户授权。

    这种模式通常用于机器对机器的通信。

示例(企业微信第三方登录对接):

企业微信第三方登录 场景中,获取 authorization_code 之后,不需要为每个用户都单独请求一个新的 access_token,而是使用 通用的 access_token 来获取用户信息。这种设计主要是为了简化授权流程,提高效率,并且确保授权过程的一致性。

这种机制在 OAuth2 协议的实现上属于一种变种,通常被称为 “应用级授权”“全局授权”,通过一个 通用的 access_token 来代表应用或服务的授权。

  1. 获取 authorization_code
  • 用户通过浏览器登录企业微信或其他授权系统,在企业微信授权页面上点击同意。

  • 企业微信授权服务器将用户引导回你的回调地址,并附带一个 authorization_code(授权码)。

    例如,授权 URL 的回调会携带一个类似这样的授权码:
    https://yourdomain.com/callback?code=12345678

  1. 交换 authorization_code 获取通用 access_token
  • 通过 authorization_code,你的服务器会向企业微信的授权服务器请求一个 通用的 access_token,而不是为每个用户分别请求 access_token

​ 请求示例(伪代码):

POST https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET

响应会返回一个 通用的 access_token,通常有效期是 2 小时:

{
  "access_token": "ACCESS_TOKEN",
  "expires_in": 7200
}

这里的 access_token 并不是针对某个特定用户,而是针对整个应用的。这意味着你可以使用同一个 access_token 来访问企业微信的接口,无论是获取用户信息、发送消息,还是查询其他企业微信数据。

  1. 使用通用 access_token 获取用户信息
  • 获取了通用的 access_token 后,你可以使用它来访问企业微信的 用户信息接口。此时,不需要为每个用户重新获取 access_token,只需要通过 authorization_code 获取一次,之后就可以在一段时间内(通常是 2 小时)使用相同的 access_token 来获取任何用户的信息。

    获取用户信息的请求(以 GET 请求为例):

GET https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE

响应:

{
  "errcode": 0,
  "errmsg": "ok",
  "userid": "zhangsan",
  "name": "张三",
  "department": [1],
  "position": "经理",
  "mobile": "13912345678"
}

通过这种方式,你可以在没有每次都去获取用户的 access_token 的情况下,使用 通用的 access_token 获取企业微信中所有需要的用户信息。

总结

  • authorization_codeaccess_token 是两种不同的令牌,它们的作用不同,使用的场景也不同。
  • authorization_code 主要用于初次授权后获取 access_token,而 access_token 是用来访问 API 和获取用户信息的。
  • 在企业微信的授权流程中,access_token 是应用级别的,不需要每次为每个用户获取,而是通过一次授权后可以在一段时间内重复使用它。
  • 通过这种方式,access_token 是跨用户共享的,适用于获取所有用户的信息,而不需要单独为每个用户获取新的 access_token

因此,使用通用的 access_token 来获取用户信息是正常的,符合 OAuth 2.0 授权的设计模式,尤其适用于需要频繁访问的应用场景。

再举例一个方式的oauth2协议的登录对接:

授权码模式:

第一步:

https://xxxxxxxxx/adfs/oauth2/authorize?

client_id=ff6c3de8-f4af-4a51-ad47-xxxxxxxxxxxx

&response_type=code

&redirect_uri=https://xxxxxxxxx/

&resource= https://xxxxxxxxx/

&state=12345

成功的响应:

GET https://xxxxxxxxx/?
code=AAAAAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdeeSTLEMPGYuNHSUYBrq...
&state=12345

第二步:

POST /adfs/oauth2/token HTTP/1.1
Host: https://xxxxxxxxx/
Content-Type: application/x-www-form-urlencoded
client_id=ff6c3de8-f4af-4a51-ad47-xxxxxxxxxxxx
&code=AAAAAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdeeSTLEMPGYuNHSUYBrq...
&redirect_uri=https://xxxxxxxxx/
&grant_type=authorization_code
&client_secret=JqQX2PNxxxxM0uEihUPzyrh

成功的响应:

{
 "access_token": 
"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng2cCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
 "token_type": "Bearer",
 "expires_in": 3599,
 "refresh_token": "AwABAAAAvPM1KaPlrEqdFSKujqfTGAMxZGUTdM0t4B4...",
 "refresh_token_expires_in": 28800,
 "id_token": 
"eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIMO.eyJhdWQiOiIyZDRkMTFhNt1mODE0LTQ2YTctOD...
",
}

其中,id_token 可以通过 jwt.io 解析从而获得用户信息

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值