tymondesigns / jwt-auth

🔐 JSON Web Token Authentication for Laravel & Lumen
https://jwt-auth.com
MIT License
11.3k stars 1.54k forks source link

JWT Auth not working in Lumen 5.7 #1759

Open russofinn opened 5 years ago

russofinn commented 5 years ago

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
Metainy commented 5 years ago

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

buildsomethingdifferent commented 5 years ago

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

samuelkristianto1 commented 5 years ago

@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 commented 5 years ago

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

giancarlobianchi12 commented 5 years ago

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

felipepanegalli commented 5 years ago

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.

robsonware commented 4 years ago

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.

stale[bot] commented 3 years ago

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.

yassinOrlando commented 3 years ago

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

billyjamez commented 2 years ago

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