新版钉钉接入第三方网站登录

1,755 阅读1分钟

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…

Screenshots

image-20211225152206991

image-20211225152234849

More