jwt-auth icon indicating copy to clipboard operation
jwt-auth copied to clipboard

JWT Auth not working in Lumen 5.7

Open russofinn opened this issue 6 years ago • 10 comments

Hi, I configured it according to the documentation (https://jwt-auth.readthedocs.io/en/develop/lumen-installation/ and https://jwt-auth.readthedocs.io/en/develop/quick-start/), but when trying to login, api always returns the error 500 Internal Server Error

Your environment

Q A
Bug? no
New Feature? no
Framework Lumen
Framework version 5.7.*
Package version 1.0.0-rc.3
PHP version 7.2.15

russofinn avatar Feb 19 '19 18:02 russofinn

It's working for me on Lumen 5.7. Using release1.0.0-rc.3 as well. I am not even sure I got this right, but that's my current setup anyway

bootstrap\app.php

$app->withFacades();
$app->withEloquent();
...
 $app->routeMiddleware([
     "auth" => App\Http\Middleware\Authenticate::class,
 ]);
...
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);

config\auth.php

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

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

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

Middleware\Authenticate.php

public function handle($request, Closure $next, $guard = null) {

    if ($this->auth->guard($guard)->guest()) {
        return response("Unauthorized.", 401);
    }
    return $next($request);
}

Models\User.php

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

class User extends BaseModel implements AuthenticatableContract, AuthorizableContract, JWTSubject
{

    use Authenticatable, Authorizable;

    ...

    public function getJWTIdentifier() {
        return $this->getKey();
    }

    public function getJWTCustomClaims() {
        return [];
    }
}

Controllers\AuthController.php

public function login(Request $request) {

    // Validate
    $this->userValidator->validateLogin($request);

    // Attempt login
    $credentials = $request->only("email", "password");

    if (!$token = Auth::attempt($credentials)) {
        throw ValidationException::withMessages(["login" => "Incorrect email or password."]);
    }

    return [
        "token" => [
            "access_token" => $token,
            "token_type"   => "Bearer",
            "expire"       => (int) Auth::guard()->factory()->getTTL()
        ]
    ];
}

routes\api.php

$router->get("user", ["middleware" => "auth:api", "uses" => "UserController@authUser"]);

That's pretty much it

Metainy avatar Feb 20 '19 02:02 Metainy

@Metainy is there any config/auth.php in lumen ?

buildsomethingdifferent avatar Apr 22 '19 12:04 buildsomethingdifferent

@buildsomethingdifferent no, you need to create the file.

im using lumen 5.8, works fine, for more guide read here: https://github.com/tymondesigns/jwt-auth/issues/1102

samuelkristianto1 avatar May 06 '19 22:05 samuelkristianto1

i made a repo, a short guide to use tymon jwt auth, jwt auth guide

samuelkristianto1 avatar May 07 '19 02:05 samuelkristianto1

It's working for me on Lumen 5.7. Using release1.0.0-rc.3 as well. I am not even sure I got this right, but that's my current setup anyway

bootstrap\app.php

$app->withFacades();
$app->withEloquent();
...
 $app->routeMiddleware([
     "auth" => App\Http\Middleware\Authenticate::class,
 ]);
...
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(Tymon\JWTAuth\Providers\LumenServiceProvider::class);

config\auth.php

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

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

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

Middleware\Authenticate.php

public function handle($request, Closure $next, $guard = null) {

    if ($this->auth->guard($guard)->guest()) {
        return response("Unauthorized.", 401);
    }
    return $next($request);
}

Models\User.php

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

class User extends BaseModel implements AuthenticatableContract, AuthorizableContract, JWTSubject
{

    use Authenticatable, Authorizable;

    ...

    public function getJWTIdentifier() {
        return $this->getKey();
    }

    public function getJWTCustomClaims() {
        return [];
    }
}

Controllers\AuthController.php

public function login(Request $request) {

    // Validate
    $this->userValidator->validateLogin($request);

    // Attempt login
    $credentials = $request->only("email", "password");

    if (!$token = Auth::attempt($credentials)) {
        throw ValidationException::withMessages(["login" => "Incorrect email or password."]);
    }

    return [
        "token" => [
            "access_token" => $token,
            "token_type"   => "Bearer",
            "expire"       => (int) Auth::guard()->factory()->getTTL()
        ]
    ];
}

routes\api.php

$router->get("user", ["middleware" => "auth:api", "uses" => "UserController@authUser"]);

That's pretty much it

This found for me ! I'm using lumen 5.8. Thank you :D

giancarlobianchi12 avatar May 08 '19 04:05 giancarlobianchi12

How do I use it with fields "login" for email and "senha" for password? I have a legacy database and the table users use for authenticate the fields login and senha and not the default email and password. Thank's.

felipepanegalli avatar Jul 19 '19 20:07 felipepanegalli

How do I use it with fields "login" for email and "senha" for password? I have a legacy database and the table users use for authenticate the fields login and senha and not the default email and password. Thank's.

@felipepanegalli put this in your User Model:


public function getAuthIdentifier() {  
    return $this->login;
}

public function getAuthPassword() {  
    return $this->senha;
}

This overrides the trait Illuminate\Auth\Authenticatable methods.

robsonware avatar Apr 30 '20 22:04 robsonware

Is this still relevant? If so, what is blocking it? Is there anything you can do to help move it forward?

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs.

stale[bot] avatar Dec 25 '20 17:12 stale[bot]

Hi! I'm getting this error. Did you find any solution to it?

yassinOrlando avatar Aug 03 '21 00:08 yassinOrlando

This works for me https://github.com/irazasyed/jwt-auth-guard/issues/34#issuecomment-951483434

billyjamez avatar Oct 26 '21 02:10 billyjamez