如何使用精简会话中间件在精简休息框架中登录和注销用户


How to log user in and out in slim rest framework using slim session middleware?

我正在使用Slim框架来构建REST API,这是一个粗略的应用程序,我用于开发目的。我想登录和注销用户,并将会话变量设置为用户 ID。用户能够在 rest API 中完美登录,但远程设备无法识别会话(这意味着我的 $SESSION['id'] 为空),因为我清楚地在我的主机休息服务中启动了这个会话。这是我的代码:

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'])时,在我的应用程序中,变量中没有任何内容。有谁知道发生了什么?我真的很困惑,因为根据苗条的文档,它说:

会话 cookie 中间件将与 $_SESSION 超全局无缝协作,因此您可以轻松迁移到此会话 存储中间件,无需更改应用程序代码。

如果您使用会话 cookie 中间件,则无需启动 本机 PHP 会话。_SESSION美元的超全球仍将可用, 它将通过中间件层持久化到 HTTP cookie 中 而不是使用 PHP 的本机会话管理。

问题似乎是您没有足够快地开始会话,而不是会话中间件,我会session_start()放在索引的顶部

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

现在,每次应用程序路由时都会启动它。因此,在登录和注销时删除您的session_start()呼叫。现在在注销路由中重定向到您的登录页面或类似的地方:

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

这会召回session_start(),因此您可以从此处删除注销路由。