Vue微信项目按需授权登录策略实践思路详解


Posted in Javascript onMay 07, 2018

项目采用Vue作为开发框架,用户浏览页面时有两种情况:

  1. 一种是需要用户先登录之后才能继续浏览;
  2. 另一种是用户无需登录即可随意浏览。

在无需用户登录的页面中,可能包含需要用户信息的操作,此时就需要用户登录之后方能进行后续操作。因此,需要对授权登录策略进行区分。

思路

1.一般而言,我们为微信开发的H5页面,进入页面的时候就进行鉴权,要求用户登录之后才能继续浏览。但由于产品需求,这个项目我们需要对不同页面的鉴权策略进行划分,按照一般与特殊进行设计:

2.一般情况,用户进入页面第一时间要求用户授权登录,按照常规的微信授权登录流程,登录之后,用户继续浏览。

3.特殊情况,为无需用户登录的页面配置白名单,只要进入存在于白名单的路由,不进入检测用户登录状态的函数,直接渲染页面。

对于用户未登录状态下进行的需要用户信息的操作,按照我目前的理解,即使是基于微信的静默授权,页面也必须重新刷新,无法做到真正无感授权并且继续用户的操作。因此我选择在前端层面给用户更友好的提示,让用户了解授权过程,缺点是前一次操作仅仅是触发授权登陆,授权登录后,用户需要再次进行操作。

// routerRule.js
export default function routerRule (router, whiteList = []) {
  // other codes...
  router.beforeEach( (to, from, next ) => {
    // 因为授权登录涉及异步操作,因此使用promise,成功的回调中调用next函数
    new Promise((resolve, rejects) => {
      if ( whiteListRouter.indexOf(to.path) !== -1 ) {
        resolve()
        return
       }
      // 常规页面授权登录过程
      if (hasToken()) {
        // codes,获取用户信息并且跳转所需跳转的页面
      } else {
        // 判断用户是否已经进行微信授权
        if (hasAuthed()) {
          // 进行过微信授权之后,重定向回来的url中包含了微信的授权信息,可以将url上截取的参数发送到服务器,换取用户的token,随后进入上述有token时候的步骤
          getWechatUserInfo().then(res => {
            resolve()
          })
        } else {
          // 用户尚未进行微信授权,则调用微信授权的方法,进行授权登录。
          getWechatAuth()
        }
      }
    }).then( res => {
      next()
    })
  })
  router.afterEach(( to, from ) => {
    wxShare({ title: to.meta.title, desc: to.meta.shareDesc, link: to.meta.shareLink, logo: to.meta.shareLogo})
   })
}

本项目是在用户初次进行微信绑定时,就将用户的微信信息与本站的用户信息进行的绑定,因此在获取用户微信授权信息后,就可以获取到用户的token,从而获取用户在本站的其他用户信息。

在无需登录页面的进行需要权限的操作的处理

根据上面的逻辑,进入白名单之后,整个函数已经被return掉,不会进入下面的鉴权过程。但是如果是在此种页面上进行需要权限的操作,那么就需要触发授权登录流程,并且在授权之后,要一并获取用户信息。

// checkLogin.js
export function checkLogin({ redirectUrl, wxAuthLoading, wxAuthLoaded, callback } = {}) {
  if (getToken()) {
    // ...
    callback && callback()
  } else {
    // 提示用户正在授权中
    wxAuthLoading && wxAuthLoading()
    getWechatAuth( redirectUrl || window.location.href ).then( res => {
      // 授权完毕,提示用户授权成功
      wxAuthLoaded && wxAuthLoaded()
    })
  }
}

同时,我们需要对路由白名单添加一些操作

// routerRule.js
export default function routerRule (router, whiteList = []) {
  // other codes...
  router.beforeEach( (to, from, next ) => {
    // 因为授权登录涉及异步操作,因此使用promise,成功的回调中调用next函数
    new Promise((resolve, rejects) => {
      if ( whiteListRouter.indexOf(to.path) !== -1 ) {
        // 如果已经进行微信授权但是没有token值的,就调用以下函数获取token值
        if ( !hasToken() && hasAuthed() ) {
          getWechatUserInfo().then(res => {
            resolve()
          })
        }
        resolve()
        return
       }
      // 常规页面授权登录过程
      if (hasToken()) {
        // codes,获取用户信息并且跳转所需跳转的页面
      } else {
        // 判断用户是否已经进行微信授权
        if (hasAuthed()) {
          // 进行过微信授权之后,重定向回来的url中包含了微信的授权信息,可以将url上截取的参数发送到服务器,换取用户的token,随后进入上述有token时候的步骤
          getWechatUserInfo().then(res => {
            resolve()
          })
        } else {
          // 用户尚未进行微信授权,则调用微信授权的方法,进行授权登录。
          getWechatAuth()
        }
      }
    }).then( res => {
      next()
    })
  })
  // other codes...
}

