我正在创建一个登录系统,其中我使用个人电子邮件地址作为数据库中的唯一标识符。人们可以使用任何openid提供商登录,比如google ect(也是facebook),它只需接收电子邮件并将其作为唯一标识符存储在我的sql数据库的users表中。(意味着我不必担心电子邮件验证、密码等问题,用户也不必注册)。
这是有效的,通过使用链接/javascript打开一个新窗口,我的PHP脚本然后被引导到谷歌或任何提供商。然后他们输入详细信息,然后google/ect会自动将窗口重定向回我的登录脚本以及(如果有效的话)用户详细信息(最重要的是电子邮件)。
现在在响应上,我查看电子邮件,看看它是否在我的数据库中,如果没有添加它,如果是这样,使用_SESSION美元,将用户登录到我的网站。
我有这个工作完美使用OpenID机制(谷歌,雅虎,等)。我试图让它与facebook也有很大的困难。它能够将用户登录到fb,获取用户的电子邮件等。然而,一旦我试图登录到我的网站的用户,它不工作。出于某种原因,它有一个单独的会话(包括单独的会话id)为我打开的新窗口(和我的脚本重定向运行),然后到我的网站的其余部分?
只是想知道是否有人知道为什么会发生这种情况。
这是登录脚本的外观(在新窗口中运行):
<?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/
我花了很多时间试图自己解决这个问题。任何帮助都将不胜感激。
如果有人遇到这种情况,不知道为什么或如何解决:
我也有同样的问题。我的页面重定向到另一个站点,用户在那里做了一些事情,这个站点将他重定向回我的站点,会话在此步骤中丢失。问题在于我的cookies设置。
我有以下apache指令:
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict
这个问题特别出在SameSite=严格模式上,因为严格值禁止cookie在任何跨站点使用。
将值设置为Lax:
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Lax
在不影响安全性的情况下解决了该问题,因为Lax模式允许一些GET跨站点请求,只要是顶级请求。
每当地址栏中的URL因此导航而更改时,就会发生顶级请求。这不是iframe,图像或XMLHttp请求的情况。
参考:防止CSRF与samesite cookie属性
我相信这个问题可能与跨域或者cookie的设置方式有关。
对于跨域,请查看跨域cookie
另一种可能性是使用cookie设置的标志。当我在cookie上设置安全标志,然后试图通过非安全(http)页面访问它时,我遇到了这个问题。此外,如果设置了httponly标志,则会导致javascript出现问题。您可以在网站上阅读这两个标志http://www.php.net/manual/en/function.setcookie.php
Asp。净:-
注意:-您遇到此问题是因为:-请单击URL了解问题
在您的浏览器显示,如果您的唯一会话ID的"SameSite"显示松弛:-点击这里查看
答复:-
enter code here
>
在Web中添加以下代码。配置文件
<system.web>
<sessionState cookieless="false" cookieSameSite="None"/>
<system.web>
需要从浏览器中删除cookie(我们需要至少删除一次cookie)
a) 手动执行2)现在,浏览器sessionId的“同一站点”中没有显示这样的站点:-
单击此处查看
它在asp中为我工作。net网络应用程序。