釘釘H5微應(yīng)用調(diào)用釘釘api,如何實(shí)現(xiàn)鑒權(quán)

###關(guān)于釘釘H5微應(yīng)用前端鑒權(quán)方法

1.安裝包

npm install --save crypto-js? // 加密,用于生成數(shù)字簽名

npm install dingtalk-jsapi --save? // 釘釘JSAPI

npm install axios --save? ? // HTTP請(qǐng)求

2.前端獲取code發(fā)送給后端,從而獲取用戶信息

你可以全局引入,也可以按需引入

import * as dd from "dingtalk-jsapi";

dd.ready(function() {

? dd.runtime.permission.requestAuthCode({

corpId: "xxx",

onSuccess: function(result) {

console.log(result.code)? ? ? ? ? ? ? ? ? ? //result.code就是獲取到的臨時(shí)code,只有五分鐘的權(quán)限時(shí)間

},

onFail : function(err) {

? console.log(err)

}?

? })

})

###.corpId 可以從開(kāi)發(fā)者管理員后臺(tái)中得到

### 當(dāng)前請(qǐng)求只能在釘釘環(huán)境下使用,如果在正常瀏覽器下訪問(wèn),會(huì)顯示當(dāng)前環(huán)境不符合,從而引發(fā)報(bào)錯(cuò)

3.獲取鑒權(quán)方式(前端)

### (如果你非要在前端請(qǐng)求的話)

1.第一步:獲取access_token,(這里需要appkey和appsecret)

appkey和appsecret實(shí)在開(kāi)發(fā)者管理后臺(tái)中可以得知

通過(guò)請(qǐng)求https://oapi.dingtalk.com/gettoken?appkey=xxxj&appsecret=xxx

### 但是切記這樣有兩個(gè)問(wèn)題? 1:安全性太低,這樣很容易被人通過(guò)抓包獲取到你的信息

2:這個(gè)請(qǐng)求需要跨域,如果靠前端做的話,開(kāi)發(fā)模式還沒(méi)問(wèn)題,但是生產(chǎn)模式下,需要后端幫忙做反向代理,

### 最終這樣會(huì)返回一個(gè) access_token 給你

2.第二步:需要通過(guò)獲取到的 access_token 再去獲取 jsapi_ticket,

###請(qǐng)求地址:https://oapi.dingtalk.com/get_jsapi_ticket?access_token=${this.token}

最終會(huì)返回一個(gè)ticket給你

3.第三步:需要給ticket加密,這樣釘釘那邊會(huì)通過(guò)你的加密方式,進(jìn)行解密(所以我懷疑釘釘后端用的也是這個(gè)加密方式)

### 引入加密的包

import CryptoJS from 'crypto-js';

getJsApiSingnature(ticket, nonce, timeStamp ,url) {??

let plainTex = "jsapi_ticket=" + ticket + "&noncestr=" + nonce + "&timestamp=" + timeStamp + "&url=" + url;

let signature = CryptoJS.SHA1(plainTex).toString();

console.log(signature)

this.signature = signature

}

答疑解惑時(shí)間:

ticket:就是你獲取到的ticket,

nonce:是用來(lái)加密的隨機(jī)字符串, (需保存)

timeStamp:是當(dāng)前時(shí)間戳? (需保存)

url:是你當(dāng)前網(wǎng)頁(yè)的url地址? 可以通過(guò)window.location.href獲取,切記#及其后面的不需要,

所以還需要對(duì)獲取到的url地址進(jìn)行截取? a.split('#')[0]

4.第四步: 釘釘鑒權(quán)申請(qǐng)請(qǐng)求api權(quán)限,

dd.config({

agentId: 'XXX', // 必填,微應(yīng)用ID

corpId: 'XXX',//必填,企業(yè)ID

timeStamp: that.timeStamp, // 必填,生成簽名的時(shí)間戳

nonceStr: that.nonce, // 必填,生成簽名的隨機(jī)串

signature: that.signature, // 必填,簽名

type:0,? //選填。0表示微應(yīng)用的jsapi,1表示服務(wù)窗的jsapi;不填默認(rèn)為0。該參數(shù)從dingtalk.js的0.8.3版本開(kāi)始支持

jsApiList : [

'runtime.info',

'biz.contact.choose',

'device.notification.confirm',

'device.notification.alert',

'device.notification.prompt',

'biz.ding.post',

'biz.util.openLink',

'biz.contact.complexPicker'

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

});

const that = this

dd.ready(function(){

dd.biz.contact.complexPicker({

title:"客戶分享",? ? ? ? ? ? //標(biāo)題

corpId:"XXX",? ? ? ? ? ? ? //企業(yè)的corpId

multiple:true,? ? ? ? ? ? //是否多選

limitTips:"超出了",? ? ? ? ? //超過(guò)限定人數(shù)返回提示

maxUsers:1000,? ? ? ? ? ? //最大可選人數(shù)

pickedUsers:[],? ? ? ? ? ? //已選用戶

pickedDepartments:[],? ? ? ? ? //已選部門

disabledUsers:[],? ? ? ? ? ? //不可選用戶

disabledDepartments:[],? ? ? ? //不可選部門

requiredUsers:[],? ? ? ? ? ? //必選用戶(不可取消選中狀態(tài))

requiredDepartments:[],? ? ? ? //必選部門(不可取消選中狀態(tài))

appId:XXX,? ? ? ? ? ? ? //微應(yīng)用的Id

permissionType:"GLOBAL",? ? ? ? ? //可添加權(quán)限校驗(yàn),選人權(quán)限,目前只有GLOBAL這個(gè)參數(shù)

responseUserOnly:true,? ? ? ? //返回人,或者返回人和部門

startWithDepartmentId:0 ,? //僅支持0和-1

onSuccess: function(result) {

console.log(result)

let a = []

result.users.forEach(v=>{

????????a.push(v.emplId) //這個(gè)就是用戶工號(hào)

})

},

onFail : function(err) {

console.log(err)

}

});

})

最終就可以實(shí)現(xiàn)鑒權(quán)成功,調(diào)用你在jsApiList中存入的api方法

切記切記:只能在釘釘客戶端實(shí)現(xiàn)鑒權(quán),在其他瀏覽器都會(huì)出現(xiàn)當(dāng)前環(huán)境不允許的錯(cuò)誤

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容