提问者:小点点

重定向到另一个域后丢失会话,然后返回


我正在创建一个登录系统,其中我使用个人电子邮件地址作为数据库中的唯一标识符。人们可以使用任何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/

我花了很多时间试图自己解决这个问题。任何帮助都将不胜感激。


共3个答案

匿名用户

如果有人遇到这种情况,不知道为什么或如何解决:

我也有同样的问题。我的页面重定向到另一个站点,用户在那里做了一些事情,这个站点将他重定向回我的站点,会话在此步骤中丢失。问题在于我的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网络应用程序。