授权码模式
OAuth 2.0 中最常用、最安全的模式,需用户参与授权,适用于有后端的Web应用。用户授权后,认证服务器返回授权码,客户端再用授权码交换访问令牌。流程安全,能保护令牌和用户数据,支持长期权限且可刷新令牌。
# 流程图

通过 CODE 获取用户身份会有一定的时间开销。对于频繁获取用户身份的场景,建议采用如下方案:
- 用户跳转到企业应用页面时,企业应用校验是否有代表用户身份的 cookie(此 cookie 由企业应用生成)
- 如果没有获取到 cookie,调用身份验证接口,获取用户身份后,由企业应用生成代表用户身份的 cookie。根据 cookie 获取用户身份,进入相应的页面
# 获取 code
# 请求说明
请求方式:GET
请求路径:https://${填入所在云的域名}/oauth2.0/authorize?responseType=code&appId=APPID&redirectUrl=REDIRECTURL&state=STATE&thirdTraceId=${随机字符串}
# 请求参数
| 参数 | 参数类型 | 必须 | 说明 |
|---|---|---|---|
| appId | String | 是 | 自建应用的 appId |
| redirectUrl | String | 是 | 回调地址,域名需要与创建应用填写的 web 端跳转地址保持一致 |
| responseType | String | 是 | 固定值:code |
| state | String | 是 | 用于第三方应用防止 CSRF 攻击,成功授权后回调时会原样带回 |
| thirdTraceId | String | 是 | 用于标识每一次请求 |
# 请求示例
https://open.fxiaoke.com/oauth2.0/authorize?responseType=code&appId=FSAID_xxx&redirectUrl=https://www.yoururl.com/xxx&state=77598SDASF&thirdTraceId=5ea0422d-98e3-49e0-a3cb-9bd5517d1f30
# state 值说明
在发起授权流程生成 state 参数时,要保证随机生成,并且尽量避免重复。例如:state = MD5(时间戳 + 当前帐号)。纷享在授权完成后,将重定向到开发者的服务器。此时开发者的服务器应检测 state 参数是否一致,如果不一致,开发者的服务器应该拒绝此请求,并且不再发起换取 access_token 的请求。如果一致,则流程正常运行。
强烈建议开发者实现以上过程,以防止 CSRF 攻击。
# redirectUrl 值说明
域名需要与应用详情页中的登录授权发起页域名保持一致。例如你填写的登录授权发起页域名是www.fxiaoke.com,那么你现在需要填写的redirectUrl就是https://www.fxiaoke.com/xxx,具体回调到哪个页面由企业自行决定,保证该页面可以正常访问即可。

# 返回参数
| 参数 | 参数类型 | 说明 |
|---|---|---|
| code | String | 授权码 |
| state | String | 用于第三方应用防止 CSRF 攻击,成功授权后回调时会原样带回 |
# 返回示例
https://www.fxiaoke.com/xxx?code=xxxxxxx&state=77598SDASF
# 获取 token
通过 code 来获取 token。
# 请求说明
请求方式:POST + application/json
请求路径:https://${填入所在云的域名}/oauth2.0/token?thirdTraceId=${随机字符串}
# 请求参数
| 参数 | 参数类型 | 必须 | 说明 |
|---|---|---|---|
| appId | String | 是 | 自建应用的 appId |
| appSecret | String | 是 | 自建应用的 appSecret |
| redirectUrl | String | 是 | 回调地址 |
| code | String | 是 | 授权码 code |
| grantType | String | 是 | 授权模式,固定值为:authorization_code |
# 请求示例
{
"appId": "FSAID_xxxx",
"appSecret": "98xxxx62e7d",
"redirectUrl": "https://www.fxiaoke.com/xxx",
"code": "xxxxx",
"grantType": "authorization_code"
}
# 返回参数
| 参数 | 必须 | 说明 |
|---|---|---|
| openUserId | 是 | 用户的 openUserId |
| accessToken | 是 | 授权凭证 token,有效期两个小时 |
| corpId | 是 | 开放平台派发的公司帐号 |
| expiresIn | 是 | 过期时间 |
| refreshToken | 是 | 用于刷新 accessToken,有效期两个月 |
# 返回示例
{
"errorCode": 0,
"errorMessage": "success",
"openUserId": "FSUID_xxxxx",
"accessToken": "xxxxxx",
"corpId": "FSCID_xxxxx",
"refreshToken": "xxxxx",
"expiresIn": 1580000000
}