文章目录

  • 前言
  • 一、引入钉钉扫码登录JSSDK
  • 二、使用步骤
  • 1.通过打开授权页面的方式
  • 2.通过扫描二维码的方式登录
  • 三、踩坑
  • 四、解决方法
  • 重新组装回调之后的路径
  • 总结



前言

vue接入钉钉登录及遇到的问题


一、引入钉钉扫码登录JSSDK

在index.html中引入

<script src="https://g.alicdn.com/dingding/h5-dingtalk-login/0.21.0/ddlogin.js"></script>

二、使用步骤

1.通过打开授权页面的方式

钉钉的配置使用后端配置好的,通过接口返回,参数主要是重定向的url地址(需要encode),和client_id。
代码如下:

// 跳转链接钉钉操作
    ddHrefLogin() {
      const { agentId, url } = this.ddConfig;
      const cloneUrl = encodeURIComponent(url);
      const hrefUrl = `https://login.dingtalk.com/oauth2/auth?redirect_uri=${cloneUrl}&response_type=code&client_id=${agentId}&scope=openid&state=dddd&prompt=consent`;
      window.open(hrefUrl, '_self');
    },

扫码完成之后,页面会重定向到配置的地址上,附带authCode就是需要这个参数
在created生命周期中使用自己项目的登录接口

// 获取到钉钉返回的code就请求登录接口
    if (this.$route.query.authCode) {
      this.handleCodeLogin(this.$route.query.authCode);
    }

2.通过扫描二维码的方式登录

代码如下:

ddLoginInit() {
      const _this = this;
      window.DTFrameLogin(
        {
          id: "qr-code-scan", // 装钉钉二维码的盒子
          width: 300,
          height: 300,
        },
        {
          redirect_uri: encodeURIComponent(_this.ddConfig.url),
          client_id: _this.ddConfig.agentId,
          scope: "openid",
          response_type: "code",
          prompt: "consent",
          state: "ddd",
        },
        (loginResult) => {
          const { redirectUrl, authCode, state } = loginResult;
          console.log("loginResult", loginResult);
          console.log("_this.ddConfig", _this.ddConfig);
          // 这里可以直接进行重定向
          window.location.href = redirectUrl;
          // 也可以在不跳转页面的情况下,使用code进行授权
          console.log(authCode);
        },
        (errorMsg) => {
          // 这里一般需要展示登录失败的具体原因
          alert(`Login Error: ${errorMsg}`);
          console.log("_this.ddConfig", _this.ddConfig);
        }
      );
    },

取到authCode之后做自己的操作

三、踩坑

vue的hash模式,钉钉重定向回来的地址有误,路径错误无法获取到$route.query.authCode

期望得到的回调地址:

https://xxxx/#/login?authCode=faf0517xxxxxxxxxxxxxxx96373&state=dddd

实际在hash模式下得到的回调地址:

https://xxxx/?authCode=faf0517xxxxxxxxxxxxxxx96373&state=dddd#/login

四、解决方法

重新组装回调之后的路径

created() {
    //code是登录所需最终参数
    let url = new URL(window.document.URL); // 获取路径
    const code = this.$utils.string.getUrlKeyVal("authCode"); // 通过路径获取authCode
    if (url.search && code) { // 钉钉重定向地址错误 重新组装路径
      window.open(`${url.origin}${url.hash}&authCode=${code}`, '_self')
    }
    // 获取到钉钉返回的code就请求登录接口
    if (this.$route.query.authCode) {
      this.handleCodeLogin(this.$route.query.authCode);
    }
  },

获取路径中对应key的值方法

const getUrlKeyVal = (key) => {
  var value = "";
  ///获取当前页面的URL
  var sURL = window.document.URL;
  ///URL中是否包含查询字符串
  if (sURL.indexOf("?") > 0) {
    //分解URL,第二的元素为完整的查询字符串
    //即arrayParams[1]的值为【id=1&action=2】
    var arrayParams = sURL.split("?");
    //分解查询字符串
    //arrayURLParams[0]的值为【id=1 】
    //arrayURLParams[2]的值为【action=add】
    var arrayURLParams = arrayParams[1].split("&");
    //遍历分解后的键值对
    for (var i = 0; i < arrayURLParams.length; i++) {
      //分解一个键值对
      var sParam = arrayURLParams[i].split("=");
      if (sParam[0] == key && sParam[1] != "") {
        //找到匹配的的键,且值不为空

        value = sParam[1];

        break;
      }
    }
  }
  return value;
},

总结

以上就是vue钉钉登录的内容,主要就是vue hash模式下的坑,导致回调地址错误。