启用CDN后,QQ互联登录出现异常的问题。

前言

因为最近优化网站,方便一些用户,所以加入了网站第三方登录的功能,但是刚接入就发生了回调失效的问题,本篇文章针对CDN引起的第三方登录进行教程

发现点击QQ登录后,无法正常跳转到登陆后的界面,卡在callback地址上不动了。虽然我知道是CDN造成的,但是没明白问题出在哪儿,就正常逻辑开始排查代码。先把站点调试模式(TP5的app_debug)关了,然后再次登录,看到错误信息3001。

查错并解决

查源码Oauth.php(原Oauth.class.php)发现问题出在防CSRF攻击的state上。再次尝试登录,看了下地址栏callback后的code参数和state参数一切正常。也就是说授权动作执行完成了。那么问题就出在这个比对问题上了,我是通过TP5的助手函数input获取的state。尝试dump了一下state和code。都显示为空,没有获取到地址栏上的参数,无法和程序中的state变量比对,造成的错误。以为是助手函数的问题,又原本请求了一次,还是没有,最后使用原生$_GET也还是没有请求到内容。

冥想了一下,地址栏上的信息是被构造出来的,那么我访问的数据是CDN节点缓存给我的,地址栏的数据没有和

我源站产生交互,突然想到下午在折腾CDN配置的时候的参数过滤问题了。阿里云的CDN有保留参数回源的设置,并且我还在后台测试的时候传输的ID和分页参数添加过了。天呐,这是有多蠢,竟然忘了这一出。迅速进入阿里云CDN控制面板,在域名管理里面,过滤参数中设置好保留的codestate两个参数。刷新页面后重新使用QQ登录,就一切正常了。

cdn回源跟随

默认情况下,CDN 节点未命中缓存,请求回到源站时,如果源站响应了一个 301 或 302 跳转状态码,则 CDN 节点不会缓存这个状态码,而是直接把状态码响应给客户端,由客户端跳转到源站指定的跳转地址。

开启回源跳转跟随配置后,CDN 节点回源时如果遇到源站响应 301/302,则会由 CDN 节点主动跟随,直到获取到目标文件资源,将最终文件响应给客户端并按缓存规则进行缓存,客户端无需跳转。

这就导致了第三方登录的回调不经过客户机而直接返回到了服务器,导致用户无法直接获取信息

 

THE END