Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作

Posted

技术标签:

【中文标题】Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作【英文标题】:How does Auth attempt method work in Laravel/Lumen + JWT + User custom model 【发布时间】:2016-01-01 07:24:46 【问题描述】:

我花了一天时间试图了解如何在我的 API 中注入 JWT 身份验证,但不幸的是我没有取得任何成功。

我正在使用 Lumen 框架。我认为 JWT Auth JWT For Lumen And Laravel 的库很棒。我已经通过composer成功安装了它,看起来它工作正常,但我的项目中没有默认用户模型,我可以轻松迁移到默认值,但我想了解所有这些东西是如何工作的。

我不会在这里发布示例代码,为了让问题更短,这里是JWT Example。

我对 LaravelLumen 比较陌生,所以也许我的问题已经得到解答,但我花了几个小时试图找到文档并理解 Auth 框架中的核心。

我有自定义用户模型

<?php namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model 
    const CREATED_AT = 'createTime';
    const UPDATED_AT = 'updateTime';
    public $timestamps = true;
    protected $table = 'user';
    protected $guarded = ['password','login','id','activationEmail'];
    protected $hidden = [ 'password' ];
    protected function getDateFormat()
    
        return 'U';
    

当然还有自定义控制器将请求路由到它。

但问题是我最近发现 JWT 库 使用 Auth 来实现 jwt 身份验证。

并且 Auth 使用默认用户模型做一些神奇的事情,这反过来会影响UserInterface,我的模型是否也应该实现这个接口?

我尝试在配置中明确指定我的模型,但它尝试使用旧模型并抛出 App\User 未找到的异常。

请帮助找到这些问题的答案:

    默认情况下框架如何知道我的用户表的名称是什么以及它有哪些字段?或者它假设它有 users 名称并且表的列是常见的,如电子邮件、登录名、密码等。

    调用尝试方法时会发生什么?框架尝试通过电子邮件查找用户,例如,如果找到,则检查密码?

    如何指定我的自定义模型,我尝试更改配置并得到此问题中描述的异常Missing argument 1 for Illuminate\Auth\AuthManager::createDriver() lumen and JWT

如果有人帮助解决和理解这个问题,我将不胜感激。

感谢大家的帮助。

【问题讨论】:

【参考方案1】:

好问题,默认情况下,laravel 中的用户表将是用户。

您可以使用 $table 属性在模型中设置表名。

    将模型视为数据库的表示。如果您有一个名为 books 的表,您通常会有一个名为 Books 的模型。同样在 Laravel 中,要生成模型,请从命令行运行 php artisan make:model ModelName。这将为您完成大部分工作。

    当 Auth::attempt() 被调用时,您会传递一组凭据,它会将这些凭据与您的数据库进行匹配。所以你可以做 Auth::attempt(['email' =&gt; $email, 'password' =&gt; $password])Auth::attempt(['username' =&gt; $username, 'password' =&gt; $password, 'active' =&gt; 1], $remember)。是的,密码被核对了,也可以用Hash::check()手动核对密码。

    创建自定义模型时,使用 php artisan generate 命令为您制作模型。然后将命名空间更改为您的目录结构,以便 composer 可以为您自动加载该类(仅当您将模型移动到模型目录时)。从那里你不必做任何事情来与你的数据库交互,同样一个模型只代表一个表。除非您创建一个名为 AllBooks 的模型来表示 Books 表,否则您需要将 $table 属性定义为 $table = 'Books';

我真的建议在你跳入像 Laravel 这样的框架之前深入学习面向对象。虽然您想这样做很好,但它可能会误导您。

如果您打算继续使用 laravel/lumen,这也是一个快速提示。创建表时,请记住添加 updated_at 和 created_at 日期时间字段,如果您不这样做,请在模型中将时间戳属性设置为 false,如下所示:public $timestamps = false;

祝你好运!

【讨论】:

感谢您的回答,但我了解什么是模型、控制器和 OOP,总体来说比较好。我想知道如何为 Auth 外观创建自定义模型。这个类应该实现什么接口等等,才能被Auth使用 将模型视为数据库的表示。 我认为您的意思是将模型视为表的表示 ..【参考方案2】: 登录 - 身份验证 从路由-> 使用 post 方法调用你的控制器 在身份验证控制器中,验证请求,例如, $this->validate($request, [ '电子邮件' => '必需|电子邮件|max:255', '密码' => '必需', ]); 如果验证成功, JWTAuth::attempt($credentials); // 凭据应该是数组格式,例如 array('email' => 'dbfieldname', 'password') 如果无效,抛出类似错误, response()->json(['error' => 'invalid_credentials', 'message' => 'Invalid Credentials'], 401) 如果成功,生成类似的令牌, response()->json(compact('token'));

【讨论】:

【参考方案3】:

在 laravel 中实现 JWT 非常累人且令人困惑,你总是会丢失包和参数。

试试这个 laravel/lumen 包: dingo-api

这是一个简单的示例项目,可以演示 jwt auth 的完整生命周期。这个很容易调试。 dingo-api-demo

在 dingo-api-demo 项目中,您可以在以下这些位置找到大部分问题的答案

    /config/jwt.php /config/api.php /config/auth.php

【讨论】:

以上是关于Auth 尝试方法在 Laravel/Lumen + JWT + 用户自定义模型中如何工作的主要内容,如果未能解决你的问题,请参考以下文章

Laravel / Lumen Auth JWT令牌在后续请求中无效,是否可能已过期?

获取经过身份验证的用户 Laravel/Lumen Passport

laravel / lumen 访问中间件中的 .env 值

Lumen 5.3 未定义变量:闭包

如何在 Laravel Lumen 中实现事件

未定义的方法 Laravel\Lumen\Application::booted()