Sermed mayi
Sermed mayi

Reputation: 757

Lumen Jwt authentication get (Argument 2 passed to Tymon\JWTAuth\JWTGuard) error

I am creating an API with lumen truing to use JWT authentication ,I did all steps in JWT documentation as shown in below but when I tested it I get error:

User Model

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Model implements JWTSubject 
{
    protected $fillable = [
        'username',
        'password',
        'email',
        'fullname',
        'natId',
        'role',
    ];

    public function Predector()
    {
        return $this->hasMany('App\Models\Predect');
    }

    /**
     * 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 [];
    }
} 

AuthController

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Hash;

class AuthController extends Controller
{
   //-----------------------------register users ---------------------------------
   public function register(Request $request)
   {
       $password = password_hash($request->password, PASSWORD_DEFAULT);
       $users_count= User::where('username',$request->username)->get();
       $email_count= User::where('email',$request->email)->get();

       $credentials = request(['username', 'password']);
       dd(auth()->attempt($credentials));
       
       if(count($users_count)>0){
           $data = [
               'status' => 'username found',
           ];
       }
       else {
           if (count($email_count)>0){
               $data = [
                   'status' => 'email is found',
               ];
           }
           else {
               $user = User::create(
                   [
                       'username'=>$request->username,
                       'password'=>$password,
                       'email'=>$request->email,
                       'fullname'=>$request->fullname,
                       'natId'=>$request->nat_id,
                       'role'=>'user'
                   ]);

               if($user){
                   $credentials = request(['username', 'password']);

                   if (! $token = auth()->attempt($credentials)) {
                       return response()->json(['error' => 'Unauthorized'], 401);
                   }
                   else{
                   $data = [
                       'username'=>$request->username,
                       'password'=>$password,
                       'email'=>$request->email,
                       'fullname'=>$request->fullname,
                       'natId'=>$request->nat_id,
                       'status' => 'success',
                       'token' => $token
                   ];}
               }
               else{
                   $data = [
                       'status' => 'failed',
                   ];
               } 
           }
       }
       return $data;  
   }
} 

bootstrap/app.php ,I add these :

$app->routeMiddleware([
    'auth' => App\Http\Middleware\Authenticate::class,
    'jwt.auth' => \Tymon\JWTAuth\Middleware\GetUserFromToken::class,
    'admin.auth' => \App\Http\Middleware\AdminMiddleware::class,
]);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);
$app->register(Flipbox\LumenGenerator\LumenGeneratorServiceProvider::class);

my route :

$router->group(['prefix'=>'api'], function () use ($router) {
       $router->post('/register','AuthController@register');
        $router->post('/login','AuthController@login');
    });

when i tested it in Insomnia I get this error : Argument 2 passed to Tymon\JWTAuth\JWTGuard::__construct() must be an instance of Illuminate\Contracts\Auth\UserProvider, null given, called in E:\Laravel\euro2021\vendor\tymon\jwt-auth\src\Providers\AbstractServiceProvider.php on line 102

what I miss in my steps? and what is the solution?

New

congig/auth.php

<?php
return [
    'defaults' => [
        'guard' => env('AUTH_GUARD', 'api'),
        'passwords' => 'users',
    ],
    
    'guards' => [
         'api' => [
           'driver' => 'jwt',
           'provider' => 'users'
         ],
    ],
    
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model'  =>  App\Models\User::class,
        ]
    ],

    'passwords' => [
        //
    ],
];

Upvotes: 5

Views: 4877

Answers (1)

codedge
codedge

Reputation: 5164

In your config/auth.php you are probably missing to set a provider and referencing a guard like this

'defaults' => [
    'guard' => env('AUTH_GUARD', 'api'),
    'passwords' => 'users',
],

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

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model'  =>  App\User::class,
    ]
],

This is described in the JWT documentation.

Furthermore your user model needs to extend Authenticable

use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable as AuthorizableContract;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Model implements AuthenticatableContract, AuthorizableContract, JWTSubject
{
    use Authenticatable, Authorizable;

    // .. more
}

Upvotes: 8

Related Questions