我已经为自己的网站在php中编写了自定义OAuth2代码实现。 用户可以使用其Facebook,Google或Yahoo帐户签名。
尽管Facebook和Yahoo登录正常。我在登录Google时遇到问题。在google同意屏幕上表示同意后,我被重定向回同意屏幕。
我在firefox检查器的“网络”选项卡中使用了持久日志,下面是屏幕截图。 (我的评论为红色)
在响应标头中,有一个位置标头重定向回授权URL。如果未设置$ _GET代码,则仅使用此位置标题(请参见下面的代码)
} elseif (! isset($_GET['code'])) {
// This shouldn't execute after consent is provided,
// since $_GET['code'] is already set
// No authorization code then get one
$authUrl = $provider->getAuthorizationUrl();
$_SESSION['oauth2state'] = $provider->get('state');
header('Location: ' . $authUrl);
exit;
}
下面是我用来实例化该类的代码。我对Yahoo和Facebook使用相同的代码。而且两者都没有这样的问题。
我无法弄清楚为什么发生重定向。
/ *******更新********* /
我尝试将$ _GET变量转储到文件中,发现它为空。因此设置了查询字符串,但$ _GET为空。我检查了stackoverflow,发现此链接-Query String Variables Exist, but $_GET is empty
我不确定为什么Yahoo和Facebook Oauth不会发生这种情况,但这是我的.htaccess。我不确定如何使用QSA标志附加查询字符串。我在下面的行中收到内部服务器错误。
RewriteCond %{THE_REQUEST} !(robots\.txt|\.(css|js|png|jpe?g|gif|woff?2)) [NC]
RewriteRule . index.php [L, QSA]
/ *******更新********* /
为了进一步调试,我实际上尝试在代码中的各个位置将$ _GET和$ _SERVER ['REQUEST_URI']变量转储到文件中,以查看是否意外取消设置了GET变量。
对于使用相同代码的Facebook登录,查询字符串和GET变量都直接从入口点即index.php设置。
对于google登录,存在查询字符串,但未在任何位置设置GET变量。很好奇我唯一可以看到的地方是htaccess,我什么也没注意到,应该有选择地从Google登录路径中删除get变量:(
任何建议都会很有帮助
/ *******最终更新********* /
我整理了此技巧以重置GET变量。我仅将其用于Google登录名,并设置了GET变量即可正常运行。希望是一个临时解决方案。
// if GET is empty and query string exists
if (empty($_GET) && strpos($_SERVER['REQUEST_URI'], '?') !== false) {
parse_str(parse_url($_SERVER['REQUEST_URI'], PHP_URL_QUERY), $_GET);
}