Потеря сеанса после перенаправления на другой домен и обратно - PullRequest
4 голосов
/ 17 июля 2011

Я создаю систему входа в систему, где я использую адрес электронной почты человека в качестве уникального идентификатора в моей БД.Люди могут войти в систему с помощью любого провайдера openid, такого как Google ect (также facebook). Он просто возьмет электронную почту и сохранит ее в качестве уникального идентификатора в таблице пользователей в моей БД sql.(означает, что мне не нужно беспокоиться о проверке электронной почты, паролях и т. д., и пользователям не нужно регистрироваться).

Это работает, открывая новое окно с помощью ссылки / javascript, мой php-скрипт затем направляется в Googleили кем бы ни был поставщик.Затем они вводят там данные, затем google / ect автоматически перенаправляет окно обратно в мой сценарий входа в систему вместе с (если это сработало) данными пользователя (наиболее важно, с электронной почтой).

Теперь в ответе, который я смотрюадрес электронной почты, посмотрите, есть ли он в моей базе данных, если нет, добавьте его, если это так, используя $ _SESSION, зарегистрируйте пользователя на моем сайте.

У меня это отлично работает, используя механизм openid (google, yahoo, ect).Я пытаюсь заставить его работать с Facebook также и с большим трудом.Он может войти в систему пользователя fb, получить электронную почту пользователя и т. Д.Однако, как только я пытаюсь зайти на мой сайт, он не работает.По какой-то причине у него есть отдельный сеанс (в том числе отдельный идентификатор сеанса) для нового окна, которое я открыл (и мой скрипт + перенаправление запускается), а затем на остальную часть моего сайта?

Просто интересно, есть ли у кого-нибудьИдея, почему это происходит.

Вот как выглядит скрипт входа в систему (запускается в новом окне):

<?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.");
   }

 ?>

source: https://developers.facebook.com/docs/authentication/

Я потратил много-много часов, пытаясь решить это сам.Любая помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Я полагаю, что проблема может быть связана с пересечением доменов или, возможно, с установкой файла cookie.

Для кросс-доменов, посмотрите на Кросс-доменные куки

Другая возможность - это флаги, которые устанавливаются с cookie. У меня возникла именно эта проблема, когда я установил флаг безопасности в файле cookie, а затем попытался получить к нему доступ через незащищенную (http) страницу. Кроме того, если установлен флаг httponly, это вызовет проблемы для JavaScript. Вы можете прочитать об обоих флагах на http://www.php.net/manual/en/function.setcookie.php

1 голос
/ 28 марта 2019

В случае, если кто-то испытывает это и не знает, почему или как его решить:

У меня была такая же проблема. Моя страница перенаправлена ​​на другой сайт, пользователь делает там кое-что, и этот сайт перенаправляет его обратно на мой сайт, и на этом этапе сеанс был потерян. Проблема была с настройкой моих файлов 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 в адресной строке. из-за этой навигации. Это не относится к iframes, изображениям или XMLHttpRequests.

Ссылка: Предотвращение CSRF с атрибутом cookie того же сайта

...