【问题标题】:Lumen - Non token-based authenthication?Lumen - 非基于令牌的身份验证?
【发布时间】:2017-10-18 19:45:03
【问题描述】:

我第一次尝试使用 lumen 创建一个安静的后端服务。

我习惯于使用 laravel,但使用 lumen 我已经卡在 autentication 上。我找不到这方面的任何教程。

我什至不确定我的逻辑对此是否安全。基本上我收到一个包含电子邮件和密码的发布请求,然后我想检查详细信息是否正确等并对用户进行身份验证。

我觉得我错过了一些东西,这是 lumes 标准附带的东西还是我需要重写 Auth 服务

【问题讨论】:

  • 使用 Lumen,身份验证(通常)使用令牌处理。因此,在您的情况下,应该向身份验证服务发出一个发布请求以获取一个令牌,然后之后的每个请求都会发送相同的令牌来验证该请求。然而,据我所知,这些都不是开箱即用的 Lumen 内置的。这实际上是我使用完整的 Laravel 框架甚至 API 的原因,除非我需要非常薄的东西。

标签: php laravel lumen


【解决方案1】:

它似乎在您链接的文档中。

$this->app['auth']->viaRequest('api', function ($request) {
    // Return User or null...
});   

Request 类被传入此函数。您需要从中获取电子邮件和密码$request->get('email')request->get('password'),检查以确保它们有效。

我不确定使用 Lumen 执行此操作的最佳方法或可用多少,所以为了方便起见,您可以执行以下操作...

$this->app['auth']->viaRequest('api', function ($request) {

    $email = $request->get('email');
    $password = $request->get('password');
    $user = \DB::table('users')->where('email', $email)->first();

    // Invalid Email
    if ($user === null) {
        return null;
    }

    // Check if password matches
    if ( \Hash::check($user->password, $password) ) {
        return $user;
    }

    // Invalid password
    return null;
});

请记住,Lumen 不支持会话状态,您需要为每个请求传递电子邮件和密码。但是,一旦设置完成,您在 Lumen 中所需要做的就是使用Auth::user() 来抓取用户。

您还可以使用 jwt-auth,它使用 JSON Web 令牌,这也使其相当容易,并且允许您不传递电子邮件和密码。

https://github.com/tymondesigns/jwt-auth

【讨论】:

    【解决方案2】:

    对于遇到此问题的任何人。我就是这样解决的:

    在 auth serviceProvider(引导方法)中,您检查是否存在授权标头。如果有,它应该包含一个 apiToken,您可以验证并继续正常流程。

    如果不存在授权标头,您可以检查请求变量以获取电子邮件和密码。验证登录,成功后保存一个新的 apiToken。我将此令牌返回到前端,并制作了一个处理所有 ajax 请求的功能,以将此令牌包含在标头中。我还实现了一个函数来处理我的前端应用程序中的每个响应,当它重定向到登录页面时,它会检查 401。

    通过这种方法,您可以使用两种身份验证方法,并且 Auth::user() 可通过您的应用程序使用。只需确保登录页面未使用 Auth 中间件处理即可!

    【讨论】:

      猜你喜欢
      • 2021-01-25
      • 2016-01-23
      • 2016-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 2017-07-10
      • 2020-03-03
      相关资源
      最近更新 更多