前端应该如何做单点登录,跨域处理等

楼主关于单点登录狠狠的踩了一次坑,这事完结了以后再回首之前的做法觉得自己好傻 ?

单点登录

什么是单点登录呢 ?

单点登录(Single Sign On),简称为SSO,是目前比较流行的企业业务整合的解决方案之一。 SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统

了解之后,那么我们的需求是 ?
  1. 当第三方点击某个菜单(或按钮)时,我(前端)要向第三方发送一个jsonp请求获取令牌(token)
  2. 获取到令牌之后,以这个令牌为参数,向后端发送验证请求,后端拿到令牌之后去redies里找到用户信息进行登录,返回数据给前端,over
Do it !我们的法宝 ------ 路由拦截 ✨

全局前置守卫 beforeEach

官方解说

当一个导航触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫 resolve 完之前一直处于 等待中。

const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
  // ...
})

也就是说,我们只要在路由文件里做一个路由前置守卫就可以搞定了,发请求登陆成功之后,该跳哪个页面跳哪个页面,登陆失败就跳转到第三方的登录页面。

**话不多说,接下来代码警告 **

router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import sso from './sso'
Vue.use(Router)

const routes = [
    //...
]

const router = new Router({
    routes,
})

router.beforeEach(sso)

sso.js

import Vue from 'vue'
import $ from "jquery";
const ssoRedirect = '/home'
const xxxUrl = 'http://xxx' // 第三方地址
export default async function(to, from, next) {
  if (to.path !== '/aaa/bbbLogin') {
    next()
  } else if(to.path === '/aaa/bbbLogin') {
    $.ajax({
      async: false,
      type: "GET",
      dataType: 'jsonp',
      jsonp: 'callback',
      jsonpCallback: 'jsonpCallback',
      url: xxxUrl + '/direct/saveSSOtoken',
      success: function (msg) {
        console.log(msg)
        $.ajax({
          url: global.baseUrl + '/gateway/extra_login',
          data: msg,
          type: "POST",
          async: false,
          dataType: "json",
          success: function(res) {
            if (res.code == 0) {
              cache.setItem('tgt_id', res.data) // 保存登录的票据
              store.commit('setToken', res.data)
              next(ssoRedirect)
            } else {
              console.log('跳转到第三方登录页面')
              window.location.href = xxxUrl + '/direct/'
            }
          },
          error: function (err) {
            console.log(err)
            window.location.href = xxxUrl + '/direct/'
          }
        });
      }
    })
  } else {
    Vue.prototype.$message({
      type: 'error',
      message: '登录失败',
    })
  }
}

以上。

ps: 之前的做法是在主页面的created()里面去发送请求,勉勉强强可以用,但是非常之麻烦,因为本身项目是可以用户名密码登录的,做这个单点登录时没有考虑到同时不能影响到正常登录,所以,emm…改良了现在这种方式,还是文档看少了?

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值