收藏
回答

请放开公众平台开网页授权接口中的 state 参数长度 128 字符的限制

问题模块
API和组件


公众号网页授权时,将用户浏览器跳转到如下 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 授权无此问题。

最后一次编辑于  2017-11-13  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答