Vue实现免密登录跳转的方式

需求背景:

最近接到这样一个需求,点击某个url要跳转到某个系统的首页。

实现思路:

首先,我们要明确一个点,系统中所有的操作都要携带Token去发送请求,而登录一般是获取Token的来源,点击url实现跳转,并不意味着,不需要登录,只是我们在点击url的过程中,去帮助用户去做登录跳转的操作。达成了这个共识,我们就好去实现了,方案如下:

方案一:url中必须有某个标识,用于判断是否免登录,比如:http://localhost:8300/#/login?isFreeLogin=1

通过判断isFreeLogin==1去判断是否免登录,如果免登录,则通过固定的账号、密码或者是在url中携带账号、密码(不安全)。然后抓取url中的参数,调登录接口,实现跳转。具体的实现如下:

router.beforeEach((to, from, next) => {
  NProgress.start()
  const { isFreeLogin, password } = getQueryVariable()
  const url = window.location.href
  // 存在特殊字符的处理方式
  const passwordPattern = /[!@#%$^\\| ]/
  if (password && passwordPattern.test(password)) { 
    const newUrl = url.replace(/(password=)[^&]*/, `$1${tranAscii(password)}`)   //密码中的特殊字符用一个别的特定字符替代
    window.location.href = newUrl
  } else {
    if (Number(isFreeLogin) === 1 && to.path === '/login' && from.path == '/') {
      loadingInstance = Loading.service({
        background: 'rgba(255,255,255,0.1)',
        text: '页面跳转中...',
        customClass: 'login-loading',
        spinner: 'el-icon-loading'
      })
      setFormData(() => {
        next()
      })
    } else {
      if (to.path === '/') return next('/login')
      const token = localStorage.getItem('Admin-Token')
      if (!token && to.path !== '/login') return next('/login')
      next()
    }
  }
})

router.afterEach((to, from) => {
  NProgress.done()
  loadingInstance.close()
})
export default router

function setFormData(cb) {
  // 判断url后是否携带?isFreeLogin=1参数,如果存在,则免登录
  const { username, password, isFreeLogin } = getQueryVariable()
  if (isFreeLogin && Number(isFreeLogin) === 1) {
    if (username !== undefined && password !== undefined) {
      Vue.prototype.loginForm = {
        username: username.trim(),
        password: password.trim()  //此处密码要做同步处理
      }
    } else {
      Message.error({
        showClose: true,
        message: '用户名或密码为空!'
      })
      cb && cb()
    }
  }
  if (JSON.stringify(Vue.prototype.loginForm) !== '{}') {
    handleLogin(Vue.prototype.loginForm, cb)
    Vue.prototype.loginForm = {}
  }
}

//登录逻辑
async handleLogin(form,cb){
try{
await login(form)
cb&&cb()
}catch{
cb&&cb()
}
}

 要注意一下两个问题:

(1)url中因为携带了账号、密码,密码可能会存在特殊字符,如果后端接口做了特殊字符的过滤,可能会报400的错误

(2)要处理url中未携带账号密码的情况(你可以用个固定的账号、密码)以及账号、密码错误的情况。

以上代码包含了上述问题的处理

方案二:通过后端去处理。点击url的时候,给后端发一个请求,让后端返回登录账号信息,然后前端调用登录接口,实现页面跳转。

如果有更好的方案,欢迎评论、留言~

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Vue实现钉钉登录获取用户信息,你可以按照以下步骤进行操作: 1. 引用中的代码示例,首先在Vue组件中引入钉钉的JSAPI库,并定义一个函数`dingding_no_login`来处理钉钉登录的逻辑。 2. 使用`dd.ready`方法来确保钉钉环境准备就绪后,调用`dd.runtime.permission.requestAuthCode`方法获取登授权码。在`onSuccess`回调中,可以通过`info.code`获取到登授权码。 3. 将登授权码发送给后端接口进行验证,并获取用户信息。可以使用`await`关键字来等待后端接口返回结果。 4. 在获取到用户信息后,可以进行相应的或保存用户信息的操作。 以下是一个示例代码,展示了如何在Vue实现钉钉登录获取用户信息: ```javascript import * as dd from 'dingtalk-jsapi' export default { methods: { async dingding_no_login() { if (dd.env.platform != 'notInDingTalk') { dd.ready(async () => { dd.runtime.permission.requestAuthCode({ corpId: "企业id", onSuccess: async (info) => { const res = await dingdingNoLogin({ code: info.code }) // 进行或保存token的操作 } }); }); } } }, mounted() { this.dingding_no_login(); } } ``` 注意替换代码中的"企业id"为你的实际企业id。同时,你需要根据实际需求进行相应的或保存用户信息的操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [前端vue 钉钉内部使用公司内部系统登录 微应用登录](https://blog.csdn.net/weixin_64064327/article/details/125711817)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [钉钉 基于vue开发h5微应用,登录获取用户信息](https://blog.csdn.net/weixin_40079913/article/details/120198601)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值