2016-03-11 1 views
1

Я использую Slim framework для создания REST API, и это грубое приложение, которое я использую для целей разработки. Я хочу войти в систему и выйти из нее, и я установил переменную сеанса в идентификатор пользователя. Пользователь может войти в систему отлично в API останова, но удаленное устройство не распознает сеанс (что означает, что мой $ SESSION ['id'] пуст), где, как я ясно начал этот сеанс в моей службе отдыха хоста. Вот мой код:Как входить и выходить из системы в slim rest framework, используя промежуточное ПО slim session?

require 'lib/Slim/Slim.php'; 
use lib\Slim\Middleware\SessionCookie; 

\Slim\Slim::registerAutoloader(); 

$app = new \Slim\Slim(
    array(
'cookies.encrypt' => true, 
    'cookies.secret_key' => 'my_secret_key', 
    'cookies.cipher' => MCRYPT_RIJNDAEL_256, 
    'cookies.cipher_mode' => MCRYPT_MODE_CBC 
     ) 
); 

$app->add(new \Slim\Middleware\SessionCookie(array(
    'expires' => '20 minutes', 
    'path' => '/', 
    'domain' => '', 
    'secure' => false, 
    'httponly' => false, 
    'name' => 'slim_session', 
    'secret' => '', 
    'cipher' => MCRYPT_RIJNDAEL_256, 
    'cipher_mode' => MCRYPT_MODE_CBC 
))); 

$app->get("/login/:string", function($string) use ($app) 
     { 
      $input = json_decode($string); 
      try 
      { 
       if ($input->username && $input->password) 
        { 
         $user = Model::factory('Users')->where("username",$input->username)->where("password",md5($input->password))->find_one(); 
         //$app->setCookie('user_id',$user->id); 
          session_cache_limiter(false); 
          session_start(); 
         $_SESSION['id'] = $user->id; 

         $status = 'success'; 
         $message = 'Logged in successfully.'; 
        } 
       else 
         { 
          $status = false; 
          $message = 'Could not log you in. Please try again.'; 
         } 

      } 
      catch (Exception $e) 
        { 
         $status = 'danger'; 
         $message = $e->getMessage(); 
        } 
      $response = array(
       'status' => $status, 
       'message' => $message 
      ); 
      $app->response()->header("Content-Type", "application/json"); 
      echo json_encode($response); 

     }); 



     $app->get("/logout",function() use ($app) 
     { 


      try { 
         unset($_SESSION['id']); 
         session_destroy(); 
         session_start(); 

         //$app->getCookie('user_id'); 

         $status = 'success'; 
         $message = 'You have been logged out successfully'; 
        } 

      catch (Exception $e) 
        { 
         $status = 'danger'; 
         $message = $e->getMessage(); 
        } 
      $response = array(
       'status' => $status, 
       'message' => $message 
      ); 

      $app->response()->header("Content-Type", "application/json"); 
      echo json_encode($response); 

     }); 

Он возвращается «Помнить успешно», но на самом деле не войдя в меня так в моем приложении, когда я проверяю isset($_SESSION['id']), нет ничего в переменной. Кто-нибудь знает, что происходит? Я действительно путаю, потому что в соответствии с тонкой документацией, он говорит:

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

Если вы используете промежуточное ПО cookie сеанса, вам не нужно начинать собственный PHP-сеанс . Суперглобальный $ _SESSION будет по-прежнему доступен, , и он будет сохраняться в HTTP-файле cookie через уровень промежуточного программного обеспечения , а не с помощью собственного управления сессиями PHP.

ответ

0

Вопрос, казалось бы, что вы не начинать сеанс в ближайшее время от чего прийти не что-нибудь с сессии промежуточного слоя я бы разместить session_start() в верхней части индекса

require 'lib/Slim/Slim.php'; 
use lib\Slim\Middleware\SessionCookie; 
session_start(); 

Теперь он запускается каждый время ваших маршрутов. Поэтому при входе и выходе удалите вызовы session_start(). В настоящее время в пути выхода из системы перенаправления на целевую страницу или где-нибудь:

$app->redirect('/yourawesomepage'); 

что напоминает session_start(), так что вы можете удалить, что отсюда ваш маршрут выхода из системы.

+0

Thankyou @nerdlyist Вы уверены, что мне не нужно ничего отправлять в json-заголовках, например, в cookie-файле сеанса или что-то в этом роде? – Daniel

+0

@ Даниэль Не то, что я знаю. PHP будет обрабатывать свой собственный идентификатор сеанса, если это то, о чем вы говорите. – nerdlyist

 Смежные вопросы

  • Нет связанных вопросов^_^