tymondesigns / jwt-auth

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

Can not get user when using mongodb #1434

Open yuebanliu opened 6 years ago

yuebanliu commented 6 years ago

Packages

"laravel/framework": "5.5.*",
"dingo/api": "1.0.x@dev",
"jenssegers/mongodb": "^3.3",
"tymon/jwt-auth": "1.0.*@dev"

configurations auth.php, using mongodb

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

app.php

'providers' => [
     ....
        //dingo
        Dingo\Api\Provider\LaravelServiceProvider::class,
        //jwt
        Tymon\JWTAuth\Providers\LaravelServiceProvider::class,
        //mongodb
        Jenssegers\Mongodb\MongodbServiceProvider::class,
        .....
],

'aliases' => [
      .....
        //jwt
        'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
        //
        'Moloquent' => Jenssegers\Mongodb\Eloquent\Model::class,
]

config/api.php

'auth' => [
        'jwt' => Dingo\Api\Auth\Provider\JWT::class
    ],

And in routes/api.php,enable api.auth

$api->group([
         'middleware' => ['api.auth']
    ],function($api){
  ....

App\Models\User.php


namespace App\Models;

// use Illuminate\Database\Eloquent\Model;
use Moloquent;
use Illuminate\Notifications\Notifiable;
use Tymon\JWTAuth\Contracts\JWTSubject;

class User extends Moloquent implements JWTSubject
{
    use Notifiable;
    //
    protected $connection = 'mongodb';

    protected $collection = "user";

    protected $fillable = ['name','email','phone','password'];
    protected $guarded = ['_id'];
    protected $hidden = ['password'];

    public $timestamps = false;

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

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

Now,It can generate token , but when I get user data with token, something wrong.

postman returned


    "message": "Call to undefined method Illuminate\\Auth\\TokenGuard::onceUsingId()",
    "status_code": 500,
    "debug": {
        "line": 59,
        "file": "/xxxxxxxxx/vendor/tymon/jwt-auth/src/Providers/Auth/Illuminate.php",
        "class": "Symfony\\Component\\Debug\\Exception\\FatalThrowableError",
        "trace": [
            "#0 /xxxxxxxxxxx/vendor/tymon/jwt-auth/src/JWTAuth.php(66): Tymon\\JWTAuth\\Providers\\Auth\\Illuminate->byId('5a406851a1b89c0...')",
            "#1 /xxxxxx/vendor/dingo/api/src/Auth/Provider/JWT.php(48): Tymon\\JWTAuth\\JWTAuth->authenticate()",

....

It seems like that byId() method can't deal with mogno model.

JWTAuth.php

    public function authenticate()
    {
        $id = $this->getPayload()->get('sub');

        if (! $this->auth->byId($id)) {
            return false;
        }

        return $this->user();
    }

I can get $id , but $this->auth->byId($id) can not return the user data. If I changed back to msyql , It returned rightly.

tymondesigns commented 6 years ago

looks like you're using laravels token guard instead of the jwt guard. post your config/auth.php file

yuebanliu commented 6 years ago

My config/auth.php `<?php

return [

/*
|--------------------------------------------------------------------------
| Authentication Defaults
|--------------------------------------------------------------------------
|
| This option controls the default authentication "guard" and password
| reset options for your application. You may change these defaults
| as required, but they're a perfect start for most applications.
|
*/

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

/*
|--------------------------------------------------------------------------
| Authentication Guards
|--------------------------------------------------------------------------
|
| Next, you may define every authentication guard for your application.
| Of course, a great default configuration has been defined for you
| here which uses session storage and the Eloquent user provider.
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| Supported: "session", "token"
|
*/

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

/*
|--------------------------------------------------------------------------
| User Providers
|--------------------------------------------------------------------------
|
| All authentication drivers have a user provider. This defines how the
| users are actually retrieved out of your database or other storage
| mechanisms used by this application to persist your user's data.
|
| If you have multiple user tables or models you may configure multiple
| sources which represent each model / table. These sources may then
| be assigned to any extra authentication guards you have defined.
|
| Supported: "database", "eloquent"
|
*/

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

/*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
|
| The expire time is the number of minutes that the reset token should be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/

'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
    ],
],

]; `

yuebanliu commented 6 years ago

And the default value of providers=>users=>driver is eloquent , I think it's not right ,but I don't know what should it is.Should I change it to something else?

websanova commented 6 years ago

Having same issue here, Auth::user() seems to not be using the correct model or something.