鉴权流程
部分JSAPI需要先完成鉴权方可调用,请参考鉴权流程完成鉴权。不需要鉴权的JSAPI调用请参考轻应用免登。
鉴权流程
步骤 | 描述 |
---|---|
1 | 服务端获取access_token |
2 | 服务端获取jsapi_ticket |
3 | 服务端计算签名信息生成signature |
4 | 前端H5页面使用 HWH5.config 方法进行签名校验 |
第一步:服务端获取access_token
- 首先在We码开放平台注册H5类型应用,获取 client_id 和 client_secret 。
- 调用
/api/auth/v1/tickets
接口获取access_token。
注意:access_token是存在有效期的,使用前请确认是否过期,如果过期需要重新获取。
body请使用
type="e"
的方式,无需传code
参数。
第二步:服务端获取jsapi_ticket
请求格式说明
请求方式: GET (HTTPS)
请求头部:
x-wlk-Authorization: access_token
请求地址:
https://open.welink.huaweicloud.com/api/auth/v1/jstickets
请求参数: 无
响应格式说明
返回结果:
{
"code": "0",
"message": "ok",
"jstickets": "A593A60B5594D4A157AE85E05DE4C77E0517CEFBE2337522E5386D2A3E9BF7CD"
}
返回参数说明:
参数 | 说明 |
---|---|
code | 数据正常返回“0”,如果发生错误,会返回对应的错误码 |
message | 返回信息,包括接口请求发生错误时的详细信息 |
jstickets | JSAPI凭证 |
错误码说明:
code | message |
---|---|
41600 | token invalid,to get jstickets Exception! |
第三步:服务端计算签名信息生成signature
参数说明
参数 | 说明 |
---|---|
jsapi_ticket | jstickets |
noncestr | 随机数 |
timestamp | 签名的时间戳 |
url | 当前页面的路径 |
使用说明
1、将所有参数拼接成一个字符串进行sha1加密,参考下文示例,获得签名信息。
2、url是完整的url,包括 http(s)
协议部分和‘?’后面的Get参数部分,但不包括‘#’后面的内容。生成签名用的url需要对页面url的query部分做一次urldecode。
例如,如果url是
http://abc.com?url=http%3A%2F%2Fabc.com%2somewhere
那么生成签名用到的url应该是对原url做过decode的url,即
http://abc.com?url=http://abc.com/somewhere
代码示例
Java示例:
public static String sign(String jsticket, String nonceStr, long timeStamp, String url) throws OApiResultException {
String urldecode = java.net.URLDecoder.decode(url, "UTF-8");
String plain = "jsapi_ticket=" + jsticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp)
+ "&url=" + urldecode;
try {
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
sha256.reset();
sha256.update(plain.getBytes("UTF-8"));
return bytesToHex(sha256.digest());
} catch (NoSuchAlgorithmException e) {
throw new OApiResultException(e.getMessage());
} catch (UnsupportedEncodingException e) {
throw new OApiResultException(e.getMessage());
}
}
Python示例:
import hashlib
from time import time
def sign(jsticket, nonceStr, url, timeStamp):
plain = 'jsapi_ticket=' + jsticket +\
'&noncestr=' + nonceStr +\
'×tamp=' + str(timeStamp) +\
'&url=' + url
sha = hashlib.sha256()
sha.update(plain.encode('utf-8'))
return sha.hexdigest()
if __name__ == '__main__':
timeStamp = "1562132124954"
jsticket = "7327E371B4076F02AD2E95A24536640F5E171B1A5A7D2AA25FD4B79AA850B39A1C8B1CAF44331A0DE57D6188DC3A85F6FBCCA9F17DF45AFDA307FB55665D"
nonceStr = "2019-04-09"
url = "http://grapejuice.vhooper.myhuaweicloud.com/h5/jsonline/"
print('signature is :' + sign(jsticket, nonceStr, url, timeStamp))
>> signature is :0ae401929f84c98d68ec794ca6fd7b893800cf21ac516892b501db9aa3ba7bfe