网页授权
准备工作
微哨登录是基于 OAuth 2.0 协议标准构建的第三方网站应用授权登录系统。用户在微哨门户中访问第三方网站时,网站应用可通过网页授权机制,获取用户基本信息,进而实现业务逻辑。
在进行微哨登录接入之前,开发者需要在微哨开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,获得相应的 App Key 和 App Secret ;或者通过学校管理员创建校内应用,并获得相应的 App Key 和 App Secret 。获得上述信息后,即可开始接入流程的开发。
授权流程
微哨登录让用户使用微哨帐号安全登录第三方应用或网站。用户授权登录后,第三方可以获取到用户的接口调用凭证( Access Token ),通过凭证可以进行微哨开放平台授权关系接口调用,从而实现获取用户的基础信息。
微哨登录基于 OAuth 2.0 Authorization Code 模式,适用于Web应用的授权登录。该模式整体流程为:
第三方发起授权登录请求,用户允许授权第三方应用后,微哨登录会重定向到第三方网站,并且携带授权临时票据(
code
参数)。使用
code
参数,通过相关API换取 Access Token 。通过 Access Token 进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
第一步:请求code
第三方使用网站应用授权登录前请注意已获取相应网页授权作用域(scope=base_api)。通过跳转到如下链接,可发起对 code
票据的请求(使用我们的工具快速生成授权链接):
https://api.weishao.com.cn/oauth/authorize?client_id=[AppKey]&redirect_uri=[urlEncode(应用回调地址)]&response_type=code&scope=base_api&state=xxx
参数名称 | 必填 | 说明 |
---|---|---|
client_id | 是 | 应用唯一标识,即应用注册时获得的 App Key。 |
redirect_uri | 是 | 授权后重定向的回调链接地址,注意需使用 urlEncode 对链接进行处理 |
response_type | 是 | 返回类型,请填写 code 。 |
scope | 是 | 作用域,与注册时匹配。 base_api 可以访问基础API且支持静默模式不弹出授权提醒; all 可以使用所有高级API。通过开放平台创建的应用默认授予 base_api 作用域,可申请 all 权限;在微哨管理平台创建的应用同时授予 base_api 和 all 权限。 |
state | 是 | 重定向后会带上 state 参数。开发者可以用此参数验证请求有效性,或记录用户请求授权页前的位置。同时此参数可用于防止跨站请求伪造(CSRF)攻击。 |
domain | 否 | 微哨平台开通的学校唯一标示,可用于在授权登录页面指定学校,用户可免于选择。 |
结果
如果用户状态是未登录,转到授权登录页面。
点击登录后,开发者填写的回调地址(
redirect_uri
)可得到如下参数:code=[code]&state=xxx
参数名称 | 说明 |
---|---|
code | 授权请求 Access Token 需要的 code 参数值 |
state | 请求 code 时提供的 state 参数值 |
如果用户状态是已登录,浏览器会直接跳转到开发者填写的回调地址
redirect_uri
,并附带上述参数。若提示“该链接无法访问”,请检查参数是否填写错误,如
redirect_uri
是否已进行urlEncode
、其域名是否与管理平台填写的授权域名一致,scope
是否为base_api
或all
。
第二步:通过 code
换取网页授权 Access Token
需要注意的是,这里获得的 Access Token 仅能用于网页授权相关接口,与【高级API开发文档】中相关接口所需使用的 Access Token 不同,两者不可混用。此外,应用的 App Secret 和获取到的 Access Token 都具有很高的安全级别,必须只保存在服务器端,建议不要传递给客户端/页面前端。下面的刷新 Access Token 、获取用户信息等步骤也必须从服务器测发起。
- URL:
https://api.weishao.com.cn/oauth/token
- 需要授权: 是
- 请求类型: HTTP POST
- 请求数据类型:Form表单(application/x-www-form-urlencoded) 或 JSON(application/json)
请求参数
Form表单
grant_type=authorization_code&client_id=[AppKey]&client_secret=[AppSecret]&code=[code]&redirect_uri=[urlEncode(应用回调地址)]
JSON
{ "grant_type": "authorization_code", "client_id": "【App Key】", "client_secret": "【App Secret】", "code": "【code】", "redirect_uri": "【应用回调地址】" // 这里的地址不需要进行 urlEncode ,必须与第一步填写的“应用回调地址”保持一致 }
- 参数说明
参数名称 | 说明 |
---|---|
grant_type | 固定值 authorization_code。 |
client_id | 应用唯一标识,即应用注册时获得的 App Key。 |
client_secret | 应用密钥,即应用注册时获得的 App Secret。 |
code | 授权票据,即第一步应用回调地址获得的 code 参数值 |
redirect_uri | 应用回调地址 |
返回结果
正常
{ "access_token": "fDanz0ydkCqVsgSoze7mrCnwJIsN0dL", "expires_in": "1209600", "scope": "base_api", "refresh_token": "HhbiRKzjVnKdvGfmuGjvh3Clm4AIMqV8", "token_type": "Bearer" }
异常
{ "errcode": 40029, "errmsg": "invalid code" }
参数名称 | 说明 | 备注 |
---|---|---|
errcode | 错误编码 | |
errmsg | 错误提示 |
第三步:刷新 Access Token (如果需要)
由于 Access Token 拥有较短的有效期,当 Access Token 超时后,可以使用 Refresh Token 进行刷新。当 Refresh Token 失效之后,需要用户重新授权。
- URL:
https://api.weishao.com.cn/oauth/token
- 需要授权: 是
- 请求类型: HTTP POST
- 请求数据类型:Form表单(application/x-www-form-urlencoded) 或 JSON(application/json)
请求参数
Form表单
grant_type=refresh_token&client_id=[AppKey]&client_secret=[AppSecret]&refresh_token=[RefreshToken]
JSON
{ "grant_type": "refresh_token", "client_id": "【App Key】", "client_secret": "【App Secret】", "refresh_token": "【Refresh Token】" }
- 参数说明
参数名称 | 说明 |
---|---|
grant_type | 固定值 refresh_token。 |
client_id | 应用唯一标识,即应用注册时获得的 App Key。 |
client_secret | 应用密钥,即应用注册时获得的 App Secret。 |
refresh_token | 刷新票据,即第二步中返回的 refresh_token 参数值 |
返回结果
正常
HTTP 200
{ "access_token": "xN2836yQAQfDURxVPds0IM9vfUk3IJC5", "expires_in": 604800, "scope": "demo", "refresh_token": "VFlAp82EUWNQJkokRvoELSPhPpO3pSPS", "token_type": "Bearer" }
第四步:获取用户信息
- URL:
https://api.weishao.com.cn/profile?access_token=[AccessToken]
- 需要授权: 是
- 请求类型: HTTP GET
参数名称 | 必填 | 说明 | 备注 |
---|---|---|---|
access_token | 是 | Authorization Code 模式下获取的 Access Token |
返回结果
正确
{ "name": "张三", "schoolcode": "ruijie", "student_number": "zhangsan", "sex": "boy", "photo_live": "http://store.weishao.com.cn///group1/M00/00/00/rBGoWlawRX6IbazWAALtCN376l4AAAAHA5mBBMAAu0g965.jpg", "mood_words": "", "nick_name": "", "organization_id": "234", "organization": "微哨大学", "uid": "099", "identity": "teacher", "wx_openid": "xxxxxxxx", "openid": "", "unionid": "", "schoolname": "微哨大学", "schoolicon_url": "http://store.weishao.com.cn//group1/M00/00/00/rBGoWlZ5Im2IAIb3AAAoqbZ4SkEAAAAGA4-VAEAACjB386.png" }
参数名称 | 类型 | 说明 |
---|---|---|
name | string | 姓名 |
sex | string | 性别。boy:男,girl:女 |
photo_live | string | 头像图片的url地址 |
mood_words | string | 用户签名 |
student_number | string | 学工号 |
nick_name | string | 昵称 |
organization | string | 用户所在各级组织结构名称 |
uid | string | 用户在微哨平台的唯一id。 |
identity | string | 身份。teacher:老师,student:学生 |
schoolcode | string | 学校编码 |
wx_openid | string | openid 绑定的公众号id,未绑定默认为空 |
openid | string | openid 普通用户的标识,对当前开发者帐号唯一 |
unionid | string | unionid 用户统一标识。针对一个微哨开放平台帐号下的应用,同一用户的unionid是唯一的。 |
schoolname | string | schoolname 学校名称 |
schoolicon_url | string | schoolicon_url 学校logo |
错误
{ "code": 401,//401/403/500, "data": "Unauthorized", "errno": "100401"//内部错误代码 }
参数名称 | 说明 | 备注 |
---|---|---|
errcode | 错误编码 | |
errmsg | 错误提示 |
访问权限限制
访问级别:普通接口 频次限制:无
授权scope
base_api
注销流程
注销登录将会清除OAuth服务对应用的授权状态,用户再次进入应用时,需要重新授权。
- URL:
https://api.weishao.com.cn/logout?return_uri=[urlEncode(回调地址)]
- 请求类型: HTTP GET
请求参数
参数名称 | 必填 | 说明 |
---|---|---|
return_uri | 否 | 注销登录后回调地址,注意需使用 urlEncode 对链接进行处理。如果此参数为空,默认跳转至https://api.weishao.com.cn 。 |
返回结果
注销成功
成功跳转到回调地址
return_uri
。如果未提供上述参数,则跳转到https://api.weishao.com.cn
。注销失败
{ "errcode": 500, "errmsg": "注销失败" }
参数名称 | 说明 | 备注 |
---|---|---|
errcode | 错误编码 | |
errmsg | 错误提示 |