荣耀帐号开放服务基于OAuth2.0,Web应用可以获取用户授权凭证, 实现授权登录功能, 可以实现浏览器Web授权登录接入或者手机H5授权登录接入荣耀帐号。
1) 用户在应用网站上选择荣耀帐号登录
2) 应用服务器构造 /oauth2/v3/authorize 链接, 向荣耀帐号服务器发起授权请求
3) 荣耀帐号返回登录授权页到浏览器
4) 用户登录并授权
5) 荣耀帐号服务器返回302重定向响应, 请求应用服务器, 并在url中拼上code, 带给应用服务器
6) 应用服务器使用 Code 换 Access Token
7) 荣耀帐号服务器将 Access Token 返回给应用服务器
8) 应用服务器使用 Access Token 请求荣耀帐号服务器获取用户信息
9) 荣耀帐号服务器返回用户信息
10) 应用服务器返回登录成功展示登录信息
用户点击登录, 应用处理该点击事件, 构造 OAuth 授权 /oauth2/v3/authorize 请求链接, 该链接会重定向到登录页面.
html示例如下(点击打开):
HONOR ID Demo
打开该html网页之后显示如下:
填入client_id, redirect_uri, state 参数之后, 点击 "HONOR ID LOGIN" 按钮, 跳转如下链接, 即可拉起登录页面:
https://hnoauth-login.cloud.hihonor.com/oauth2/v3/authorize?
client_id=[appid]
&redirect_uri=[回调地址]
&scope=openid+profile
&response_type=code
&access_type=offline
&state=state-value
参数说明
参数名称 | 是否必选 | 参数说明 |
response_type | 是 | 授权码模式, 为固定值: code |
client_id | 是 | 在 开发准备 中创建的服务器应用的AppId |
redirect_uri | 是 | 用户登录授权之后, 会带上code参数302重定向该回调地址。回调地址必须和开发者服务平台设置的回调地址一致。回调地址可以添加多个。 回调地址后面可以添加参数, 如: https://www.demo.com/url?params=value |
scope | 是 | 申请权限字符串数组,以空格分隔并做 urlEncode(URL编码后空格变为加号+),必须包含字符串“openid”。 |
access_type | 否 | 枚举值,确定响应是否包含Refresh Token,Refresh Token用于刷新Access Token。 为offline时,返回响应包含Refresh Token。 为online或不传该值时,返回响应不包含Refresh Token。 |
state | 否 | 随机串,用于防CSRF,在返回授权码code时原封不动返回。 校验规则:^[0-9a-zA-Z:/.-_]+$ |
nonce | 否 | 防重放攻击,是一个随机值。在生成的id_token中原封不动保留nonce值。 校验规则:^[0-9a-zA-Z:/.-_]{1,1024}$ |
display | 否 | 填写 page 或 wap,默认为 page |
点击授权并登录之后, 会302重定向到地址 redirect_uri 并将 code和 state 参数拼接到 url 中
https://www.demo.com
?code=DQB6e3x9asNPjdN6%2Bw4%2FhzDJN%2Be3dnC3qKnLbUAhqqLQZMmak%2BWF%2F0mwEWlWTRUWyqxzUtvXn%2BBH1Twro7Tip3PiweRTldC9iFU%3D
&state=state-value
3. code 换取 Access Token
第2节会将code参数回调至应用服务, 应用服务拿到code参数之后, 调用 /oauth2/v3/token 接口用 code 换取 Access Token, Refresh Token, id Token等参数.
接口地址: https://hnoauth-login.cloud.hihonor.com/oauth2/v3/token
注意:
grant_type=authorization_code
接口调用文档参考: 服务端API接口 Code 换 Access Token
获取到Access Token之后, 可以通过 GOpen.User.getInfo 接口获取用户信息。
接口地址:https://account-drcn.platform.hihonorcloud.com/rest.php?nsp_fmt=JSON&nsp_svc=GOpen.User.getInfo
接口调用文档参考: 服务端API接口 Access Token 获取用户信息
Access Token 的有效期是1小时, 如果过期了, 还需要使用到的话, 那可以调用 /oauth2/v3/token 接口用 Refresh Token 换取Access Token.
接口地址:https://hnoauth-login.cloud.hihonor.com/oauth2/v3/token
注意: grant_type=refresh_token
接口调用文档参考: 服务端API接口 Refresh Token 刷新 Access Token
通过调用解析Access Token 接口可以将appid、open id、union_id、expire_in、scope等参数解析出来,该功能可用于用户鉴权。
接口地址:https://hnoauth-login.cloud.hihonor.com/rest.php?nsp_fmt=JSON&nsp_svc=hihonor.oauth2.user.getTokenInfo
接口调用文档参考: 服务端API接口 解析 Access Token
Id Token 是标准的jwt token, Id Token 可以解出appid, UnionId, displayname 和 头像等信息。该功能可以用于用户鉴权,简单用户信息获取。
解析id Token 有两种方式,一是调用服务端接口解析(仅供调试使用),二是本地解析(推荐)。
接口调用文档参考:服务端API接口 ID Token 本地校验(推荐)
用户授权之后,可以通过调用取消授权接口,消除用户授权的scope, 并且失效Access Token 和 Refresh Token。该接口会取消用户的授权关系,下次用户再使用该应用时会再次需要用户授权。
Refresh Token 失效之后,使用Refresh Token 换 Access Token 会返回 token revoked 错误:
{
"sub_error": 31204,
"error_description": "token revoked",
"error": 1203
}
接口地址:https://hnoauth-login.cloud.hihonor.com/oauth2/v3/revoke
接口调用文档参考:服务端API接口 取消用户授权