更新日期:     浏览次数:

1. 身份验证

1.1. 身份确认

qing.call('validate', {
    'type': 'password',
    'lightAppId': '',
    'prompt': '为保证数据安全',
    'ignoreYzjPwd': true,
    'success': function (result) {
        console.info(result.data)
    } 
})

参数说明

type:验证方式,包括以下三种,目前仅支持password
      登录密码:type = password
      指纹:type = touchID,如果用户未开启TouchID,则默认使用登录密码验证(建议iOS优先使用此验证方式)
      手势密码:type = gesture,如果用户未开启手势密码,则默认使用登录密码验证

lightAppId:轻应用id

prompt:自定义提示语,最终显示会累加云之家提示,例如:为保证数据安全,请输入云之家登录密码

ignoreYzjPwd:type指定为touchID后是否不做降级处理,错误码13403。

返回值

{
    success: true or false 是否成功(String)
    error: 错误信息(String)
    errorCode: 错误码(int)  //13400:用户取消验证
                           //13401:验证不成功
                           //13402:获取ticket失败
    data:{
        'ticket':'成功后返回轻应用ticket'
    }
}

1.2. 在跳转后的页面获取ticket

通过跳转到轻应用的方式,可以由客户端自动获取ticket并附加在跳转到的url上, 例如:

qing.call('gotoLightApp', {
    appId: '10106'
})

关于 gotoLightApp 的完整用法,请点击左侧菜单的 页面跳转 章节。

1.3. 通过js桥获取ticket

在js中, 也可以通过 qing.call('getTicket') 取得ticket,此方法需要后端接口配合(接口的实现方法参考下一节)。

方法一:

qing.call('getTicket', {
    signUrl: '/path/to/myapp/sign',
    signMethod: 'post',
    success (e) {
        alert(e.data.ticket)
    },
    error (error) {
        alert(error)
    }
})

signUrl是获取签名的接口,各个轻应用的后端应该提供这样一个接口,这个接口会接收到一个名为url参数(post)

返回结果的格式必须如下:

  {
    "success": true,
    "data": {
        appId: "",
        timeStamp: "",
        nonceStr: "",
        signature: ""
    }
  }

方法二:

如果你通过别的方式(例如页面直出)拿到了签名信息,也可以像下面的例子直接传入。

qing.call('getTicket', {
    timeStamp:'1530867948317',
    signature:'7qaScdppiMKuDoYadUqbZhlZhgw=',
    appId:'101091520',
    nonceStr:'0.7057841489531929',
    success (e) {
        alert(e.data.ticket)
    },
    error (error) {
        alert(error)
    }
})

1.4. 签名接口的实现

1.4.1. 第一步:获取应用授权

https://open.yunzhijia.com/wiki/doku.php?id=appauth2:appAuth2%E6%8E%88%E6%9D%83%E5%8D%8F%E8%AE%AE#appauth2%E5%8D%8F%E8%AE%AE%E5%92%8Cappauth2%E6%8E%88%E6%9D%83%E8%AE%A4%E8%AF%81%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%85%B3%E7%B3%BB

1.4.2. 第二步:获取jsapiticket

url: /authorization/jsapi/generateticket

method: post

body: accesstoken=xxxxx

return: {success:true,errorCode:0,error:"",data:{jsapiticket:xxxx,expires_in:600}}//expires_in单位秒

1.4.3. 第三步:生成签名并输出

public JSONObject demo(String appId, String secret, String url){
    JSONObject data = new JSONObject();


    try {
        String timestamp = String.valueOf(System.currentTimeMillis());
        String nonceStr = String.valueOf(Math.random());

        data.put("appId", appId);
        data.put("timestamp",timestamp);
        data.put("nonceStr",nonceStr);

        // TODO 此处请参考第二步文档
        String jsapiticket = getJsapiTicket(appId, appSecret);

        String signature = shaResult(nonceStr, timestamp, url, jsapiticket);
        data.put("signature",signature);
        data.put("jsapiticket", jsapiticket);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return data;
}

private static String shaResult(String noncestr,String timestamp,String url,String ticket) throws NoSuchAlgorithmException, InvalidKeyException {
    String serversignature = "";
    try {
        byte[] text;
        StringBuilder baseline = new StringBuilder();
        baseline = baseline.append("noncestr=").append(noncestr).append("timestamp=").append(timestamp).append("url=").append(url);
        byte[] keyBytes = ticket.getBytes("UTF-8");
        SecretKey key = new SecretKeySpec(keyBytes, "HmacSHA1");
        Mac mac = Mac.getInstance("HmacSHA1");
        mac.init(key);
        text = baseline.toString().getBytes("UTF-8");
        serversignature = new String(Base64.encodeBase64String(mac.doFinal(text)));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    return serversignature;
}

results matching ""

    No results matching ""