vue3项目引入钉钉登录

实现效果:
在这里插入图片描述

// dingtalkImg是钉钉图标的路径,网上找个放到项目里面就行
<img :src="dingtalkImg" alt="钉钉登录" class="DingTalk" @click="loginForDT">
const loginForDT = () => {
       // getQrCodeApi 获取二维码的接口 
       getQrCodeApi().then(res => {
         // 获取的二维码的路径
         this.gotoUrl = res.data.data
         // 显示二维码的弹出框
         this.dialogDT = true
    })
  },
<!-- 显示二维码的弹出框 -->
<el-dialog v-model="dialogDT " title="钉钉授权登录" width="400px" :close-on-click-modal="false" @close="handleClose">
    <div id="loginDT" style="transform: scale(.8); text-align: center;" />
</el-dialog>
window.DDLogin({
	id: 'loginDT', // 显示二维码定义的id
    goto: encodeURIComponent(this.gotoUrl),
    style: 'border:none;background-color:#FFFFFF;',
    width: '365',
    height: '400'
 })

二维码显示出来之后:

const DDMessage = (event) => {
	const origin = event.origin
	// 不用怀疑,写死的,都一样
    if (origin === 'https://login.dingtalk.com') {
    	const loginTmpCode = event.data
    	const srcUrl = `https://oapi.dingtalk.com/connect/oauth2/sns_authorize?appid=${datas.appKey}&response_type=code&scope=snsapi_login&redirect_uri=${this.gotoUrl}&loginTmpCode=${loginTmpCode}`
        window.open(srcUrl, '_self')
     }
  }
  window.addEventListener('message', DDMessage, false)
  onBeforeUnmount(() => {
  	window.removeEventListener('message', DDMessage, false)
  })

为了提升用户体验,最好的方式是扫码登录之后不跳走,直接刷新当前页面自动登录,这一部分需要后端的配合,this.gotoUrl里面的重定向地址需要是系统的页面,只有跳转到系统里前端才能控制。
登录页监听路由变化

注意:钉钉扫码登录,它会在你给定的地址后面追加code和state两个变量,这两个是登录信息,而且只能访问一次,第二次访问这两个变量就会失效,钉钉开发者文档上有交代

watch: {
    $route: {
      handler: function(route) {
        const query = route.query
        if (query.code) {
        	// 如果路由里面有code这个变量,表示是通过钉钉扫码登录来的
        	this.getIsBand(query)
        }
      },
      immediate: true
    }
  },
getIsBand(query) {
	  // 把钉钉追加的两个参数传给后端,判断是否已进行过绑定, 
      getBandApi(query).then(res => {
        if (res) {
          const data = res.data.data
          // 如果没有绑定
          if (!data.isBind) {
            ElMessageBox({
              title: '提示',
              message: '<div style="line-height: 40px; text-align: center;">当前钉钉未绑定账号,请绑定后再进行登录</div><div style="line-height: 40px; text-align: center;">绑定步骤:登录系统-个人管理-基本信息</div>',
              confirmButtonText: '确定',
              dangerouslyUseHTMLString: true,
              showCancelButton: false,
              closeOnClickModal: false
            }).then(() => {
              // 如果没有绑定,我这里的设计是回到当前登录页,通过账号密码登入系统再进行绑定
              this.$router.push({
                path: '/login'
              })
            }).catch(() => {})
          } else {
          // 如果已经绑定过了,进行自己的登录逻辑
            this.getToken(data)
          }
        }
      })
    },

小白一枚,如果有遗漏、错误或者不明白的欢迎联系,我们一起学习

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现 Vue 3 钉钉扫码登录,你可以按照以下步骤进行操作: 1. 在钉钉开放平台注册开发者账号,并创建一个应用,获取到 `AppKey` 和 `AppSecret`。 2. 在 Vue 3 项目中安装 `axios`,用于发送 HTTP 请求。可以使用以下命令安装: ``` npm install axios ``` 3. 创建一个登录组件,可以命名为 `Login.vue`,在该组件中包含一个用于展示钉钉扫码的部分。 4. 在 `Login.vue` 组件中,使用钉钉开放平台提供的前端 SDK 进行扫码登录。你可以在 `created` 钩子函数中调用 `dd.config` 方法进行配置,然后调用 `dd.scan` 方法进行扫码操作。 5. 当用户完成扫码并授权登录后,钉钉会回调一个临时授权码。 6. 在 Vue 3 中,你可以在 `Login.vue` 组件中使用 `axios` 发送一个 POST 请求,将临时授权码发送到后端服务器。 7. 后端服务器接收到临时授权码后,使用 `AppKey` 和 `AppSecret` 向钉钉开放平台发送请求,获取用户的持久授权码和用户信息。 8. 后端服务器将持久授权码和用户信息保存在数据库中,并生成一个用户标识(如用户 ID)返回给前端。 9. 前端收到用户标识后,可以将其保存在本地(如使用 `localStorage`),并跳转到其他页面。 请注意,上述步骤只是一个大致的流程,具体实现还需要根据你的项目结构和需求进行调整。同时,钉钉开放平台提供了详细的文档和示例代码,建议你参考这些资源进行开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值