公众号网页授权时,将用户浏览器跳转到如下 URL 时:
https://open.weixin.qq.com/connect/oauth2/authorize?response_type=code&appid=wx00000000&redirect_uri=http%3A%2F%2Fxxxx.com%2FSigninWeChat&scope=snsapi_userinfo&state=gte35Te4YzeF7PZ8foHHoeMFMNP4o-swVtJ6EMBODUX42LM_-zw4vEbD2D3H-tUvGB22mEB61BAj9P8ZcIUIPFffnptSpiPEc7w7sdr3l4ERxmEsJ2uKCmEfaSClSeUnxYBwlNdXJTHqVuufJfvhkAhY8vt28puqV4B9ioPcSWIXyDS-6KlbnyMYyMo55OtrnSMwh6Jt9hczPPxvK_f20nFV_4rHEt8x7lWD6oSeRUs
得到错误:
出错时 state 参数的长度为 235 个字符。authorize 接口要求 state 长度最长 128 字符:
这个长度是远远不够的。比如上面的请求中,我在 state 中保存了一个用于防范 CSRF 攻击的字段(https://tools.ietf.org/html/rfc6749#section-10.12),以及回调后的路由信息。
在 OAuth2.0 规范(https://tools.ietf.org/html/rfc6749)中,state 用于保存客户端的状态,以便在授权回调时恢复状态。规范中并未指定该参数的长度,在实际应用中,该参数可能包含了客户端的路由信息,以及防范 CSRF 攻击的辅助信息。其长度可能远远大于你方要求的长度。相同长度的参数(甚至更长)在 Facebook、Twitter、Google、Microsoft Account 登录时并未出现任何错误。
规范中也未申明任何服务提供者对此参数的责任,仅用作在回调时传回。
目前我解决这个问题的方法是把路由信息连接到 redirect_uri 后。类似如下:
https://open.weixin.qq.com/connect/oauth2/authorize?response_type=code&appid=wx00000000&redirect_uri=http%3A%2F%2Fxxxx.com%2FSigninWeChat%3freturnurl%3d%2fsomepath&scope=snsapi_userinfo&state=gte35Te4YzeF7PZ8foHHoeMFM....
虽然一定程度上可以解决问题,但我不得不写额外的代码确保 returnurl 参数是一个相对 url,否则就成了 OAuth ietf 中说的 open redirector,易受攻击:
https://tools.ietf.org/html/rfc6749#section-10.15
且,即使 state 中只保留一个防止 CSRF 的字段的密文,其长度也很容易超过 128 字节。所以期望能将此字段的长度限制放宽或干脆去掉。
另:此问题权出现于公众号网页授权,开放平台网站应用的 app 授权无此问题。
那请问回跳地址怎么处理,回调地址url有点长
没用的,官方不是瞎了就是死了,见多了反应问题的帖子没有回复的情况。