OAuth2
认证协议
我们支持通过 OAuth2 的授权码模式来实现用户身份认证的过程,详见 RFC6749-section-4.1
使用授权码模式,将先通过一次用户的身份认证与授权,经用户确认后方能获得 token。
平台已经实现了与学校统一身份认证系统,企业微信的集成对接,并且自动根据环境判断认证方式。因此通过授权码模式对接的应用,在浏览器上访问时,将通过统一身份认证系统认证,在微信/企业微信内打开时,则将自动通过企业微信认证。一次对接即可打通两个平台。
OAuth2 Endpoints
- Authorization Endpoint: https://sso.ecnu.edu.cn/oauth2.0/authorize
- Token Endpoint: https://sso.ecnu.edu.cn/oauth2.0/accessToken
- Userinfo Endpoint: https://sso.ecnu.edu.cn/oauth2.0/profile
- Logout Endpoint: https://sso.ecnu.edu.cn/logout
授权码模式
该模式的授权流程为:
- 跳转到认证中心认证用户。
- 使用code获取access_token。
- 获取用户信息。
1、用户认证
跳转到认证中心认证用户。 请求⽅式: GET 请求地址: https://sso.ecnu.edu.cn/oauth2.0/authorize
请求参数:
https://sso.ecnu.edu.cn/oauth2.0/authorize?response_type=code&client_id=<实际的client_id>&redirect_uri=<实际的callback回调地址>&scope=ECNU-Basic参数说明:
| 参数 | 是否必须 | 说明 |
|---|---|---|
| response_type | 是 | 授权码模式,这里固定为code |
| client_id | 是 | 应用id |
| redirect_uri | 是 | 应用回调地址 |
| scope | 否 | scope ,可以不传,默认值为ECNU-Basic |
返回结果:
- 重定向到认证页面,认证成功页面将跳转至 redirect_uri?code=CODE
- code说明:code作为换取access_token的票据,每次用户授权带上的code将不一样
- code只能使用一次,10s未被使用自动过期。
参数说明:
| 参数 | 说明 |
|---|---|
| code | 跳转到redirect_uri时,code参数会附带在该地址中 |
2、用code获取access_token
使用code获取access_token。
请求⽅式: POST
请求地址: https://sso.ecnu.edu.cn/oauth2.0/accessToken
请求头(header):
Content-Type:form-data
请求参数:
获取code后,请求以下链接获取access_token
form表单post请求
POST https://sso.ecnu.edu.cn/oauth2.0/accessToken HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&client_id=<实际的client_id>
&client_secret=<实际的client_secret>
&redirect_uri=<实际的callback回调地址>
&code=<实际的拿到的code>参数说明:
| 参数 | 是否必须 | 说明 |
|---|---|---|
| grant_type | 是 | 授权码模式,这里固定为authorization_code |
| client_id | 是 | 应用id |
| client_secret | 是 | 应用秘钥 |
| redirect_uri | 是 | 应用回调地址 |
| code | 是 | 授权码 |
返回结果:
{
"access_token":"AT-98-kkxRFRAp7JP4HvKcooOlTjqEslglCNoU",
"token_type":"bearer",
"expires_in":28800,
"refresh_token":"RT-7-XuigbD-eb4qSN0LwHBSixvpmv4zCzw21"
}参数说明:
| 参数 | 是否必须 | 说明 |
|---|---|---|
| access_token | 是 | 访问令牌 |
| token_type | 是 | 令牌类型 |
| expires_in | 是 | 令牌有效期 |
| refresh_token | 否 | 刷新令牌 |
3、获取用户信息
使用access_token获取用户信息。
请求⽅式: GET
请求地址: https://sso.ecnu.edu.cn/oauth2.0/profile
token 加在请求头中:
GET https://sso.ecnu.edu.cn/oauth2.0/profile HTTP/1.1
Authorization: Bearer AT-3739-S2sgta0g8YOnaaI3fND9zT37S2F9bpwb参数说明:
| 参数 | 说明 |
|---|---|
| BMBM | 部门编码 |
| BMMC | 部门名称 |
| XGH | 工号 |
| XM | 姓名 |
返回结果:
{
"active": true,
"attributes": {
"BMBM": "0445",
"BMMC": "信息化治理办公室",
"objectId": "64c8abf09ae6290001326dd1",
"XGH": "20150073",
"XM": "冯骐"
},
"id": "20150073",
"client_id": "82ad66083847afe3"
}注销登出
登出地址为/logout。
请求⽅式: GET
请求地址: https://sso.ecnu.edu.cn/logout
当需要实现登出后重新登录,自动跳转到对接应用时,可以在登出地址后携带service参数,例如: https://sso.ecnu.edu.cn/logout?service=<实际的callback回调地址>
参数说明:
| 参数 | 是否必须 | 说明 |
|---|---|---|
| service | 否 | 业务要跳转的地址 |
刷新令牌
描述
OAuth2 刷新令牌,详见 RFC6749-section-6
请求方法
POST
请求地址
https://sso.ecnu.edu.cn/oauth2.0/accessToken
请求参数
| 参数名 | 是否必填 | 备注 |
|---|---|---|
| grant_type | 是 | 必须是 refresh_token |
| client_id | 是 | 所分配的 client_id |
| client_secret | 是 | 所分配的 client_secret |
| refresh_token | 是 | 授权码模式中,token中包含的 refresh_token |
返回参数
| 参数名 | 类型 | 备注 |
|---|---|---|
| token_type | string | token类型 |
| access_token | string | 获得的 token |
| expires_in | number | token 的有效期 |
| scope | string | 默认为 ECNU-Basic |
请求示例
curl -i -X POST -d "grant_type=refresh_token&client_id=dd33f4e3528c3020&client_secret=5786af1e2d1bc147328af2881a6f3f91&refresh_token=RT-15107-OSzz8MJZ-rYXccc-2Wq4Sq1Cyaal9GgB" "https://sso.ecnu.edu.cn/oauth2.0/accessToken"返回示例
{
"access_token": "AT-17234-YMkgKKbrTXgc7DLZ1TOVI7Ewozb17zsG",
"token_type": "Bearer",
"expires_in": 7200,
"scope": "ECNU-Basic"
}