鉴权流程


部分JSAPI需要先完成鉴权方可调用,请参考鉴权流程完成鉴权。不需要鉴权的JSAPI调用请参考轻应用免登

鉴权流程

步骤 描述
1 服务端获取access_token
2 服务端获取jsapi_ticket
3 服务端计算签名信息生成signature
4 前端H5页面使用 HWH5.config 方法进行签名校验

第一步:服务端获取access_token

  1. 首先在We码开放平台注册H5类型应用,获取 client_id 和 client_secret 。
  2. 调用 /api/auth/v1/tickets 接口获取access_token。

注意:access_token是存在有效期的,使用前请确认是否过期,如果过期需要重新获取。

  1. body请使用 type="e" 的方式,无需传 code 参数。

  2. 详情参考

第二步:服务端获取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 + "&timestamp=" + 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 +\
          '&timestamp=' + 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

result. ""

    Not Found. ""