VUE开发SPA之微信授权登录
SPA单页应用中微信授权登录的一点思路
单页应用应该如何解决微信授权登录的尴尬跳转?后退无法返回?
主要遇到的问题就是
先进入单页应用,一边渲染页面一边判断用户有没有登录,当判断到没有登录时异步数据请求已经发送出去了,然后要跳转到微信授权页面,这样就浪费了一次网络请求且用户可能要去点击这个数据了结果...跳走了!在授权成功后用户点击后退再次进行授权有没有???
本文主要讲述
对于单页应用应该在哪个阶段获取微信授权?
只考虑网站完全依赖微信授权登录,一进入就要以授权的身份进入
基本思路
核心是需要有个author.vue 叫它授权中间页好了

vue开发过程中的一些点子
由于我的业务是完全依赖微信授权登录的,也就是用户一进来就应该是已经完成授权的
为了避免让用户明显感觉到先进入网站然后又跳转到微信授权页面
我们从vue-router下手
基本实现思路是:
- 无论使用哪个url进入网站都会先触发router.beforeEach钩子
- 在router.beforeEach钩子中判断用户当前登录状态
- 若没有登录则保存用户进入的url并跳转到author授权页面
- author授权页面完成微信授权以及token的写入实现用户登录
- 获取前面保存的用户进入url并跳转
经过这样一个流程,用户感觉到的就是,无论从哪个url进入SPA,都会先显示author页面,然后再进入自己想要进入的页面,而不是先进入自己想要进入的页面再闪到author页面,这样不仅节省了资源也提升了用户体验,更重要的一点是!我们的项目多了一个广告页面(无语...)!!!
先贴上我的实现代码
用户信息保存在Vuex中
// holdno是我自己定义的一个工具集 里面有各种操作方法
router.beforeEach((to, from, next) => {
if(!store.state.user.id && to.path != '/author'){
// 第一次进入项目
holdno.cookie.set('beforeLoginUrl', to.fullPath) // 保存用户进入的url
next('/author')
return false
}
next()
})
下面来看一下author页面的处理逻辑
created () {
// 检测会员有没有登录
if(!holdno.cookie.get('user')){
let ua = window.navigator.userAgent.toLowerCase()
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
// 跳转到微信授权页面
window.location.href = this.webUrl + '/Wap/User/getOpenid'
}
}else{
// 如果有token 但是vuex中没有用户登录信息则做登录操作
this.login()
}
},
methods: {
login () {
let url = this.webUrl + '/Wap/User/info'
// 通过cookie中保存的token 获取用户信息
this.$http.get(url).then(response => {
response = response.body
if(response){
// 保存用户登录状态(Vuex)
this.$store.commit('user', response)
setTimeout(() => {
this.goBeforeLoginUrl() // 页面恢复(进入用户一开始请求的页面)
}, )
}else{
this.$alert('服务器撸猫去惹 :(', 'wrong')
if(holdno.cookie.get('user')){
// 跳转到微信授权页面
window.location.href = this.webUrl + '/Wap/User/getOpenid'
}
}
})
}
}
上述代码中 window.location.href = this.webUrl + '/Wap/User/getOpenid'
这一段是后端请求微信授权登录接口的地址,在后端获取到用户信息及openid后再次跳转到author页面而不是直接定向到用户想要请求的位置,这样做的原因很简单。
如果用户跳转到授权页面,由后端获取用户信息并保存好登录状态,重定向到用户请求的页面,这时只要用户点击一下后退,所有的逻辑重新再来一遍有没有?作为一个不懂技术的用户,应该也是很郁闷,为什么后退还是跳回来了呢???
所以获取用户信息后再次重定向到author页面,由author做一个中间页检测到获取到用户信息后在前端做一个跳转,也就是代码中的this.goBeforeLoginUrl()(跳转到登录前的url ...哈哈哈),这时候用户再点击后退就会退回到author页面而不是后端获取用户openid的url,但真的会再次显示author页面给用户吗?并不会,回看我们路由钩子的定义:
router.beforeEach((to, from, next) => {
if(to.path == '/author' && store.state.user.id){
// 用户使用后退返回到授权页,则默认回到首页
next('/index')
return false
}
...
})
后面部分这里不重要,展示出来的则是关键部分,在再次跳转至author前,路由钩子被触发,检测到即将进入的页面to.path == '/author'成立同时刚才在this.login()中做了this.$store.commit('user', response)操作,所以if条件成立页面被直接跳转至'/index'首页,所以在这一个流程中,用户并没有再次看到授权页面,而是直接返回到了首页,是不是很完美!
this.goBeforeLoginUrl()
// 登录后跳转方法
Vue.prototype.goBeforeLoginUrl = () => {
let url = holdno.cookie.get('beforeLoginUrl')
if(!url || url.indexOf('/author') != -){
router.push('/index')
}else{
if(url == '/'){
url = '/index'
}
router.push(url)
holdno.cookie.set('beforeLoginUrl', '')
}
}
看完整个流程,author只讲到逻辑处理,但它毕竟是一个页面,也是要展示给用户看的,只处理逻辑的话难道白花花的一片show给用户吗?当然不是!想必大家都了解app在初次启动时都有一个广告页吧,我们完全可以把author授权中间页包装成一个广告页,在用户浏览花哨的图片(广告)时默默完成授权登录的处理 :)
VUE开发SPA之微信授权登录的更多相关文章
- 微信公众平台开发——微信授权登录(OAuth2.0)
1.OAuth2.0简介 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户 ...
- [转] Android:微信授权登录与微信分享全解析
https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.html http://blog.csdn.net/xiong_it ...
- wap2app(五)-- 微信授权登录以及踩过的坑
应用场景是:用Hbuilder打包app,在app中点击微信授权登录或者某一操作,调起微信授权登录,用户授权后拿到用户信息. 一.登录插件配置 先配置微信登录参数 appid和appsecret,在m ...
- Android接入微信SDK之一:发起微信授权登录
1.重要的事情首先说! 包名.应用签名.app id 三者都必须和在腾讯上申请的一致!!!否则将不能成功. 包名:就是在腾讯上申请的包名 应用签名:使用微信官网提供的<签名生成工具>(这个 ...
- H5微信授权登录
这里介绍H5微信授权登录,采用了微信公众号授权原理,是oauth2的登录授权方式,简单的来讲,就是用户通过手机微信确认登录之后,微信方会返回一个授权码code给回第三方(接入方),这个授权码code一 ...
- 微信授权登录-微信公众号和PC端网站
https://blog.csdn.net/qq_34664239/article/details/79107529 一.微信公众号授权登录——微信公众平台 微信授权登录,并调用后台接口,获取用户信息 ...
- 微信授权登录(PHP)
微信授权登录(PHP) 微信授权 OAuth2.0授权 微信网页授权 主要是在项目中遇到网页授权登录这个需求,就对此做些总结记录. OAuth2.0授权 OAuth是一个开放协议,允许用户让第三方应用 ...
- 【第二十一篇】手C# MVC 微信授权登录 OAuth2.0授权登录
首先一定要熟读,最起码过一遍微信开发者文档 微信开发者文档 文档写的很清楚 授权登录四步走 在正文开始前,我得讲清楚一个事情 敲黑板,划重点:微信一共有两个 access_token 一个是7200就 ...
- .net core identity集成微信授权登录
最快的方式是直接nuget安装AspNetCore.Authentication.WeChat包. 想要知道是如何实现的,可以看下面github上面的源码. 源码在这里:https://github. ...
随机推荐
- 2018.9.25 NOIP模拟赛
*注意:这套题目应版权方要求,不得公示题面. 从这里开始 Problem A XOR Problem B GCD Problem C SEG 表示十分怀疑出题人水平,C题数据和标程都是错的.有原题,差 ...
- Docker入门 配置篇
docker配置 http://www.runoob.com/docker/docker-tutorial.html
- 洛谷 P1273 【有线电视网】
题目描述 某收费有线电视网计划转播一场重要的足球比赛.他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点. 从转播站到转播站以及从 ...
- zabbix-3.4.14源码安装
此次介绍一下,zabbix的源码安装,因为zabbix的依赖很多,所以源码安装有很多依赖需要安装 首先,下载zabbix源码包 wget https://nchc.dl.sourceforge.net ...
- 扩展的GM命令
命令 说明 例子 .rl all 重载核心所有自定义数据表 .rl item 重载item_template .backup a 备份Auth数据库 .backup c 备份Charact ...
- ES6的小知识(前半部分)
一.let与const的使用 let:用来声明一个变量,与var类似 1.用let声明的变量,所声明的变量只在命令所在的代码块内有效 function hander(){ let a = 10; co ...
- C#---装箱、拆箱的一个案例
using System; namespace ConsoleApplication1 { interface IInterface { void Add(int num); } struct Tes ...
- 广工十四届校赛 count 矩阵快速幂
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6470 题意:求,直接矩阵快速幂得f(n)即可 构造矩阵如下: n^3是肯定得变换的,用二项式展开来一点 ...
- 如何在linux下开启FTP服务
如何在linux下开启FTP服务 1. 首先服务器要安装ftp软件,查看是否已经安装ftp软件下: #which vsftpd 如果看到有vsftpd的目录说明服务器已经安装了ftp软件 2. ...
- spring注入3种方式
1.构造方法 2.接口注入 3.set方法