passport-dingtalk2
如何快速让你的网站接入钉钉?
如果最小代码改动支持钉钉扫码登录?
兼容最新版的三方登录验证库来了~
最近在改造一个开源项目,用于内部团队学习,发现其整体代码架构非常干净,插件化的机制存在于各个角落。于是在接入钉钉扫码登录的过程中,发现钉钉更新了其新版的授权方式,类似于slack、github的应用授权,于是基于passport-dingtalk改造了一下,使其支持新版的授权方式。
Use
// npm or cnpm
npm install passport-dingtalk2
// yarn
yarn add passport-dingtalk2 -D
用户授权信息构造:
//目前未返回corpId,不改变底层情况下通过字符串拼接解决
Strategy.prototype.userProfile = function(accessToken, done,cropId) {
urllib.request(
this._oauth2._userProfileURL,
{
headers: {
"Content-Type": "application/json",
"x-acs-dingtalk-access-token": accessToken
},
method: "GET",
dataType: "json"
},
function(err, data, res) {
console.log(data,'打印返回信息')
return done(null, {
provider: "dingtalk",
id: data.openId,
name: data.nick,
cropId:cropId,
privateId: data.unionId,
mobile: data.mobile,
email: data.mobile, //官方缺少email字段,待修复
headurl: data.avatarUrl,
_json: data
});
}
);
};
调用方法:
import { Strategy as dingtalkStrategy } from "passport-dingtalk2";
import passport from "koa-passport";
const DING_CLIENT_ID = process.env.DING_CLIENT_ID;
const DING_CLIENT_SECRET = process.env.DING_CLIENT_SECRET;
const DING_CALLBACK_URL = process.env.DING_CALLBACK_URL;
passport.use(
new dingtalkStrategy(
{
clientID: DING_CLIENT_ID,
clientSecret: DING_CLIENT_SECRET,
host: process.env.URL,
callbackURL: DING_CALLBACK_URL
},
async function(accessToken, refreshToken, profile, done) {
try {
// 封装应用需要的参数
const result = await accountProvisioner({
...data
});
return done(null, result.user, result);
} catch (err) {
return done(err, null);
}
}
)
);
Link
github地址:github.com/MaleWeb/pas…
npm地址:www.npmjs.com/package/pas…