重定向到另一个域然后返回后丢失会话
Posted
技术标签:
【中文标题】重定向到另一个域然后返回后丢失会话【英文标题】:Losing session after a redirect to another domain then back 【发布时间】:2022-01-20 11:06:26 【问题描述】:我正在创建一个登录系统,在该系统中我使用个人电子邮件地址作为我数据库中的唯一标识符。人们可以使用任何 openid 提供程序登录,例如 google ect(也是 facebook),它会简单地将电子邮件作为唯一标识符存储在我的 sql DB 中的 users 表中。 (意味着我不必担心电子邮件验证、密码等,用户不必注册)。
这可行,通过使用链接/javascript 打开一个新窗口,我的 php 脚本然后被定向到谷歌或任何提供者。然后他们在那里输入详细信息,然后 google/ect 将自动将窗口重定向回我的登录脚本以及(如果有效)用户详细信息(最重要的是电子邮件)。
现在在回复中,我查看电子邮件,看看它是否在我的数据库中,如果没有添加,如果是,使用 $_SESSION,将用户登录到我的网站。
我使用 openid 机制(谷歌、雅虎等)完美地完成了这项工作。我也试图让它与 facebook 一起工作并且遇到了很大的困难。它能够将用户登录到 fb,获取用户电子邮件等。但是,一旦我尝试将用户登录到我的网站,它就不起作用。出于某种原因,它对我打开的新窗口(并且我的脚本+重定向运行)有一个单独的会话(inc 单独的 sessionid),然后到我的站点的其余部分?
只是想知道是否有人知道为什么会发生这种情况。
这是登录脚本的样子(在新窗口中运行):
<?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 来存储会话 id(不使用会话 id 作为 GET 参数),请确保会话 cookie 对您域中的所有路径都有效。默认情况下,cookie 仅在会话启动的目录中有效。所以如果你的脚本是domain.com/dir/subdir/script.php,那么script.php中设置的会话cookie只对dir/subdir路径下的文件有效。有关设置 cookie 路径的更多信息,请参阅php.net/manual/en/function.setcookie.php 这是一个很好的观点。但是,我不认为这是我的问题,因为我可以使用我的 openid 替代方法让它登录,在这种情况下,它与 facebook 尝试位于同一目录中。感谢您的建议。 愿它可以像这样简单/愚蠢。您正在测试/使用您的网站,浏览器指向mysite.com,并且在 FB 中输入的 App url 可能包含“www”。在这种情况下,(默认设置)cookie 将不会在它们之间共享。 原来我可以通过 session_start(); 之前的简单函数调用解决我遇到的所有问题; session_set_cookie_params (0,"/", ".domain.com");感谢所有的建议,我如何关闭一个问题,或设置一个回复的答案?克里斯基本上为我回答了这个问题。 (没有任何适当的问题答案帖子?) 【参考方案1】:如果有人遇到这种情况并且不知道为什么或如何解决它:
我遇到了同样的问题。我的页面重定向到另一个站点,用户在那里做一些事情,这个站点将他重定向回我的站点,并且会话在这一步中丢失了。问题出在我的 cookie 设置上。
我有以下 apache 指令:
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Strict
问题特别在于 SameSite=Strict 模式,因为 Strict 值会阻止 cookie 进行任何跨站点使用。
将值设置为 Lax:
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure;SameSite=Lax
在不影响安全性的情况下解决了这个问题,因为 Lax 模式允许一些 GET 跨站点请求,只要是***请求。
只要地址栏中的 URL 发生变化,就会发生***请求 因为这个导航。对于 iframe、图像,情况并非如此 或 XMLHttpRequests。
参考:Preventing CSRF with samesite cookie attribute
【讨论】:
【参考方案2】:我认为这个问题可能与跨域有关或可能与 cookie 的设置方式有关。
跨域请看Cross domain cookies
另一种可能性是使用 cookie 设置的标志。当我在 cookie 上设置安全标志然后尝试通过非安全 (http) 页面访问它时,我遇到了这个确切的问题。此外,如果设置了 httponly 标志,则会导致 javascript 出现问题。您可以在http://www.php.net/manual/en/function.setcookie.php
阅读有关这两个标志的信息【讨论】:
这是问题所在,session_set_cookie_params (0,"/", ".domain.com");然后是 session_start(),修复了这个问题。【参考方案3】:Asp.net:-
注意:-您遇到此问题是因为:- Plz click the URL to know the issue
在您的浏览器中显示您的唯一 sessionId 的“SameSite”是否显示松散:- Click here to see
答案:-
enter code here
在 Web.config 文件中添加以下代码
<system.web>
<sessionState cookieless="false" cookieSameSite="None"/>
<system.web>
需要从浏览器中删除cookies(我们需要删除cookie至少一次)
a) 手动操作 2) 现在您的浏览器 sessionId 的“同一站点”显示 None like this :-
click here to see
它在 asp.net 网络应用程序中为我工作。
【讨论】:
以上是关于重定向到另一个域然后返回后丢失会话的主要内容,如果未能解决你的问题,请参考以下文章