详解Vue微信授权登录前后端分离较为优雅的解决方案


Posted in Javascript onJune 29, 2018

微信授权登录是一个非常常见的场景,利用微信授权登录,我们可以很容易获取用户的一些信息,通过用户对公众号的唯一openid从而建立数据库绑定用户身份.

微信授权登录的机制这里不做详述,微信官方文档已有详述,简述就是通过跳转微信授权的页面,用户点击确认后,微信会跳到回调页面,此时回调页面url上会携带code参数,通过code参数,后端可以拿code换取拥护openid,或者用户信息

在vue项目中,通常是一个SPA应用,即所有的页面都是同一个html,通常现在开发也是前后端彻底分离的,vue打包后生成的纯静态文件,甚至可以不经过服务器,所以通过后端弄跳转之类的都不太优雅,本文即介绍此类场景的微信授权登录

对于一个vue的SPA应用,我们通常可能有很多页面,在微信公众号上我们可能配置多个菜单,多个菜单对应vue的路由页面,但是可能并不是每个页面都需要用户授权才能进入,有些页面用户不登录也需要可以预览,此时我们可以通过vue router来实现前端路由拦截

router.beforeEach(async (to, from, next) => {
 if (to.matched.some(recode => recode.meta.noAuth)) {
  next()
 } else {
  // store已存在用户信息直接进入页面
  if (store.state.userInfo.nickname) {
   next()
   return
  }
  const code = getUrl(window.location.href).code // 截取url上的code ,可能没有,则返回''空字符串
  let res = await api.post('/imsl/user/user-auth', [code]) // 获取用户信息,后端可首先通过cookie,session等判断,没有信息则通过code获取
  console.log(res)
  // 返回用户信息
  if (res.code === 200 && res.data.is_auth) {
   store.commit('setUserInfo', res.data)
   next()
  } else {
   // 此状态根据业务需求 可能不存在
   if (res.code === 201) {
    const openid = res.data.openid
    console.log(openid)
    store.commit('setOpenid', openid)
    localStorage.setItem('openid', openid)
    next('/enlist-info')
   }
   // 上面的获取用户信息接口,如果cookie,session拿不到用户信息,且传递的code为空,则跳转到微信授权页面
   if (res.code === 202) {
    console.log(window.location.origin)
    console.log(to.fullPath)
    // 这个redirectUrl用 当前页路径或者tof.fullPath(将要进入的路径)
    let redirectUrl = window.location.href
    redirectUrl = encodeURIComponent(redirectUrl)
    console.log(redirectUrl)
    const appid='wxdff0642c2120ea39'
    window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirectUrl}&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect`
   }
  }
 }
})

上述代码基本阐述了一个授权的过程,首先,我们在配置vue路由的时候,设置此路由是否需要登录即给router的meta加一个noAuth:true的属性,这个是处理不需要登录的页面,通过router.beforeEach进行判断,如果是不需要登录的页面:noAuth,则直接next()让其进入相应页面.对于需要登录的页面,则让后端配合,此时,后端写一个获取用户信息的接口,前端则直接调用获取用户信息的接口,当然,不需要每个页面都调用,获取一次之后可以将用户信息存入vuex中,所以通过判断vuex里面有没有用户信息,如果已存在用户信息,则进入页面.没有用户信息那就调用后端获取用户信息的接口,说到这里,终于回到此文主题了,用户信息是通过微信授权登录拿到的,此时后端如何拿到用户信息呢?这里,可以跟后端商议好,用户绑定身份后,后端则可以通过设置cookie,token之类的保存这个用户登录状态,如果有相关状态,那么后端则可以直接返回用户信息. 如果是首次进入,或者cookie,token之类的已失效,那么此时则会调用微信授权登录了,如上述代码所述,分为三种情况,

1. 通过cookie,token等,后端直接拿到了用户信息,此时则拿到用户信息直接进入页面,同时把用户信息存入vuex中

2. 没有用户信息的情况,此时也没有cookie,token,那就需要重新调用微信授权登录了,上面给出的两种返回码code=201,code=202的情况,当code=2是则由前端直接跳转到微信授权页面,而redirectUri则为将要进入的页面,此时会发生什么呢?会跳到微信授权页面,用户点击之后又回到了这个页面,不同的是此时url上面已经携带了code,前端通过字符串截取拿到code,发送给后端,后端即可通过code换取openid以及用户信息了.

总结:

  1. 项目采用前后端完全分离方式,即打包后给的纯静态文件放在服务器,访问index.html
  2. 后端不在接口处拦截,不需要后端跳转微信授权登录页面,由前端路由来拦截跳转,实现方法如3.
  3. 前端在需要用户身份才能进入的页面通过vue-router的 router.beforeEach钩子函数拦截,此时调用获取用户信息接口,后端首先通过获取cookie,token等判断用户,无相关信息返回201或202,当返回202的时候,前端跳转到微信授权页,redirecturi即为要进入的页面的url,跳转授权后微信会在url上面携带code回到当前页,此时前端截取url上的code传给后端,后端通过code在后端处理拿到用户信息,openid等实现了授权登录

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用jquery与图片美化checkbox和radio控件的代码(打包下载)
Nov 11 Javascript
javascript与webservice的通信实现代码
Dec 25 Javascript
JS中confirm,alert,prompt函数区别分析
Jan 17 Javascript
jQuery AJAX实现调用页面后台方法和web服务定义的方法分享
Mar 01 Javascript
JavaScript移除数组内重复元素的方法
Mar 18 Javascript
原生JS实现拖拽图片效果
Aug 27 Javascript
bootstrap学习笔记之初识bootstrap
Jun 21 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
Aug 30 Javascript
浅谈vue的第一个commit分析
Jun 08 Javascript
Vue js with语句原理及用法解析
Sep 03 Javascript
Vue 实现一个简单的鼠标拖拽滚动效果插件
Dec 10 Vue.js
JavaScript实现仿Clock ISO时钟
Jun 29 #Javascript
vue ssr 指南详读
Jun 29 #Javascript
jQuery实现获取动态添加的标签对象示例
Jun 28 #jQuery
Vue实现textarea固定输入行数与添加下划线样式的思路详解
Jun 28 #Javascript
详解swipe使用及竖屏页面滚动方法
Jun 28 #Javascript
微信小程序wx.uploadfile 本地文件转base64的实现代码
Jun 28 #Javascript
浅谈vue首屏加载优化
Jun 28 #Javascript
You might like
PHP静态调用非静态方法的应用分析
2013/05/02 PHP
YII框架常用技巧总结
2019/04/27 PHP
javascript数组组合成字符串的脚本
2021/01/06 Javascript
javascript中的if语句使用介绍
2013/11/20 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
jQuery实现tab选项卡效果的方法
2015/07/08 Javascript
JS+CSS实现美化的下拉列表框效果
2015/08/11 Javascript
js实现iframe框架取值的方法(兼容IE,firefox,chrome等)
2015/11/26 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
node实现的爬虫功能示例
2018/05/04 Javascript
微信小程序车牌号码模拟键盘输入功能的实现代码
2018/11/11 Javascript
jQuery实现经典的网页3D轮播图封装功能【附源码下载】
2019/02/15 jQuery
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
基于canvas实现手写签名(vue)
2020/05/21 Javascript
js实现轮播图效果 纯js实现图片自动切换
2020/08/09 Javascript
Python列表(list)常用操作方法小结
2015/02/02 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
Scrapy框架CrawlSpiders的介绍以及使用详解
2017/11/29 Python
Python 3.x 判断 dict 是否包含某键值的实例讲解
2018/07/06 Python
Flask和Django框架中自定义模型类的表名、父类相关问题分析
2018/07/19 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
python写入文件自动换行问题的方法
2019/07/05 Python
简单易懂Pytorch实战实例VGG深度网络
2019/08/27 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
解决django xadmin主题不显示和只显示bootstrap2的问题
2020/03/30 Python
Python Django中间件使用原理及流程分析
2020/06/13 Python
python根据用户需求输入想爬取的内容及页数爬取图片方法详解
2020/08/03 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
编写一子程序,将一链表倒序,即使链表表尾变表头,表头变表尾
2016/02/10 面试题
MySQL面试题
2014/01/12 面试题
法制报告会主持词
2014/04/02 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
董事长秘书工作总结
2015/08/14 职场文书
 分享一个Python 遇到数据库超好用的模块
2022/04/06 Python
Python使用pandas导入xlsx格式的excel文件内容操作代码
2022/12/24 Python