繁体   English   中英

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

[英]How does Auth attempt method work in Laravel/Lumen + JWT + User custom model

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

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

我不会在这里发布示例代码,为了缩短问题,这里是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使用默认的 User 模型做一些神奇的事情,这反过来又会影响UserInterface ,我的模型是否也应该实现这个接口?

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

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

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

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

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

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

感谢大家的帮助。

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

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

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

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

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

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

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

祝你好运!

  • 登录 - 认证
    • 从路由-> 使用 post 方法调用您的控制器
    • 在身份验证控制器中,验证请求,例如,
      • $this->validate($request, [ 'email' => 'required|email|max:255', 'password' => 'required', ]);
      • 如果验证成功,
        • JWTAuth::attempt($credentials); // 凭据应采用数组格式,如 array('email' => 'dbfieldname', 'password')
      • 如果无效,则抛出错误,例如,
        • response()->json(['error' => 'invalid_credentials', 'message' => 'Invalid Credentials'], 401)
      • 如果成功,生成令牌,如,
        • response()->json(compact('token'));

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

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

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

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

  1. /config/jwt.php
  2. /config/api.php
  3. /config/auth.php

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM