Google OAuth2-授权码请求导致同意后导致重定向循环

时间:2018-12-01 13:09:14

标签: php .htaccess

我已经为自己的网站在php中编写了自定义OAuth2代码实现。 用户可以使用其Facebook,Google或Yahoo帐户签名。

尽管Facebook和Yahoo登录正常。我在登录Google时遇到问题。在google同意屏幕上表示同意后,我被重定向回同意屏幕。

我在firefox检查器的“网络”选项卡中使用了持久日志,下面是屏幕截图。 (我的评论为红色)

Authorization code is received but immediately redirected to Authorization url

在响应标头中,有一个位置标头重定向回授权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);
}

0 个答案:

没有答案