一、业务描述
荣耀帐号开放服务基于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) 应用服务器返回登录成功展示登录信息
三、开发指导
1. 拉起荣耀帐号授权登录页
用户点击登录, 应用处理该点击事件, 构造 OAuth 授权 /oauth2/v3/authorize 请求链接, 该链接会重定向到登录页面.
html示例如下(点击打开):
<html>
<head>
<title>HONOR ID Demo</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<style>
.a {
width: 300px;
height: 30px;
margin-top:2px;
}
#b {
width: 420px;
text-align: right;
}
</style>
</head>
<body>
<div id="b">
<form action="https://hnoauth-login.cloud.hihonor.com/oauth2/v3/authorize" method="get">
<div>
<label>client_id: </label>
<input class="a" name="client_id" placeholder="appid" />
</div>
<div>
<label>redirect_uri: </label>
<input class="a" name="redirect_uri" placeholder="应用的回调地址" />
</div>
<div>
<label>scope: </label>
<input class="a" name="scope" value="openid profile" />
</div>
<div>
<label>response_type: </label>
<input class="a" name="response_type" value="code" />
</div>
<div>
<label>access_type: </label>
<input class="a" name="access_type" value="offline" />
</div>
<div>
<label>state: </label>
<input class="a" name="state" value="state-value" />
</div>
<p><button>HONOR ID LOGIN</button></p>
</form>
</div>
</body>
</html>
打开该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 |
2. 用户登录并授权
点击授权并登录之后, 会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
4. Access Token 获取用户信息
获取到Access Token之后, 可以通过 GOpen.User.getInfo 接口获取用户信息。
接口地址:https://account-drcn.platform.honorcloud.com/rest.php?nsp_fmt=JSON&nsp_svc=GOpen.User.getInfo
接口调用文档参考: 服务端API接口 Access Token 获取用户信息
5. Refresh Token 刷新 Access Token
Access Token 的有效期是1小时, 如果过期了, 还需要使用到的话, 那可以调用 /oauth2/v3/token 接口用 Refresh Token 换取Access Token.
接口地址:https://hnoauth-login.cloud.honor.com/oauth2/v3/token
注意: grant_type=refresh_token
接口调用文档参考: 服务端API接口 Refresh Token 刷新 Access Token
6. 解析Access Token
通过调用解析Access Token 接口可以将appid、open id、union_id、expire_in、scope等参数解析出来,该功能可用于用户鉴权。
接口地址:https://hnoauth-login.cloud.honor.com/rest.php?nsp_fmt=JSON&nsp_svc=honor.oauth2.user.getTokenInfo
接口调用文档参考: 服务端API接口 解析 Access Token
7. 解析Id Token (可选)
Id Token 是标准的jwt token, Id Token 可以解出appid, UnionId, displayname 和 头像等信息。该功能可以用于用户鉴权,简单用户信息获取。
解析id Token 有两种方式,一是调用服务端接口解析(仅供调试使用),二是本地解析(推荐)。
接口调用文档参考:服务端API接口 ID Token 本地校验(推荐)
8. 取消授权(可选)
用户授权之后,可以通过调用取消授权接口,消除用户授权的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.honor.com/oauth2/v3/revoke
接口调用文档参考:服务端API接口 取消用户授权