【发布时间】:2014-06-08 11:56:00
【问题描述】:
登录时,我以 JSON 形式返回用户对象 + 会话令牌,以便可以对连接到我的应用程序的移动设备进行身份验证。
但是,我很难理解如何仅使用用户的会话 ID 对用户进行身份验证?
登录后,移动设备会在每次请求时发送会话令牌,这意味着我需要以某种方式检查它是否是同一用户(使用自定义身份验证过滤器)。
我该怎么做?
【问题讨论】:
登录时,我以 JSON 形式返回用户对象 + 会话令牌,以便可以对连接到我的应用程序的移动设备进行身份验证。
但是,我很难理解如何仅使用用户的会话 ID 对用户进行身份验证?
登录后,移动设备会在每次请求时发送会话令牌,这意味着我需要以某种方式检查它是否是同一用户(使用自定义身份验证过滤器)。
我该怎么做?
【问题讨论】:
您可能有一个用于保存令牌的表
在 routes.php 中添加过滤器
Route::group(array('before' => 'auth'), function() { ... })
您可以在 filters.php 中搜索数据库中的令牌,如果不存在则返回无访问响应
Route::filter('auth', function () {
$input_token = Input::get('token');
if (!empty($input_token)) {
$validator = Validator::make(
['token' => $input_token],
['token' => 'token']
);
if (!$validator->fails()) {
$token = Token::where('hash', $input_token)->first();
if ($token) {
$user = User::find($token->user_id);
if ($user) {
Auth::login($user);
return;
}
}
}
}
$response = Response::make(json_encode([
'error' => true,
'messages' => [
Lang::get('errors.NO_ACCESS')
]
]), 200);
$response->header('Content-Type', 'application/json');
return $response;
});
【讨论】:
你可以这样做:
$sessionID = '4842e441673747d0ce8b809fc5d1d06883fde3af'; // get this from \Session::getId(); from your previous authenticated request (after logging in because it changes).
$s = new \Illuminate\Session\Store(NULL, \Session::getHandler(), $sessionID);
$s->start();
$userID = $s->get('login_82e5d2c56bdd0811318f0cf078b78bfc');
\Session::set('login_82e5d2c56bdd0811318f0cf078b78bfc', $userID);
return \Auth::user();
不是最漂亮的代码,但它可以工作。它使用先前的会话 ID 创建会话实例,然后开始从文件中加载它。用户 ID 在该键中,因此它只是在当前会话中设置用户 ID。然后,当您调用 Auth::user() 时,它会使用该用户 ID 加载用户。
密钥中所有数字的原因是因为 larval 开发人员认为散列 Auth 类名称以使密钥尽可能唯一是明智之举... :-S
【讨论】: