Laravel - 使用会话令牌进行身份验证
Posted
技术标签:
【中文标题】Laravel - 使用会话令牌进行身份验证【英文标题】:Laravel - authenticating with session token 【发布时间】:2014-06-08 11:56:00 【问题描述】:登录时,我以 JSON 形式返回用户对象 + 会话令牌,以便可以对连接到我的应用程序的移动设备进行身份验证。
但是,我很难理解如何仅使用用户的会话 ID 对用户进行身份验证?
登录后,移动设备会在每次请求时发送会话令牌,这意味着我需要以某种方式检查它是否是同一用户(使用自定义身份验证过滤器)。
我该怎么做?
【问题讨论】:
【参考方案1】:您可能有一个用于保存令牌的表
在 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;
);
【讨论】:
【参考方案2】:你可以这样做:
$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
【讨论】:
以上是关于Laravel - 使用会话令牌进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Vue 2 和 Laravel 5.5 中验证会话和身份验证令牌
Laravel 5.3 + Passport:总是未经身份验证的错误