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 相关文章推荐
JS 巧妙获取剪贴板数据 Excel数据的粘贴
Jul 09 Javascript
js操作iframe兼容各种主流浏览器示例代码
Jul 22 Javascript
jQuery及JS实现循环中暂停的方法
Feb 02 Javascript
jQuery使用hide方法隐藏元素自身用法实例
Mar 30 Javascript
Node.js实现Excel转JSON
Apr 24 Javascript
JS判断字符串字节数并截取长度的方法
Mar 05 Javascript
jquery动态切换背景图片的简单实现方法
May 14 Javascript
AngularJS辅助库browserTrigger用法示例
Nov 03 Javascript
ES6 javascript中class静态方法、属性与实例属性用法示例
Oct 30 Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 Javascript
Node.js中的不安全跳转如何防御详解
Oct 21 Javascript
Jquery异步上传文件代码实例
Nov 13 jQuery
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 XML数据解析代码
2010/05/26 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
2013/06/03 PHP
php strrpos()与strripos()函数
2013/08/31 PHP
PHP将XML转数组过程详解
2013/11/13 PHP
php版微信公众平台实现预约提交后发送email的方法
2016/09/26 PHP
PHP弱类型语言中类型判断操作实例详解
2017/08/10 PHP
如何通过PHP实现Des加密算法代码实例
2020/05/09 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
PHP7 windows支持
2021/03/09 PHP
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
详解参数传递四种形式
2015/07/21 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
第九章之路径分页标签与徽章组件
2016/04/25 Javascript
jQuery EasyUI datagrid在翻页以后仍能记录被选中行的实现代码
2016/08/15 Javascript
AngularJS入门教程之AngularJS 模板
2016/08/18 Javascript
jQuery ajax 当async为false时解决同步操作失败的问题
2016/11/18 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
vue.js input框之间赋值方法
2018/08/24 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
Vue.js路由实现选项卡简单实例
2019/07/24 Javascript
深入解析Python中的WSGI接口
2015/05/11 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
Django查询数据库的性能优化示例代码
2017/09/24 Python
python3.6数独问题的解决
2019/01/21 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
Python使用xpath实现图片爬取
2020/09/16 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
Shopty西班牙:缝纫机在线销售
2018/01/26 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
投资建议书模板
2014/05/12 职场文书
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
2015年技术员工作总结
2015/04/10 职场文书
解决Windows Server2012 R2 无法安装 .NET Framework 3.5
2022/04/29 Servers