laravel使用JWT时怎么生成的token?

251419392
  • 1.3k

看的站内的这篇连接Laravel5.5 安装 JWT
有两个问题想请教一下:
文章一开始讲的配置Model和Controller这一节里面为什么把User模型直接放到app目录下呢?不应该是Models目录下吗?
而且User模型不都是继承Model这样写class User extends Model
他这里为什么这样class User extends Authenticatable implements JWTSubject写呢?
这样写就不能继承Model了啊

第二个问题AuthController里面的login方法的$token怎么生成的呢?这个$token就是最终返回给前端的TOKEN吧 但是我看这个$token没写怎么得到的啊?我测试是一直提示Undefined variable: token 大家能给解释一下吗?谢谢

<?php
namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AuthController extends Controller
{
    public function __construct()
    {
        $this->middleware('auth:api', ['except' => ['login']]);
    }

    public function login()
    {
        $credentials = request(['email', 'password']);

        if (! $token = auth()->attempt($credentials)) {
            return response()->json(['error' => 'Unauthorized'], 401);
        }

        return $this->respondWithToken($token);
    }
回复
阅读 2.7k
2 个回答
✓ 已被采纳

第一个问题:User模型放在哪个目录下没有统一的标准,根据你个人习惯来定,而且laravel自带也没有Models文件夹。
第二个问题:所继承的Authenticatable,是 use Illuminate\Foundation\Auth\User as Authenticatable 这段代码,进入Illuminate\Foundation\Auth\User 这个类,我们会看到 class User extends Model 这段代码,所以 User模型还是继承了Model哦
第三个问题 是JWT底层实现的,这个我也不是很清楚,不知道有没有大牛来补充下

auth()->attempt 方法如果信息验证成功,会直接返回 token。如果返回 true,可能是配置文件 config/auth.php 没有修改,因为 laravel 是通过配置文件决定用户验证使用 session 还是 jwt。返回 false 则是传入的数组有问题。

关于第二个问题,是使用了一个语法小技巧,$token 的赋值是在 if 条件语句中,关于 token 的生成细节,可以搜索 jwt token 关键词。

if (! $token = auth()->attempt($credentials)) {
    return response()->json(['error' => 'Unauthorized'], 401);
}
宣传栏