Auth如何在Laravel / Lumen + JWT +用户自定义模型

时间:2015-10-04 15:17:30

标签: php laravel authentication jwt lumen

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

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

我不会在这里发布示例代码,以使问题更短,这里是JWT Example

我对 Laravel Lumen 相对较新,所以也许我的问题已经回答,但我花了几个小时试图找到文档并理解 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 的异常。

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

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

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

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

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

    感谢大家的帮助。

3 个答案:

答案 0 :(得分:3)

很好的问题,默认情况下,laravel中的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';

  4. 在你进入像Laravel这样的框架之前,我真的建议深入学习面向对象。虽然它很棒你想要这样做,但它会误导你。

    如果您要继续使用laravel / lumen,也可以快速提示。创建表时,请记住添加updated_at和created_at datetime字段,如果不这样做,请在模型中将timestamp属性设置为false,如下所示:public $timestamps = false;

    祝你好运!

答案 1 :(得分:0)

  • 登录 - 验证
    • 来自路线 - &gt;使用post方法调用您的控制器
    • 在auth控制器中,验证请求,如,
      • $ this-&gt; validate($ request,[     'email'=&gt; 'required | email | max:255','password'=&gt; '需要', ]);
      • 如果成功验证,
        • JWTAuth ::尝试($凭证); //凭证应采用数组格式,如数组('email'=&gt;'dbfieldname','password')
      • 如果无效,抛出错误,
        • response() - &gt; json(['error'=&gt;'invalid_credentials','message'=&gt;'无效的凭据'],401)
      • 如果成功,生成令牌,
        • 响应() - &GT; JSON(紧凑( '令牌'));

答案 2 :(得分:-1)

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

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

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

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

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