H5微信授权登录后点击返回出现循环登录无法退出问题

本文详细解析了微信H5授权流程中出现的循环授权问题,特别是当用户从子页面返回入口页面时。通过分析location.replace在微信浏览器中的行为,指出其无法有效解决问题。针对这一问题,提出了在登录接口成功后利用sessionStorage存储临时值,并修改授权页初始化逻辑的解决方案,以避免循环授权。在iOS和安卓环境下,采取不同的历史记录回退处理方式,确保用户能够正常返回而不触发授权流程。
摘要由CSDN通过智能技术生成

简单介绍h5微信授权流程
1、入口页跳转到我们自己创建的空白授权页
2、在空白授权页判断url上是否包含code,没有code拼接微信授权链接,通过location.href进行跳转
location.href = https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

3、微信重定向到我们自己创建的空白授权页,空白授权页重新判断url上是否包含code,包含code,传递code给后台进行登录
4、登录成功,保存用户信息,token,跳转到子页面

在这里插入图片描述

从子页面返回到入口页形成的循环授权登录
完成了入口页面到子页面的跳转,现在点击返回按钮或者通过手势操作滑动屏幕回到入口页面,页面流转过程如下图所示:(这里有个前置知识:返回到上级页面微信内置浏览器会触发上级页面重新加载。)

在这里插入图片描述

是否可以通过location.replace解决页面返回出现循环授权的问题?
location.replace() 方法可以用一个新文档取代当前文档,如在 A页面中通过location.href跳转到B页面,我们可以通过浏览器后退按钮返回到A页面。若使用location.replace(B.html)跳转到B页面,则A页面会被B页面替换掉,用户无法通过浏览器返回按钮进行返回。

了解了location.replace()的作用,我们现在将之前的授权流程通过location.replace来改造一下。

在这里插入图片描述

通过location.replace替换当前页的方法,页面栈中最后只剩下了入口页面与子页面,现在点击返回按钮自然就回到了入口页面。不过,真的是这样吗?: (

微信浏览器中的location.replace
如果通过location.replace就能解决问题,微信开放社区也不会有同学从16年到现在都在咨询如何解决返回循环授权问题。这里直接告诉大家,location.replace在微信浏览器中不生效,而且ios,安卓,微信开发者工具里使用location.replace的表现不一致:

ios真机:location.replace完全不起作用,效果等同于location.href , 页面栈中会存在一个无code的授权页,有code的授权页
在这里插入图片描述

安卓真机与微信开发者工具:页面栈中会存在一个无code的授权页

在这里插入图片描述

解决方案
了解了整个问题形成的原因,以及使用location.replace之后页面栈中的状况,再来解决返回循环授权这一问题就很简单了。

在有code的页面调用登录接口成功之后,我们向sessionStorage中存一个临时值再跳转到子页面,然后修改空白授权页的初始化逻辑即可:

// 伪代码
code = getSearchParams(‘code’) // 获取url search中的code
临时值 = sessionStorage.getItem(‘key’)

if (临时值) {
// 进行返回逻辑
sessionStorage.removeItem(‘key’)
if (ios) {
history.go(-2)
}else {
history.go(-1)
}
}else {
if (!code) {
// 没有code,跳转微信授权oauth地址
location.replace(https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect)
}else {
// 有code,调用登录接口
$.ajax(login_api, {
data: {
code
}
}).then(res => {
// 储存临时值
sessionStorage.setItem(‘key’, code)
// 跳转到子页面
location.replace(子页面地址)
])
}
}

注:空白授权页为应用的入口,页面返回即关闭应用。我们可以判断临时值是否存在,存在则执行 wx.closeWindow() 关闭整个网页窗口即可完成应用退出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值