У меня проблема с сессиями.
я объясняю :
у меня есть 2 приложения:
Цель миссии — когда мы хотим обновить изображение продукта, оно будет отправлено на диск.
Итак, для этого я авторизирую пользователя с помощью бэк-офиса с почтовым запросом:
$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 за помощь и извините за мой худший английский, если есть ошибки.
Сессии работают на основе куки. (В основном это файл cookie PHPSESSID), поэтому каждый раз, когда вы щелкаете ссылку в браузере (или отправляете запрос ajax), браузер автоматически отправляет cookie-файл на сервер. Php сопоставляет этот файл cookie с вашими данными сеанса, и он доступен для вашего кода.
Когда вы делаете запрос с помощью php (возможно, с curl), вам нужно вручную обрабатывать куки для сеанса. Если ваш метод sendrequest разрешает использование файлов cookie, вы можете считывать файлы cookie из первого запроса и передавать их во время выполнения второго запроса.
Но у вас уже есть аутентификация с токеном, на вашем месте я бы не использовал сеанс и не записывал пользовательские данные в memcache или redis, а собирал там информацию о пользователе с помощью токена, указанного в запросе.
вот функция:
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;
}