授权模式
本文所述开放授权协议指华东师范大学的 OAuth2 授权服务
我校所提供的 OAuth2 协议遵循国际标准(RFC6749),可以使用任意支持 OAuth2 开发包或开发框架进行集成开发,详情可参考 Code-OAuth
本文档的所有接口均可以在开发者平台的 OAuth2-Playground 上进行测试验证,示例所提供 curl example
均可以在任意支持 curl
的平台上运行测试。
授权码模式(authorization code)
描述
OAuth2 以授权码模式进行授权,详见 RFC6749-section-4.1
使用授权码模式,将先通过一次用户的身份认证与授权,经用户确认后方能获得 token。
开放平台已经实现了与学校统一身份认证系统,企业微信的集成对接,并且自动根据环境判断认证方式。因此通过授权码模式对接的应用,在浏览器上访问时,将通过统一身份认证系统认证,在微信/企业微信内打开时,则将自动通过企业微信认证。一次对接即可打通两个平台。
请求方法
详见 身份认证 中的详细介绍
客户端模式(client credentials)
描述
OAuth2 客户端模式进行授权,详见 RFC6749-section-4.4
请求方法
POST
请求地址
https://api.ecnu.edu.cn/oauth2/token
请求参数
参数名 | 是否必填 | 备注 |
---|---|---|
grant_type | 是 | 必须是 client_credentials |
client_id | 是 | 所分配的 client_id |
client_secret | 是 | 所分配的 client_secret |
返回参数
参数名 | 类型 | 备注 |
---|---|---|
token_type | string | token类型 |
access_token | string | 获得的 token |
expires_in | number | token 的有效期 |
scope | string | 默认为 ECNU-Basci |
请求示例
curl -i -X POST -d "grant_type=client_credentials&client_id=*************&client_secret=****************************" "https://api.ecnu.edu.cn/oauth2/token"
返回示例
{"access_token":"a90509d90c2d96c9f61c2f5dfc43758c","token_type":"Bearer","expires_in":7200,"scope":"ECNU-Basic"}
资源拥有密码模式(Resource Owner Password Credentials)
描述
资源拥有密码的模式,详见 RFC6749-section-4.3
请求方法
POST
请求地址
https://api.ecnu.edu.cn/oauth2/token
请求参数
参数名 | 是否必填 | 备注 |
---|---|---|
grant_type | 是 | 必须是 password |
client_id | 是 | 所分配的 client_id |
client_secret | 是 | 所分配的 client_secret |
username | 是 | 用户的统一身份认证账号,即学工号 |
password | 是 | 用户的统一身份认证密码 |
返回参数
参数名 | 类型 | 备注 |
---|---|---|
token_type | string | token类型 |
access_token | string | 获得的 token |
expires_in | number | token 的有效期 |
scope | string | 默认为 ECNU-Basic |
refresh_toklen | string | refresh token |
请求示例
curl -X "POST" -d 'client_id=c*****56b81&client_secret=50********678c5bf561&grant_type=password&username=20****73&password=********' "https://api.ecnu.edu.cn/oauth2/token"
返回示例
{"access_token":"1ed79f2cccb597408171bb717e701112","token_type":"Bearer","expires_in":7200,"scope":"ECNU-Basic","refresh_token":"3cb2f2be83bc014e6ec3617936f4d59ca729629edb7c2fd2bd9fd087e6cafe76"}
使用令牌调用接口
除了元数据字典接口,或者接口有特殊说明以外,所有接口的调用均需要携带所申请的令牌,即 access_token
才可调用成功。在接口——支持的模式中,我们列出了接口所支持的授权模式,请使用该接口所支持的模式来申请 access_token
。
使用 access_token
调用数据时,可以采用以下两种形式皆可。
HTTP Header 携带 token
放在 HTTP Header 的 Authorization 中,增加 Bearer为前缀,例如
curl -H "Authorization: Bearer 5956629b6715bcddad8e77516c13b183" https://api.ecnu.edu.cn/api/v1/ecard/door/terms
以 URL 参数形式携带 token
放在 URL 中以 query string 参数形式携带,开发调试时会更方便。例如
curl "https://api.ecnu.edu.cn/api/v1/ecard/door/terms?access_token=5956629b6715bcddad8e77516c13b183"
由于 URL 可能会被记录(浏览器,代理,服务器日志等),因此不推荐在生产环境上使用这个方式调用数据。
令牌有效期说明
access_token
有效期为 2 个小时。在 authorization code
和 Resource Owner Password Credentials
模式下,每个用户在同一个应用下,同时最多只能拥有一个 access_token
。当新的 access_token
颁发后,旧 access_token
将在 5 分钟内失效。如果您有多个应用需要通过此类模式集成,且需要持续使用 access_token
调用接口更新信息的话,请申请多个开发者账号。
client credentials
模式下可以允许同时申请多个 access_token
。
请求 access_token
的接口有速率限制,请在应用侧缓存 access_token
,不要频繁的申请,否则可能会被临时性封禁。
尽管非常罕见,但在特殊情况下平台可能会吊销尚处于有效期内的 access_token
。应用侧应该实现 access_token
失效时重新申请的策略。可以根据返回的 http header
中,X-Ca-Error-Code
的值判断,当其为 A401OT
时表示 access_token
错误。此时应用应当尝试重新申请 token。
在 authorization code
和 Resource Owner Password Credentials
模式下可以通过 refresh_token
来刷新令牌,refresh_token
的有效期为 1个月。
刷新令牌
描述
OAuth2 刷新令牌,详见 RFC6749-section-6
请求方法
POST
请求地址
https://api.ecnu.edu.cn/oauth2/token
请求参数
参数名 | 是否必填 | 备注 |
---|---|---|
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 |
id_token | string | jwt 的 id token |
expires_in | number | token 的有效期 |
scope | string | 默认为 ECNU-Basic |
refresh_toklen | string | refresh token |
请求示例
curl -i -X POST -d "grant_type=refresh_token&client_id=dd33f4e3528c3020&client_secret=5786af1e2d1bc147328af2881a6f3f91&refresh_token=61b4b8a065c0104131a6657a98ad1d51dad11ec1d48ae6cd1510d337a460ed41" "https://api.ecnu.edu.cn/oauth2/token"
返回示例
{"access_token":"fc1315bffd2473d1ea59afb5683be37e","id_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJkZDMzZjRlMzUyOGMzMDIwIiwiZXhwIjoxNjI0MzczMzUxLCJpYXQiOjE2MjQzNjYxNTEsImlzcyI6IkVDTlUtQmFzaWMiLCJzdWIiOiIyMDE1MDA3MyJ9.ELGRKNt0BF9SfiHIo8yCAU78cFpv_OnF8O1qSUmdb_eGKJ0TG6EVBCWYeJH_l8l98Mva21zninG3W2SZ7QURvHQWKkLXbobCr5Yw8CHs9O77qgwqgfnI_QQ8elvOSX7Dh5L88los1zS99bGZpq_NeVcQEZ-K2JXxKdPjtYtHMbZPQAwuTUuBPgED5uRE3Vw4ldS4DX9iyDjmrgbu1kntV5MNqoWi29rZ8k7TK7HvBpB8lsZ4Sou8aGnKWR6jk28pWS21ivTWU6HoYxNw7F6P0bvC9rL8u29-k3-1aEr7ES07yUNOEcLhxXr_NnofjqvX3pGQVsOvqaRvctMbXeLTBw","token_type":"Bearer","expires_in":7200,"scope":"ECNU-Basic","refresh_token":"ea9b4ce87ff4df2ef99d29195eb3de09839986fe193750886adc1350fcf9eb71"}