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 中验证会话和身份验证令牌

Django Rest 框架中的基于会话的与令牌身份验证

Laravel 5.3 + Passport:总是未经身份验证的错误

通过令牌进行身份验证,如果令牌失败,则通过会话进行身份验证,使用 Passport?

Laravel 5.3记住我身份验证问题

Laravel 5.3记住我身份验证问题