需求场景
在钉钉内打开一些第三方应用,不需要登录,打开后直接登录。
当然是有一个绑定操作的,在绑定后可以不登录,未绑定的话,是不行的。
未绑定的用户可以选择用户名和密码登录,登录后再绑定。
相关文档
按说明操作到第三步就可以了。就可以得到dingid,openid了。此时就可以做绑定了。
得到信息如下
{
errcode: 0,
errmsg: 'ok',
user_info: {
nick: '朱鹏飞',
unionid: 'lArDSuIBZpcgiihGOxNPelAiEiE',
dingId: '$:LWCP_v1:$D3Dc93cwaQGW30AWh7B97w==',
openid: 'liSyiPZzq2gY8aktzXCeF1wQiEiE',
main_org_auth_high_level: true
}
}
剩下的就是业务方面的了,在业务内绑定。
钉钉没有提供Nodejs的sdk,本人贴出自己写的nodejs的代码,大家可以直接使用
const crypto = require('crypto');
var request = require("request");
export function sign(timestamp) {
const appSecret = 'XXXXXXXXXXXXXX';
const hmac = crypto.createHmac('sha256', Buffer.from(appSecret, 'utf8'));
// hmac.update(Buffer.from(timestamp + "\n" + 'TestSuiteTicket', 'utf8'));
hmac.update(Buffer.from(timestamp + '', 'utf8'));
let sign = hmac.digest('base64');
console.log('1', sign); // kXogg18q...
// sign = sign.replace("+", "%20").replace("*", "%2A").replace("~", "%7E").replace("/", "%2F")
// 钉钉加签最后需要urlencode
let sign_urlencode = encodeURIComponent(sign);
console.log('2', sign_urlencode)
// ceux%2BxGQccRY...
return sign_urlencode;
}
/**
* 获取钉钉用户信息
* @param code
* @returns
*/
export function getDingdingUserInfo(code: string) {
return new Promise((resolve, reject) => {
let timestamp = new Date().getTime();
// let timestamp = 1617514541063;
let signature = sign(timestamp);
let url = 'https://oapi.dingtalk.com/sns/getuserinfo_bycode';
url += '?accessKey=XXXXXXXXXXXXXXXXX';
url += '&signature=' + signature;
url += '×tamp=' + timestamp;
console.log(`timestamp:${timestamp}`);
console.log(`signature:${signature}`);
console.log(`url:${url}`);
var options = {
method: 'POST',
url: url,
// qs:
// {
// accessKey: 'dingoaq7eiviborolca0cp',
// timestamp: timestamp,
// signature: signature
// },
headers:
{
// 'Postman-Token': '4f5713ed-9ae9-41cd-847a-c96eef3ecb34',
// 'cache-control': 'no-cache',
'Content-Type': 'application/json;charset=utf-8',
// 'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW'
},
body: { tmp_auth_code: code },
json: true
};
request(options, function (error, response, body) {
if (error) throw new Error(error);
if (error) {
reject(error);
}
else {
console.log('response', response);
console.log('body', body);
if (body.user_info)
resolve(body.user_info)
else
resolve(body)
// resolve(JSON.parse(body));
}
// console.log('response', response);
// return body;
});
});
}