问题描述
我正在创建一个登录系统,其中我使用个人电子邮件地址作为我的数据库中的唯一标识符。人们可以使用任何OpenID提供商登录,如Google ect(也是Facebook),它只需获取电子邮件并将其作为唯一标识符存储在我的SQL DB的USERS表中。(这意味着我不必担心电子邮件验证、密码等问题,用户也不必注册)。
这是可行的,通过使用link/javascript打开一个新窗口,然后我的php脚本被定向到Google或任何提供商。然后他们输入这些详细信息,然后Google/ect会自动将窗口重定向到我的登录脚本以及(如果成功)用户详细信息(最重要的是电子邮件)。
现在在回复中,我查看电子邮件,查看它是否在我的数据库中,如果没有,则添加它,如果是,使用$_SESSION将用户登录到我的站点。
我使用OpenID机制(Google、Yahoo等)让它完美地工作。我也在努力让它与Facebook合作,但遇到了很大的困难。它能够让用户登录到FB,抓取用户的电子邮件等。然而,一旦我尝试让用户登录我的站点,它就不起作用了。出于某种原因,它为我打开的新窗口(我的脚本+重定向在其中运行)有一个单独的会话(Inc.Seperate essionid),然后到我的站点的其余部分?
只是想知道是否有人知道为什么会发生这种情况。
登录脚本如下所示(即在新窗口中运行):
<?php
$app_id = "YOUR_APP_ID";
$app_secret = "YOUR_APP_SECRET";
$my_url = "YOUR_URL";
session_start();
$code = $_REQUEST["code"];
if(empty($code)) {
$_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
$dialog_url = "https://www.facebook.com/dialog/oauth?client_id="
. $app_id . "&redirect_uri=" . urlencode($my_url) . "&scope=email&state="
. $_SESSION['state'];
echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_REQUEST['state'] == $_SESSION['state']) {
$token_url = "https://graph.facebook.com/oauth/access_token?"
. "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
. "&client_secret=" . $app_secret . "&code=" . $code;
$response = file_get_contents($token_url);
$params = null;
parse_str($response, $params);
$graph_url = "https://graph.facebook.com/me?access_token="
. $params['access_token'];
$user = json_decode(file_get_contents($graph_url));
echo("Hello " . $user->name);
// try_register_or_login($user->email);
}
else {
echo("The state does not match. You may be a victim of CSRF.");
}
?>
来源:https://developers.facebook.com/docs/authentication/
我花了很长时间到很多小时试图自己解决这个问题。如有任何帮助,我们将不胜感激。
推荐答案
我认为该问题可能与跨域或Cookie的设置方式有关。
另一种可能是使用cookie设置的标志。当我在Cookie上设置安全标志,然后尝试通过非安全(Http)页面访问它时,我确实遇到了这个问题。此外,如果设置了Httponly标志,则会给javascript带来问题。您可以在http://www.php.net/manual/en/function.setcookie.php
上了解这两个标志这篇关于在重定向到另一个域然后返回后丢失会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!