微信开放平台扫码登录回调后 state 参数丢失遗漏的解决方案
时间:2021-07-12
本文章向大家介绍微信开放平台扫码登录回调后 state 参数丢失遗漏的解决方案,主要包括微信开放平台扫码登录回调后 state 参数丢失遗漏的解决方案使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
根据微信开放文档,在请求 code 时我们可以提供一个名为 state 的参数。该参数用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验。
根据该文档,笔者将用户的返回地址传递到了 state 中,以实现登录成功后跳转的功能。如果返回路径不包含或仅包含一个 Query String 参数时,代码可以正常工作,如果有 1 个以上的参数,则第二个既之后的参数不会被返回。
为了解决该问题,笔者将返回地址进行了 Base64 转码。再次测试时问题依旧:微信回调时没有对 state 参数进行编码(url encode)造成 Query String 部分以双等号结尾:接收参数不完整导致 URL 解码失败。
一个简单易行的方案就是将这些需要编码的字符替换成无需编码的字符,应用以下代码之后该问题得到解决:
public static string Encode(byte[] bytes)
{
if (bytes.IsNullOrEmpty())
{
return string.Empty;
}
var str = Convert.ToBase64String(bytes);
str = str.Replace("+", "-").Replace("/", "_");
return str;
}
public static byte[] Decode(string str)
{
if (string.IsNullOrWhiteSpace(str))
{
return new byte[0];
}
str = str.Replace("-", "+").Replace("_", "/");
var data = Convert.FromBase64String(str);
return data;
}
以上代码将 Base64 编码算法中用到的 “+” 和 “/” 这两个需要参与到 URL 编码的算法进行了替换和还原,从而规避了微信不对参数编码的问题。
欢迎来到:码农很忙 。
原文地址:https://www.cnblogs.com/Soar1991/p/15003465.html
- jquery事件绑定性能测试
- Spring Cloud Bus整合Kafka
- 图解Mac下如何安装管理MySQL
- Spring Cloud Bus整合RabbitMQ
- 结合Scikit-learn介绍几种常用的特征选择方法(下)
- Spring Cloud Bus之RabbitMQ初窥
- 结合Scikit-learn介绍几种常用的特征选择方法(上)
- 判断图片是否加载完成
- Spring Cloud Config客户端配置细节
- Spring Cloud Config服务端配置细节(二)之加密解密
- Redis3 cluster 集群配置测试
- Spring Cloud Config服务端配置细节(一)
- 分布式配置中心Spring Cloud Config初窥
- Git标签管理
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 前端国际化辅助工具——自动替换中文并翻译
- Codeforces Round #613 (Div. 2)A. Mezo Playing Zoma
- PAT (Advanced Level) Practice 1096 Consecutive Factors (20 分)
- Codeforces Round #613 (Div. 2)B. Just Eat It!
- java线程池(六):ForkJoinPool源码分析之二(WorkQueue源码)
- Codeforces Round #605 (Div. 3) D. Remove One Element
- 用python爬虫,pyinstaller写一个属于自己的彩虹屁生成器!
- 2020牛客寒假算法基础集训营4 C 子段乘积
- Callable and Future in Java(java中的Callable和Future)
- Java类 初步学习
- Gephi可视化拓扑图简单实战
- python连接到SQList数据库以及简单操作
- 在markdown编辑器使用html绘制表格
- 循环不变式:算法中基础概念的明晰
- Codeforces Round #615 (Div. 3)B. Collecting Packages