我花了一天的时间试图了解如何在我的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 的异常。
请帮助找到这些问题的答案:
默认情况下,框架如何知道我的用户表的名称以及它有哪些字段?或者它假设它有用户名称,表格的列很常见,如电子邮件,登录名,密码等。
调用try方法时会发生什么?框架试图通过电子邮件查找用户,例如,如果找到,密码被检查?
如何指定我的自定义模型,我尝试更改配置并获得此问题中描述的例外Missing argument 1 for Illuminate\Auth\AuthManager::createDriver() lumen and JWT
如果有人帮助解决并理解这个问题,我将不胜感激。
感谢大家的帮助。
答案 0 :(得分:3)
很好的问题,默认情况下,laravel中的users表将成为用户。
您可以使用$ table属性在模型中设置表名。
将模型视为数据库的表示。如果你有一个名为books的表,你通常会有一个名为Books的模型。同样在Laravel中,要生成一个模型,从命令行运行php artisan make:model ModelName。这将为您完成大部分工作。
当调用Auth :: attempt()时,您将传递一组凭据,它将与您的数据库相匹配。所以你可以做到
Auth::attempt(['email' => $email, 'password' => $password])
或Auth::attempt(['username' => $username, 'password' => $password, 'active' => 1], $remember)
。是的,检查密码,您也可以使用Hash :: check()手动检查密码。
创建自定义模型时,请使用php artisan generate命令为您制作模型。然后将命名空间更改为您的目录结构,composer可以为您自动加载该类(仅当您将模型移动到模型目录时)。从那里你不必做任何与数据库交互的事情,模型只是代表一个表。除非您创建一个名为AllBooks的模型来表示Books表,否则您需要将$table
属性定义为$table = 'Books';
。
在你进入像Laravel这样的框架之前,我真的建议深入学习面向对象。虽然它很棒你想要这样做,但它会误导你。
如果您要继续使用laravel / lumen,也可以快速提示。创建表时,请记住添加updated_at和created_at datetime字段,如果不这样做,请在模型中将timestamp属性设置为false,如下所示:public $timestamps = false;
。
祝你好运!
答案 1 :(得分:0)
答案 2 :(得分:-1)
在laravel中实现JWT非常累人和困惑,你总是会丢失包和参数。
试试这个laravel / lumen包: dingo-api
这是一个简单的例子项目,可以证明jwt auth的整个生命周期。这个很容易调试。 dingo-api-demo