坑点以及不完善的地方

1.这个方案在用户授权之后,在路由跳转之前,一定要先获取用户信息,否则在url上的微信授权信息就会丢失,获取用户信息就会失败。

2.这个方案的缺点在于,需要开发者对在免登陆页面的所有需权限操作都加上checkLogin判断。由于这种需权限的操作一般都是发送异步请求,所以如果不考虑减少不必要的异步请求的情况下,可以统一在请求的方法上设置拦截器,判断后端返回的code,如果返回的是用户未登录的code,就进行微信授权。这种做法开发过程比较方便,但是会在用户未登录情况下发送了一些不必要的请求给后端,感觉不太好。

总结

以上所述是小编给大家介绍的Vue微信项目按需授权登录策略实践思路详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
ExtJs中简单的登录界面制作方法
Aug 19 Javascript
javascript获取ckeditor编辑器的值(实现代码)
Nov 18 Javascript
详解JavaScript设计模式开发中的桥接模式使用
May 18 Javascript
jquery html动态添加的元素绑定事件详解
May 24 Javascript
微信小程序page的生命周期和音频播放及监听实例详解
Apr 07 Javascript
Node学习记录之cluster模块
May 31 Javascript
vuex中使用对象展开运算符的示例
Sep 25 Javascript
Vuex 进阶之模块化组织详解
Jan 12 Javascript
vue-cli 组件的导入与使用教程详解
Apr 11 Javascript
详解创建自定义的Angular Schematics
Jun 06 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
Jul 09 Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 Javascript
Vue + better-scroll 实现移动端字母索引导航功能
May 07 #Javascript
node使用promise替代回调函数
May 07 #Javascript
node 使用 async 控制并发的方法
May 07 #Javascript
Angular 数据请求的实现方法
May 07 #Javascript
JavaScript数组去重算法实例小结
May 07 #Javascript
JavaScript求一组数的最小公倍数和最大公约数常用算法详解【面向对象,回归迭代和循环】
May 07 #Javascript
详解VUE-地区选择器(V-Distpicker)组件使用心得
May 07 #Javascript
You might like
PHP中常用的字符串格式化函数总结
2014/11/19 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
字符串的replace方法应用浅析
2011/12/06 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
2012/02/03 Javascript
JS验证身份证有效性示例
2013/10/11 Javascript
jQuery产品间断向下滚动效果核心代码
2014/05/08 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
2016/08/17 Javascript
js窗口震动小程序分享
2016/11/28 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
vue Render中slots的使用的实例代码
2017/07/19 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
微信小程序实现选择地址省市区三级联动
2020/06/21 Javascript
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
Python实现简单的获取图片爬虫功能示例
2017/07/12 Python
高效测试用例组织算法pairwise之Python实现方法
2017/07/19 Python
python将回车作为输入内容的实例
2018/06/23 Python
对Python 3.5拼接列表的新语法详解
2018/11/08 Python
分享Python切分字符串的一个不错方法
2018/12/14 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
python学习将数据写入文件并保存方法
2020/06/07 Python
如何理解transaction事务的概念
2015/05/27 面试题
数控专业应届生求职信
2013/11/27 职场文书
给导游的表扬信
2014/01/10 职场文书
数学检讨书1000字
2014/02/24 职场文书
捐助倡议书范文
2014/04/15 职场文书
环卫工人先进事迹材料
2014/06/02 职场文书
住房抵押登记委托书
2014/09/27 职场文书
敬老院活动感想
2015/08/07 职场文书
企业愿景口号
2015/12/25 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
你会写报告?产品体验报告到底该怎么写?
2019/08/14 职场文书
php解析非标准json、非规范json的方式实例
2022/05/10 PHP