# OAuth2 API列表 --- ## 1、模式一:授权码(Authorization Code) ### 1.1、获取授权码 根据以下格式构建URL,引导用户访问 (复制时请注意删减掉相应空格和换行符) ``` url https://zhxy.cqtlzjzx.com/api/oauth2/authorize ?response_type=code &client_id={value} &redirect_uri={value} &scope={value} &state={value} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | response_type | 是 | 返回类型,这里请填写:code | | client_id | 是 | 应用id | | redirect_uri | 是 | 用户确认授权后,重定向的url地址 | | scope | 否 | 具体请求的权限,多个用逗号隔开 | | state | 否 | 随机值,此参数会在重定向时追加到url末尾,不填不追加 | 注意点: 1. 如果用户端尚未登录:会被转发到登录视图 2. 如果scope参数为空,或者请求的权限用户近期已确认过,则无需用户再次确认,达到静默授权的效果,否则需要用户手动确认,服务器才可以下放code授权码 用户确认授权之后,会被重定向至`redirect_uri`,并追加code参数与state参数,形如: ``` url redirect_uri?code={code}&state={state} ``` Code授权码具有以下特点: 1. 每次授权产生的Code码都不一样 2. Code码用完即废,不能二次使用 3. 一个Code的有效期默认为五分钟,超时自动作废 4. 每次授权产生新Code码,会导致旧Code码立即作废,即使旧Code码尚未使用 ### 1.2、根据授权码获取Access-Token 获得Code码后,我们可以通过以下接口,获取到用户的`Access-Token`、`Refresh-Token`、`openid`等关键信息 ``` url https://zhxy.cqtlzjzx.com/api/oauth2/token ?grant_type=authorization_code &client_id={value} &client_secret={value} &code={value} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | grant_type | 是 | 授权类型,这里请填写:authorization_code | | client_id | 是 | 应用id | | client_secret | 是 | 应用秘钥 | | code | 是 | 步骤1.1中获取到的授权码 | 接口返回示例: ``` js { "code": 200, // 200表示请求成功,非200标识请求失败, 以下不再赘述 "msg": "ok", "data": { "access_token": "7Ngo1Igg6rieWwAmWMe4cxT7j8o46mjyuabuwLETuAoN6JpPzPO2i3PVpEVJ", // Access-Token值 "refresh_token": "ZMG7QbuCVtCIn1FAJuDbgEjsoXt5Kqzii9zsPeyahAmoir893ARA4rbmeR66", // Refresh-Token值 "expires_in": 7199, // Access-Token剩余有效期,单位秒 "refresh_expires_in": 2591999, // Refresh-Token剩余有效期,单位秒 "client_id": "1001", // 应用id "scope": "userinfo", // 此令牌包含的权限 "openid": "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__" // openid } } ``` ### 1.3、根据 Refresh-Token 刷新 Access-Token (如果需要的话) Access-Token的有效期较短,如果每次过期都需要重新授权的话,会比较影响用户体验,因此我们可以在后台通过`Refresh-Token` 刷新 `Access-Token` ``` url https://zhxy.cqtlzjzx.com/api/oauth2/refresh ?grant_type=refresh_token &client_id={value} &client_secret={value} &refresh_token={value} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | grant_type | 是 | 授权类型,这里请填写:refresh_token | | client_id | 是 | 应用id | | client_secret | 是 | 应用秘钥 | | refresh_token | 是 | 步骤1.2中获取到的`Refresh-Token`值 | 接口返回值同章节1.2,此处不再赘述 ### 1.4、回收 Access-Token (如果需要的话) 在Access-Token过期前主动将其回收 ``` url https://zhxy.cqtlzjzx.com/api/oauth2/revoke ?client_id={value} &client_secret={value} &access_token={value} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | client_id | 是 | 应用id | | client_secret | 是 | 应用秘钥 | | access_token | 是 | 步骤1.2中获取到的`Access-Token`值 | 返回值样例: ``` js { "code": 200, "msg": "ok", "data": null } ``` ### 1.5、根据 Access-Token 获取当前用户的账号信息 ``` url https://zhxy.cqtlzjzx.com/api/oauth2/user/info?Authorization={token} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- |:----------------------------------------| | Authorization | 是 | Access-Token值(也可以写在请求head中) | 返回值样例: ``` js { "code": 0, "success": true, "msg": "", "data": { "userName": "admin", "name": "管理员", "code": "10000", "nickName": "管理员", "gender": null, "mobile": "15555555555", "postId": null, "avatar": "https://test.minio.yingcaibx.com/learun/xjr/20230822/d0d8d72155344130a3fdb9794a1bfa4e.png", "email": "xxxxxxxxxx@qq.com", "address": "xxxxx", "longitude": 129.0222235, "latitude": 80.2346546, "sortCode": 1, "remark": "管理员", "departmentId": null, "enabledMark": 1, "createDate": "2021-07-25 20:42:11", "modifyDate": "2023-08-30 17:56:42" } } ``` ## 2、模式二:隐藏式(Implicit) 根据以下格式构建URL,引导用户访问: ``` url https://zhxy.cqtlzjzx.com/api/oauth2/authorize ?response_type=token &client_id={value} &redirect_uri={value} &scope={value} $state={value} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | response_type | 是 | 返回类型,这里请填写:token | | client_id | 是 | 应用id | | redirect_uri | 是 | 用户确认授权后,重定向的url地址 | | scope | 否 | 具体请求的权限,多个用逗号隔开 | | state | 否 | 随机值,此参数会在重定向时追加到url末尾,不填不追加 | 此模式会越过授权码的步骤,直接返回Access-Token到前端页面,形如: ``` url redirect_uri#token=xxxx-xxxx-xxxx-xxxx ``` ## 3、模式三:密码式(Password) 首先在Client端构建表单,让用户输入Server端的账号和密码,然后在Client端访问接口 ``` url https://zhxy.cqtlzjzx.com/api/oauth2/token ?grant_type=password &client_id={value} &client_secret={value} &username={value} &password={value} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | grant_type | 是 | 返回类型,这里请填写:password| | client_id | 是 | 应用id | | client_secret | 是 | 应用秘钥 | | username | 是 | 用户的Server端账号 | | password | 是 | 用户的Server端密码 | | scope | 否 | 具体请求的权限,多个用逗号隔开 | 接口返回示例: ``` js { "code": 200, // 200表示请求成功,非200标识请求失败, 以下不再赘述 "msg": "ok", "data": { "access_token": "7Ngo1Igg6rieWwAmWMe4cxT7j8o46mjyuabuwLETuAoN6JpPzPO2i3PVpEVJ", // Access-Token值 "refresh_token": "ZMG7QbuCVtCIn1FAJuDbgEjsoXt5Kqzii9zsPeyahAmoir893ARA4rbmeR66", // Refresh-Token值 "expires_in": 7199, // Access-Token剩余有效期,单位秒 "refresh_expires_in": 2591999, // Refresh-Token剩余有效期,单位秒 "client_id": "1001", // 应用id "scope": "", // 此令牌包含的权限 "openid": "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__" // openid } } ``` ## 4、模式四:凭证式(Client Credentials) 以上三种模式获取的都是用户的 `Access-Token`,代表用户对第三方应用的授权, 在OAuth2.0中还有一种针对 Client级别的授权, 即:`Client-Token`,代表应用自身的资源授权 在Client端的后台访问以下接口: ``` url https://zhxy.cqtlzjzx.com/api/oauth2/client_token ?grant_type=client_credentials &client_id={value} &client_secret={value} ``` 参数详解: | 参数 | 是否必填 | 说明 | | :-------- | :-------- | :-------- | | grant_type | 是 | 返回类型,这里请填写:client_credentials| | client_id | 是 | 应用id | | client_secret | 是 | 应用秘钥 | | scope | 否 | 申请权限 | 接口返回值样例: ``` js { "code": 200, "msg": "ok", "data": { "client_token": "HmzPtaNuIqGrOdudWLzKJRSfPadN497qEJtanYwE7ZvHQWDy0jeoZJuDIiqO", // Client-Token 值 "expires_in": 7199, // Token剩余有效时间,单位秒 "client_id": "1001", // 应用id "scope": null // 包含权限 } } ``` 注:`Client-Token`具有延迟作废特性,即:在每次获取最新`Client-Token`的时候,旧`Client-Token`不会立即过期,而是作为`Past-Token`再次储存起来, 资源请求方只要携带其中之一便可通过Token校验,这种特性保证了在大量并发请求时不会出现“新旧Token交替造成的授权失效”, 保证了服务的高可用