附:微信官方文档

前言:在用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. 微信公众号开发(一) 微信网页授权登录

    微信网页授权登录 前期准备 授权登录 获取微信数据 处理授权拒绝 前期准备 1.微信公众号开发,首先要搞一个公众号,开发阶段可以申请一个公众平台测试账号. (进入到微信公众公众平台,找到开发者工具,点 ...

  2. php微信授权ajax,ajax 实现微信网页授权登录

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个PHPer ,所以,微信开发采用的是 EasyWeCha ...

  3. java ajax 微信网页授权_ajax 实现微信网页授权登录的方法

    AJAX 的 ajax 实现微信网页授权登录的方法 项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个ph ...

  4. 微信网页授权登录的方法

    微信网页授权登录官方文档 微信网页授权登录的方法–推荐文章一 微信网页授权登录的方法–推荐文章二 总结: 微信授权方式(scope的属性值控制): 应用授权作用域,snsapi_base (不弹出授权 ...

  5. Springboot + Spring Security多种登录方式:账号用户名登录+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  6. 微信网页授权登录java后台实现

    建议先阅读微信开发-网页授权登录官方文档: https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_au ...

  7. php微信登录代理转发,PHP微信网页授权登录

    PHP微信网页授权登录 2018年04月10日 15:44:03阅读数:601 namespace Org\WeChat; /** * 微信授权相关接口 */ class Wechat { //高级功 ...

  8. SpringBoot + Spring Security多种登录方式:账号+微信网页授权登录

    一.概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路,最重要的一点是要实现微信登录通过Spring Security安全框架时,不需要验证账号.密码. 二.准备工作 要 ...

  9. Spring Boot Security 多种登录方式集成配置思路及方法 账号用户名登录+微信网页授权登录

    概述 实现账号用户名+微信网页授权登录集成在Spring Security的思路 前情提要 本思路完全抛弃Spring Security的配置式账号密码登录模式,采用完全独立的Filter.Provi ...

最新文章

  1. Spring Cloud入门教程 - Zuul实现API网关和请求过滤
  2. windows使用.NET CORE下创建MVC,发布到linux运行
  3. java源码保护技术,sourceguard
  4. OpenCV特征点检测匹配图像-----添加包围盒
  5. 一个偷偷修改工作目录的幕后黑手
  6. C++中特定宏_FUNCTION_
  7. DataSet 添加数据集、行、列、主键和外键等操作示例
  8. cxgrid限定行数
  9. 体验Unity2017.2.0f3进行Vuforia开发
  10. 【三维路径规划】基于matlab A_star算法无人机三维路径规划【含Matlab源码 446期】
  11. 西门子 SinuTrain 840Dsl OPC UA 模拟
  12. Linux中缺32位运行库steam,Steam游戏必备运行库
  13. Ubuntu安装播放mp4格式视频(安装ffmpeg)
  14. linux+kvm虚拟化+搭建openstack云平台,私有云搭建
  15. 统计|方差分析拒绝原假设的LSD一般步骤及实现
  16. 安卓手机卸载手机自带软件(adb)
  17. 2018计算机专硕学硕,2018年专硕和学硕的初试和复试的区别?
  18. C语言volatile修饰的到底什么鬼?原来它在嵌入式开发是必须掌握的!
  19. jdbc连接mysql的serverTimeZone参数配置
  20. JAVA基础之二维数组三维数组及应用

热门文章

  1. 第二百四十一节,Bootstrap进度条媒体对象和 Well 组件
  2. 循环(环形)缓冲区之Boost::circular_buffer
  3. 护照,身份证,港澳通行证,台湾证,回乡证 正则
  4. 前置条件,不变性条件,后置条件 --《java并发编程实战》
  5. 一文读懂通信玩家半年财报,有人欢喜有人愁!
  6. cve20190708补丁的kb名称_微软远程桌面漏洞修复补丁下载|
  7. ssh查看服务器上的文件,ssh 访问远程服务器文件路径
  8. Linux PXE无盘工作站
  9. java 生成随机编码_Java生成随机编码
  10. linux脚本循环创建用户,shell应用之批量添加用户实例