JSAPI籤權

JSAPI鑑權----釘釘H5開發

 

雖釘釘開發文檔上寫着不須要JSAPI籤權,但這僅僅是針對Android手機前端

因此爲了保險起見,在使用JSAPI前,都須要籤權。後端

不然:dd.ready({}) 將不會執行。api

JSAPI籤權步驟:服務器

  1. 獲取accessToken(用於jsapi_ticket的獲取)
  2. 獲取jsapi_ticket(用於用於js的簽名計算)
  3. 獲取簽名參數
  4. 生成簽名
  5. 引入js
  6. dd.config({}) JSAPI籤權

 


1.獲取accessTokenapp

請求方式GET(HTTPS)
請求地址https://oapi.dingtalk.com/gettoken?corpid=id&corpsecret=secret
參數說明函數

參數post

參數類型url

必須spa

說明代理

corpid

String

企業Id

corpsecret

String

企業應用的憑證密鑰

返回說明token有效期是:7200s

{

    "errcode": 0,

    "errmsg": "ok",

    "access_token": "fw8ef8we8f76e6f7s8df8s"

}


2.獲取jsapi_ticket

請求說明

請求方式GET(HTTPS)
請求地址https://oapi.dingtalk.com/get_jsapi_ticket?access_token=ACCESS_TOKEN
參數說明:

參數

參數類型

必須

說明

access_token

String

調用接口憑證

type

String

目前只支持jsapi

正確時返回示例以下:

{

    "errcode": 0,

    "errmsg": "ok",

    "ticket": "dsf8sdf87sd7f87sd8v8ds0vs09dvu09sd8vy87dsv87",

    "expires_in": 7200

}

參數

說明

errcode

錯誤碼

errmsg

錯誤信息

ticket

用於JS API的臨時票據

expires_in

票據過時時間

出錯時返回示例以下:

{

    "errcode": 45009,

    "errmsg": "接口調用超過限制"

}

 


3.獲取簽名參數

在前端進行免登鑑權以前,咱們要先拿到一些免登鑑權的參數,主要有有urlnonceStr, agentId, timeStamp, corpId 。

參數

說明

企業

ISV

url

當前網頁的URL,不包含#及其後面部分

 

 

nonceStr

隨機串,本身定義

 

 

agentId

應用的標識

編輯企業應用能夠看到

在ISV調用get_auth_info接口裏面能夠獲取

timeStamp

時間戳

當前時間,可是前端和服務端進行校驗時候的值要一致

當前時間,可是前端和服務端進行校驗時候的值要一致

corpId

企業ID

企業ID,在開發者後臺中企業視圖下開發者帳號設置裏面能夠看到

經過在頁面地址上追加?corpId=CORPID進行獲取

注:url參數須要注意,若是url?號後有中文參數,則參數須要進行URLDecoder.decode(「name=&age=18」);處理


4.生成簽名

在服務端經過sign(ticketnonceStrtimeStampurl)計算前端校驗須要使用的簽名信息。

代碼展現:

  public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException {

String plain = "jsapi_ticket=" + ticket + "&noncestr=" + nonceStr + "×tamp=" + String.valueOf(timeStamp)

+ "&url=" + url;

try {

MessageDigest sha1 = MessageDigest.getInstance("SHA-1");

sha1.reset();

sha1.update(plain.getBytes("UTF-8"));

return bytesToHex(sha1.digest());

} catch (NoSuchAlgorithmException e) {

throw new OApiResultException(e.getMessage());

} catch (UnsupportedEncodingException e) {

throw new OApiResultException(e.getMessage());

}

}

//bytes類型的數據轉化爲16進制類型

private static String bytesToHex(byte[] hash) {

Formatter formatter = new Formatter();

for (byte b : hash) {

formatter.format("%02x", b);

}

String result = formatter.toString();

formatter.close();

return result;

}

 

將:urlnonceStragentIdtimeStampcorpIdsignature傳遞到前端頁面,在前端HTML5頁面使用jsapi提供的dd.config接口進行簽名校驗。

封裝成JSON 字符串:

"{\"jsticket\":\"" + ticket + "\",\"signature\":\"" + signature + "\",\"nonceStr\":\"" + nonceStr + "\",\"timeStamp\":\""

+ timeStamp + "\",\"corpId\":\"" + Env.CORP_ID + "\",\"agentid\":\"" + Config.agentId + "\"}"


5.引入JS

<script src="http://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>

注:若是頁面地址是HTTPS協議,這個jssrc也必須使用HTTPS,即:

<script src="https://g.alicdn.com/dingding/dingtalk-jsapi/2.0.57/dingtalk.open.js"></script>


6.JSAPI鑑權

示例代碼:

dd.config({

    agentId: '', // 必填,微應用ID

    corpId: '',//必填,企業ID

    timeStamp: , // 必填,生成簽名的時間戳

    nonceStr: '', // 必填,生成簽名的隨機串

    signature: '', // 必填,簽名

    type:0/1,   //選填。0表示微應用的jsapi,1表示服務窗的jsapi;不填默認爲0。該參數從dingtalk.js的0.8.3版本開始支持

    jsApiList : [

'runtime.info',

'biz.contact.choose',

'device.notification.confirm',

'device.notification.alert',

'device.notification.prompt',

'biz.ding.post',

'biz.util.openLink',

] // 必填,須要使用的jsapi列表,注意:不要帶dd。

});

參數

參數類型

必須

說明

agentId

String

微應用ID,普通企業能夠經過OA後臺的微應用-設置查看agentId,點擊查看。ISV須要經過調用受權成功後的get_auth_info獲取受權方的agentId

corpId

String

企業ID

timeStamp

String

生成簽名的時間戳

nonceStr

String

生成簽名的隨機串

signature

String

JS-API簽名,能夠參考簡易教程中的獲取簽名的示例代碼

type

number

若是是要調用服務窗的jsapi,請填1

jsApiList

Array

須要調用的jsapi列表

URL不一致致使免登報錯52013,簽名校驗失敗?

  1. 用戶後端簽名使用的url地址和前端訪問地址須要嚴格一致,包括端口號。前端部分能夠用alert顯示出當前的location.href,後端部分請在簽名的時候打印日誌。
  2. 訪問經過反向代理服務器、各類NAT等場景下容易出現這種問題,如http缺省的80端口,和顯式增長80的不是同一個URL。
  3. 檢查確認獲取的jsapiticket是否正確或者過時。jsapiticket是否有效期內重複獲取致使jsapiticket被覆蓋。

經過error接口處理失敗驗證

dd.config驗證失敗會執行error函數,錯誤信息能夠在返回的error參數中參看,下面爲error信息示例:

dd.error(function(error){

       /**

        {

           errorMessage:"錯誤信息",// errorMessage 信息會展現出釘釘服務端生成簽名使用的參數,請和您生成簽名的參數做對比,找出錯誤的參數

           errorCode: "錯誤碼"

        }

       **/

       alert('dd error: ' + JSON.stringify(err));

});

相關文章
相關標籤/搜索