【项目经验】钉钉免密登录实现

实现方案

一、项目代码实现

clike 复制代码
//引入钉钉jsapi
import * as dd from "dingtalk-jsapi";
//将Global全局变量挂载到Vue实例上
Vue.prototype.GLOBAL = global_;


//公司ID
const CorpId = "ding*************8e";
//H5应用的AppKey
const AppKey = "din**************sa";
//H5应用的AppSecret
const AppSecret =
  "bBP*********************************WKo0";
//H5应用的AgentId
const AgentId = "10*******24";

//定义当前用户id变量,用于接收当前用户id
var current_user_id = "";
//定义权限码,用于接收钉钉免密登录后得到的权限码
var auth_code = "";

console.log(dd.env.platform);
/**
 *@description:钉钉免密登录获取auth_code
 *@params: 无
 *@author: Yolanda
 *@date: 2021-02-26 14:17:03
 *@version: V1.0.0
 */
dd.ready(function() {
  dd.runtime.permission.requestAuthCode({
    corpId: CorpId,
    onSuccess: function(info) {
      auth_code = info.code;
      console.info("钉钉免密登录auth_code:" + auth_code);
      login();
    },
    onFail: function(err) {
      alert("err:" + err);
      console.log(err);
    }
  });
});


/**
 *@description:登录方法,串联get_access_token()方法
 *@params: 无
 *@author: Yolanda
 *@date: 2021-02-26 14:13:15
 *@version: V1.0.0
 */
function login() {

  get_access_token();
}

/**
 *@description:获取accesstoken,调用get_current_user_id()方法
 *@params: 无
 *@author: Yolanda
 *@date: 2021-02-26 14:12:57
 *@version: V1.0.0
 */
function get_access_token() {
  axios
    .get("/api/gettoken", {
      params: {
        appkey: AppKey,
        appsecret: AppSecret
      }
    })
    .then(function(response) {
      // alert("get response:" + JSON.stringify(response))
      // get_jsapi_ticket(response.data.access_token);
      get_current_user_id(response.data.access_token);
      console.log("获取accesstoken:" + response.data.access_token);
    })
    .catch(function(error) {
      alert("获取access_token错误:" + JSON.stringify(error));
      console.log(error);
    });
}

/**
 *@description:获取当前用户的dingId,根据dingId调用queryUserInfoByDingId()方法查询权限库里userId和userName,
                再将查到的userId作为executePlanOntime()方法的参数执行;
 *@params: 无
 *@author: Yolanda
 *@date: 2021-02-26 14:14:27
 *@version: V1.0.0
*/
function get_current_user_id(access_token) {
  axios
    .get("/api/user/getuserinfo", {
      params: {
        access_token: access_token,
        code: auth_code
      }
    })
    .then(function(response) {
      current_user_id = response.data.userid;
      Vue.prototype.GLOBAL.dingId = current_user_id;
      Vue.prototype.GLOBAL.dingName = response.data.name;
      console.log("获取当前用户dingId:" + Vue.prototype.GLOBAL.dingId);
      console.log("获取当前用户钉钉名:" + Vue.prototype.GLOBAL.dingName);
      console.log("=============================================");
      //根据dingId查询权限库用户表的用户信息
      queryUserInfoByDingId(Vue.prototype.GLOBAL.dingId).then(response => {
        console.log(response);
        Vue.prototype.GLOBAL.userId = response.data.id;
        Vue.prototype.GLOBAL.userName = response.data.userName;
        console.log("获取当前用户id:" + Vue.prototype.GLOBAL.userId);
        console.log("获取当前用户名:" + Vue.prototype.GLOBAL.userName);
        //根据获取到的UserId进行权限判定和页面跳转
        judgemental(Vue.prototype.GLOBAL.userId);
        //执行当前用户当前时间需要执行的计划
        // executePlanOntime(Vue.prototype.GLOBAL.userId);
        console.log("获取当前用户ID:" + Vue.prototype.GLOBAL.userId);
        localStorage.setItem("notict", "欢迎使用LPM学习流程管理!!");
        localStorage.setItem("userName", response.data.userName);
      });
      // 设置管理员账号,在此处写入管理员的钉钉账号名,则管理员在钉钉登录系统时可以使用Vconsole
      // var adminNames = ["杨*梅", "刘*娇", "刘*欢", "吉*","何*芳","王*春", "郝*飞","李*诚","纪*光"]
      // if (adminNames.indexOf(response.data.name) >= 0) {
      //   const Vconsole = new VConsole()
      //   Vue.use(Vconsole)
      // }
    })
    .catch(function(error) {
      alert("获取用户id错误:" + JSON.stringify(error));
    });
}

function get_jsapi_ticket(access_token) {
  axios
    .get("/api/get_jsapi_ticket", {
      params: {
        access_token: access_token
      }
    })
    .then(function(response) {
      var ticket = response.data.ticket;
      getsign(ticket);
    })
    .catch(function(error) {
      alert(error);
    });
}

function getsign(ticket) {
  var nonceStr = "dmsd";
  var timeStamp = new Date().getTime();
  var url = window.location.href;
  axios
    .get("/api/dmsd/getsign", {
      params: {
        nonceStr: nonceStr,
        timeStamp: timeStamp,
        url: url,
        ticket: ticket
      }
    })
    .then(function(response) {
      var sign = response.data.data;
      dd.config({
        agentId: AgentId,
        corpId: CorpId,
        timeStamp: timeStamp,
        nonceStr: nonceStr,
        signature: sign,
        jsApiList: [
          "runtime.info",
          "biz.contact.choose",
          "device.notification.confirm",
          "device.notification.alert",
          "device.notification.prompt",
          "biz.ding.post",
          "biz.util.openLink",
          "device.audio.startRecord",
          "device.audio.stopRecord",
          "device.audio.translateVoice"
        ]
      });
    })
    .catch(function(error) {
      alert(error);
    });
}

二、项目部署配置

clike 复制代码
        location /api/gettoken {
             rewrite /api/(.*)$ /$1 break;
             add_header 'Access-Control-Allow-Origin' '*';
             proxy_pass https://oapi.dingtalk.com;
        }

        location /api/user/getuserinfo/ {
            rewrite /api/(.*)$ /$1 break;
            add_header 'Access-Control-Allow-Origin' '*';
            proxy_pass https://oapi.dingtalk.com;
        }

        location /api/get_jsapi_ticket {
           rewrite /api/(.*)$ /$1 break;
            add_header 'Access-Control-Allow-Origin' '*';
            proxy_pass https://oapi.dingtalk.com;
        }
相关推荐
子兮曰4 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰4 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万4 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝4 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋4 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁4 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄4 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95274 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大4 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师4 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端