我正在使用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()
,因此您可以从此处删除注销路由。