微信开放平台扫码登录回调后 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 编码的算法进行了替换和还原,从而规避了微信不对参数编码的问题。
欢迎来到:码农很忙 。