сессия тонкого рамы: конфигурация?

У меня проблема с сессиями.
я объясняю :

у меня есть 2 приложения:

  • бэк-офис, который управляет различными продуктами и другими вещами в коммерции. (Symfony1)
  • диск, который позволяет хранить различные файлы, такие как изображения продуктов. (тонкий каркас)

Цель миссии — когда мы хотим обновить изображение продукта, оно будет отправлено на диск.

Итак, для этого я авторизирую пользователя с помощью бэк-офиса с почтовым запросом:

$postData = array(
'login'     => $login,
'password'  => substr($accountUser->getAcctId(), 0, 5).":".$login
);
$headers        = "Content-Type: application/json";
$url            = 'http://api.drive.dev/api/v1/users/login';
$response = $this->sendRequestPost($postData, $headers, $url);

ответ содержит токен, который позволяет аутентификации диска.

после, с помощью токена я отправляю картинку на диск:

 if($responseData['token'] != null) {
//ENVOI DE LA PHOTO
//envoi de la photo dans apifile
$authToken = $responseData['token'];
$path = $_FILES['prod_picture']['tmp_name'];
$type = $_FILES['prod_picture']['type'];
$data = file_get_contents($path);
$base64 = 'data:'.$type.';base64,'.base64_encode($data);
// The data to send to the API
$postData = array(
'jsonData' => json_encode($base64),
'product'  => preg_replace($patterns, $remplacements,$this->prod->getProdName().".png"),
'category' => preg_replace($patterns, $remplacements, $this->prod->getCategory()->getCateName()),
'username' => $login
);

$headers       = "Authorization: Basic ".$authToken."\r\n"."Content-Type: application/json\r\n"."Access-Control-Allow-Credentials: false\r\n";
$url           = 'http://api.drive.dev/api/v1/storage/picture';

$response = $this->sendRequestPost($postData, $headers, $url);
}

и на диске есть функция, которая проверяет, хорош ли полученный токен:

   // on récupère les jetons stocké en session.
$tokenArray = $this->app->session->get('TOKEN');

if (is_null($tokenArray))
{
$this->app->halt(401, '{"code":401,"message":"session token null"}');
}
else
{
if (is_array($tokenArray))
{
$token = key($tokenArray);
//si le token correspond l'utilisateur est bien authentifié
if ($token === $this->token)
return true;
else
$this->app->halt(401, '{"code":401,"message":"Unauthorized", "token_serv":'.$this->token.', "token_app":'.$token.'}');
}
else
{
$this->app->halt(401, '{"code":401,"message":"Unauthorized", "token_serv": "'.$this->token.'"}');
}
}

Но токен в сеансе является нулевым, тогда как он установлен во время действия входа в систему:

    $user = $model->getUserIdentity($db, $login, hash('ripemd160', $password));
if ($user)
{
$user = $user->export();

// Authentification OK : génération du token
$token = hash('sha512', base64_encode($login . ':' . $password) . ':' . uniqid());

$this->app->session->set('TOKEN', array($token => $user['id']));
$this->app->session->set('user', $user);

...

$tokenJson['user']   = $user;
$tokenJson['token']  = $token;

//on envoit l'utilisateur et son token en json.
echo json_encode($tokenJson);
}
else
{
//on efface le token en session.
$this->app->session->remove('TOKEN');
$this->app->halt(403);
}

это как если сеанс не совпадает с сеансом входа в систему или сбрасывается.

увидеть вхота:

# api.drive.dev
<VirtualHost 127.0.0.1>
DocumentRoot C:/wamp/www/drive/server/web
ServerName api.drive.dev
</VirtualHost>

# backoffice.xxxx.dev
<VirtualHost 127.0.0.1>
Header set Access-Control-Allow-Origin "*"Header set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"Header set Access-Control-Allow-Headers "content-type"Header set Access-Control-Max-Age 1440

DocumentRoot C:/wamp/www/xxxx/backoffice
ServerName backoffice.xxxx.dev
</VirtualHost>

Итак, мой вопрос: почему? это проблема конфигурации или просто ошибка в коде?

я делаю то же самое, что и другое приложение, и оно работает, единственное отличие состоит в том, что почтовый запрос сделан в ajax …

спасибо в advence за помощь и извините за мой худший английский, если есть ошибки.

0

Решение

Сессии работают на основе куки. (В основном это файл cookie PHPSESSID), поэтому каждый раз, когда вы щелкаете ссылку в браузере (или отправляете запрос ajax), браузер автоматически отправляет cookie-файл на сервер. Php сопоставляет этот файл cookie с вашими данными сеанса, и он доступен для вашего кода.

Когда вы делаете запрос с помощью php (возможно, с curl), вам нужно вручную обрабатывать куки для сеанса. Если ваш метод sendrequest разрешает использование файлов cookie, вы можете считывать файлы cookie из первого запроса и передавать их во время выполнения второго запроса.

Но у вас уже есть аутентификация с токеном, на вашем месте я бы не использовал сеанс и не записывал пользовательские данные в memcache или redis, а собирал там информацию о пользователе с помощью токена, указанного в запросе.

0

Другие решения

вот функция:

private function sendRequestPost($postData, $headers, $url, $session_id = null) {

// Create the context for the request
$context = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => $headers,
'content' => json_encode($postData),
'ignore_errors' => true
)
));

if(!is_null($session_id)){
setcookie('symfony', $session_id);
}

// Send the request
$response = file_get_contents($url, FALSE, $context);

return $response;
}
0