繁体   English   中英

无法在 Laravel 中使用 tymon jwt 生成令牌

[英]Unable to generate token using tymon jwt in laravel

我坚持了大约 3 天。 基本上,我正在尝试使用 Tymon 在 laravel 中生成 JWT 令牌。 这是我的控制器文件。

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\User;
use JWTAuth;
use JWT;
use Tymon\JWTAuthExceptions\JWTException;
use Tymon\JWTAuth\Contracts\JWTSubject as JWTSubject;

class AuthenticateController extends Controller
{
 public function index()
{
 //   
}
 public function authenticate(Request $request)
{

    $user = User::where('email', $request->only('email'))->first(); 
    dd($user); //This does show some output      
    $token = JWTAuth::fromUser($user); //returns error message

    return ["error" => NULL, "token" => $token];

 }
}

我使用 Chrome postman 测试了这个 api,但它报告了这个错误:

JWT.php 第 73 行中的 ErrorException:传递给 Tymon\\JWTAuth\\JWT::fromUser() 的参数 1 必须是 Tymon\\JWTAuth\\Contracts\\JWTSubject 的实例,给定的 App\\User 实例,在 /Users/shankerm/mccadmin 中调用/laravel/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php 在第 217 行并定义

请给我一些建议。 我是 Laravel 的新手并且为此苦苦挣扎了很长时间。 谢谢。

您正在使用较新版本的软件包。 这需要User Model实现这个契约。 通过在您的模型中执行此操作来解决它:

use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Model implements JWTSubject {

首先你需要在你的 User 模型上实现 Tymon\\JWTAuth\\Contracts\\JWTSubject 合约,这需要你实现两个方法 getJWTIdentifier() 和 getJWTCustomClaims()。

下面是您的代码的外观示例。 请进行任何必要的更改以满足您自己的需要。

<?php

namespace App;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
    use Notifiable;

    // Rest omitted for brevity

    /**
     * Get the identifier that will be stored in the subject claim of the JWT.
     *
     * @return mixed
     */
    public function getJWTIdentifier()
    {
        return $this->getKey();
    }

    /**
     * Return a key value array, containing any custom claims to be added to the JWT.
     *
     * @return array
     */
    public function getJWTCustomClaims()
    {
        return [];
    }
}

配置身份验证保护

注意:这仅在您使用 Laravel 5.2 及更高版本时有效。

在 config/auth.php 文件中,您需要进行一些更改以配置 Laravel 以使用 jwt 防护来支持您的应用程序身份验证。

对文件进行以下更改:

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],

...

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

这里我们告诉 api 守卫使用 jwt 驱动程序,我们将 api 守卫设置为默认值。

根据以前的经验可能会发生的两个问题

  1. 将 jwt 设置为默认身份验证驱动程序。 你可以这样做

    'api' => [ 'driver' => 'jwt', 'provider' => 'users', 'hash' => false, ],

    1. 不在您的首选模型中实现 JWTSubject,即对于用户模型,您可以这样做

    类 User extends Authenticatable 实现 JWTSubject{ 然后通过接口实现功能如下

    /** * @inheritDoc */ public function getJWTIdentifier() { return $this->getKey(); }

     /** * @inheritDoc */ public function getJWTCustomClaims() { return []; }

也可能是您没有生成 jwt auth 密钥

php artisan jwt:secret

有了这个,你应该在你的 .env 中有一个这样的条目

JWT_SECRET={value generated}

除了JWT 文档中提供的步骤之外,请评论 config/auth.php 中的以下可用部分,该部分在安装 laravel 后默认提供。

'users' => ['driver' => 'database', 'table' => 'users',],

暂无
暂无

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

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