【发布时间】:2015-08-04 16:05:04
【问题描述】:
我的会话有问题。 我解释一下:
我有 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中发出的......
提前感谢您的帮助,如果有错误,请原谅我的英语不好。
【问题讨论】:
标签: php session post token basic-authentication