vue实现微信网页授权登录
附:微信官方文档
前言:在用vue做微信公众号网页项目的授权登录中踩过不少坑,在这里记录一下。首先在选择由后端做登陆还是前端传token登录的方式上产生了分歧。两种方式在不同的公司里都用过,后端做登陆无非是前端跳转到jsp或者php页面,后端把登录做了在跳转回页面,这种方式前端方便了,但是中途需要跳转多次,很影响体验,所以最终选择了前端传token的方法进行登录。
不想看过程的可以直接往下拉查看完整代码
目录
一、授权流程
二、完整代码
一、授权流程
由微信的官方文档得知,授权登陆共分为四步:
其中,第一步由前端来做,第二步前端通过ajax把code传到后端,后端获取access_token,第三步第四步则需要后端完成。
写代码之前需要明确下需求,整理下思路,先想在写是个好习惯。
我们需要做的是:
1、前端在需要获取用户信息的页面调起登录,某些页面不需要,比如首页、某些展示静态页。
2、微信返回,前端截取返回url中的code传给后台,并把后台返回的token存到session和axios的header头中。
3、如果session中已经有token了,调另一个接口,判断token是否已经过期,过期重新登陆。
开始写代码。
因为单页面应用的url带着#,微信授权登陆回调对#支持不友好,所以我们把路由换成history模式,后台配合改一下,不然页面会404。
mode: "history"
在路由守卫的beforeEach中写登录代码
首先登录,1:
window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"
白名单判断:
let noLoginArr = ["/"], isCur = false
for (let i of noLoginArr) {if (to.path == i) {isCur = true}
}
if (isCur) { //白名单内不做登录判断,直接nextnext()
}
登陆之后截取url中的code传给后台,2:
let data = {code: code
}
axios.post('/api/auth/code', data).then((res) => {if (res.code == 200) {sessionStorage.setItem("token", res.data.token)axios.defaults.headers.common['token'] = res.data.tokennext()} else if (res.code == 401) { //后台判断toke是否失效,失效返回401重新授权登陆//去登录window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"}
}).catch(function (error) {
});
如果session中有token,3:
axios.defaults.headers.common['token'] = sessionStorage.getItem("token")
let data = {token: token
}
axios.post('/api/auth/checkToken', data).then((res) => { //判断token是否过期接口if (res.code == 200) {next()} else if (res.code == 401) { //后台判断toke是否过期,过期返回401重新授权登陆sessionStorage.setItem("token","")axios.defaults.headers.common['token'] = ""//去登录window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"}
}).catch(function (error) {
});
说一下自己踩得一个坑:登陆之后,在当前页面不动等token过期,刷新页面。此时页面会不停的跳转
解决方案:每次登录时,去除回调url中的code和state,所以大家在页面间传值的时候不要使用code和state关键词。
二、完整代码
以下是完整代码:
const routes =[// 你的路由
]
const router = new VueRouter({mode: "history",routes
})function delCodeandstate(to) { //函数作用:去除url中的code和statelet path = ""for (let i in to.query) {if (i != "code" && i != "state") {path = path + "&" + i + "=" + to.query[i]}}path = path == "" ? "" : path.substring(1, path.length)path = path == "" ? "" : "/?" + pathreturn path;
}router.beforeEach((to, from, next) => {let fullPath = to.fullPathif (to.fullPath.includes("code")) { //判断url中是否有code,踩坑1-页面反复跳转fullPath = delCodeandstate(to)}let redirect_uri = encodeURIComponent("http://xxx.com" + fullPath), appid = "你的小程序appid" //redirect_uri,授权登陆后的回调地址,需要进行encodeURIComponent处理let code = to.query.code, state = to.query.statelet noLoginArr = ["/"], isCur = false, token = sessionStorage.getItem("token") //noLoginArr,白名单,不需要授权登陆的页面for (let i of noLoginArr) {if (to.path == i) {isCur = true}}if (isCur) { //白名单内不做登录判断,直接nextnext()} else {if (code && state && !token) { //登陆之后获取到code,传到后台登录let data = {code: code}axios.post('/api/auth/code', data).then((res) => {if (res.code == 200) {sessionStorage.setItem("token", res.data.token)axios.defaults.headers.common['token'] = res.data.tokennext()} else if (res.code == 401) { //后台判断toke是否失效,失效返回401重新授权登陆//去登录window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"}}).catch(function (error) {});} else if (token) { //已登录,有token,判断是否过期axios.defaults.headers.common['token'] = sessionStorage.getItem("token")let data = {token: token}axios.post('/api/auth/checkToken', data).then((res) => { //判断token是否过期接口if (res.code == 200) {next()} else if (res.code == 401) { //后台判断toke是否过期,过期返回401重新授权登陆sessionStorage.setItem("token","")axios.defaults.headers.common['token'] = ""//去登录window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"}}).catch(function (error) {});} else { //未登录,没有token,去登录//去登录window.location.href = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"}}
})
export default router
vue实现微信网页授权登录相关推荐
- 微信公众号开发(一) 微信网页授权登录
微信网页授权登录 前期准备 授权登录 获取微信数据 处理授权拒绝 前期准备 1.微信公众号开发,首先要搞一个公众号,开发阶段可以申请一个公众平台测试账号. (进入到微信公众公众平台,找到开发者工具,点 ...
- php微信授权ajax,ajax 实现微信网页授权登录
项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个PHPer ,所以,微信开发采用的是 EasyWeCha ...
- java ajax 微信网页授权_ajax 实现微信网页授权登录的方法
AJAX 的 ajax 实现微信网页授权登录的方法 项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个ph ...
- 微信网页授权登录的方法
微信网页授权登录官方文档 微信网页授权登录的方法–推荐文章一 微信网页授权登录的方法–推荐文章二 总结: 微信授权方式(scope的属性值控制): 应用授权作用域,snsapi_base (不弹出授权 ...
- Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录
一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...
- 微信网页授权登录java后台实现
建议先阅读微信开发-网页授权登录官方文档: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_au ...
- php微信登录代理转发,PHP微信网页授权登录
PHP微信网页授权登录 2018年04月10日 15:44:03阅读数:601 namespace Org\WeChat; /** * 微信授权相关接口 */ class Wechat { //高级功 ...
- SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录
一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...
- Spring Boot Security 多种登录方式集成配置思路及方法 账号用户名登录+微信网页授权登录
概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路 前情提要 本思路完全抛弃Spring Security的配置式账号密码登录模式,采用完全独立的Filter.Provi ...
最新文章
- Spring Cloud入门教程 - Zuul实现API网关和请求过滤
- windows使用.NET CORE下创建MVC,发布到linux运行
- java源码保护技术,sourceguard
- OpenCV特征点检测匹配图像-----添加包围盒
- 一个偷偷修改工作目录的幕后黑手
- C++中特定宏_FUNCTION_
- DataSet 添加数据集、行、列、主键和外键等操作示例
- cxgrid限定行数
- 体验Unity2017.2.0f3进行Vuforia开发
- 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
- 西门子 SinuTrain 840Dsl OPC UA 模拟
- Linux中缺32位运行库steam,Steam游戏必备运行库
- Ubuntu安装播放mp4格式视频(安装ffmpeg)
- linux+kvm虚拟化+搭建openstack云平台,私有云搭建
- 统计|方差分析拒绝原假设的LSD一般步骤及实现
- 安卓手机卸载手机自带软件(adb)
- 2018计算机专硕学硕,2018年专硕和学硕的初试和复试的区别?
- C语言volatile修饰的到底什么鬼?原来它在嵌入式开发是必须掌握的!
- jdbc连接mysql的serverTimeZone参数配置
- JAVA基础之二维数组三维数组及应用
热门文章
- 第二百四十一节,Bootstrap进度条媒体对象和 Well 组件
- 循环(环形)缓冲区之Boost::circular_buffer
- 护照,身份证,港澳通行证,台湾证,回乡证 正则
- 前置条件,不变性条件,后置条件 --《java并发编程实战》
- 一文读懂通信玩家半年财报,有人欢喜有人愁!
- cve20190708补丁的kb名称_微软远程桌面漏洞修复补丁下载|
- ssh查看服务器上的文件,ssh 访问远程服务器文件路径
- Linux PXE无盘工作站
- java 生成随机编码_Java生成随机编码
- linux脚本循环创建用户,shell应用之批量添加用户实例