【问题标题】:session slim frmework : configuration?session slim 框架:配置?
【发布时间】: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


    【解决方案1】:

    会话基于 cookie 工作。 (主要是 PHPSESSID cookie)所以基本上每次您单击浏览器上的链接(或发送 ajax 请求)时,浏览器都会自动将 cookiea 发送到服务器。 Php 将此 cookie 映射到您的会话数据,并且它可用于您的代码。

    当您使用 php(可能使用 curl)发出请求时,您需要手动处理 cookie 以进行会话。如果您的 sendrequest 方法允许 cookie,您可以从第一个请求中读取 cookie 并在发出第二个请求时传递它们。

    但是你已经有一个使用令牌的身份验证,如果我是你,我不会使用会话并将用户数据写入 memcache 或 redis,并通过请求中提供的令牌获取用户信息。

    【讨论】:

    • 我在驱动器中检索带有 session_id 的 phpsessid(对我来说是'symfony')并返回它。我在后台的 sendRequestPost 中使用 setcookie('symfony', $session_id) 设置了 cookie,然后我发送了请求,但它不起作用......
    • @ThibaudLedeux 你能发布你的 sendRequestPost 方法吗?
    【解决方案2】:

    这里是函数:

    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;
    }
    

    【讨论】:

    • 实际上我知道为什么会话在驱动器端找不到令牌,这是因为当我在登录操作和图片操作中检索 session_id 时它不是同一个会话,session_id 不同.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2017-12-12
    • 2014-02-11
    相关资源
    最近更新 更多