Tymon JWT user_not_found - Laravel 5.1

时间:2015-12-13 00:04:37

标签: php laravel authentication laravel-5.1 jwt

我正在为移动应用构建api,我正在使用JWT对用户进行身份验证。我试图在Laravel 5.1中实现它。

每当我使用通过身份验证方法提供给我的令牌时,我一直收到错误:{"error":"user_not_found"}

我的流程:

  1. 使用Auth::attempt($credentials)
  2. 对用户进行身份验证
  3. 使用$user = User::where('user_id', Auth::user()->user_id)->first();
  4. 从数据库中获取用户
  5. 使用

    为用户设置令牌
    $token = "";
    try {
        // attempt to verify the credentials and create a token for the user
        if (! $token = JWTAuth::fromUser($user)) {
            return response()->json(['error' => 'invalid_credentials'], 401);
        }
    } catch (JWTException $e) {
            // something went wrong whilst attempting to encode the token
            return response()->json(['error' => 'could_not_create_token'], 500);
    }
    
  6. 使用此方法返回令牌:

    eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOm51bGwsImlzcyI6Imh0dHA6XC9cL3BlZGxyLmRldlwvYXBpXC9sb2dpbiIsImlhdCI6MTQ0OTk2NDQ2NywiZXhwIjoxNDQ5OTY4MDY3LCJuYmYiOjE0NDk5NjQ0NjcsImp0aSI6IjJlMDMyMjA5MjMyZWM1MDVlY2I3YzE4ODFjNDk1MzFmIn0.tbO_fv4WDQ6WgiHtyYJAq2rjnOtaYPq85VO2ja2YVzw
    

    但是在尝试使用令牌验证用户时,会抛出错误{"error":"user_not_found"}

    我的routes.php:

    Route::any('/login', ['as' => 'login', 'uses' => 'APIController@postLogin']);
    Route::group(['middleware' => 'jwt.auth'], function()   {
        Route::any('/users', ['as' => 'users', 'uses' => 'UsersController@getUsers']);
    });
    

    如果我取出中间件组,我可以访问/users路由。 我认为它发生在GetUserFromToken命名空间中Tymon\JWTAuth\Middleware类的某个位置,因为这是唯一列出错误user_not_found的地方。

    我的数据库使用user_id,而不只是id作为主键,这可能是问题吗?

4 个答案:

答案 0 :(得分:4)

最后我明白了。

我进入了发布config/jwt.php时创建的JWTAuthServiceProvider文件,然后我将identifier更改为Users表的主键(作为user设置设置为App\User,我的主键在用户模型中为user_id

'identifier' => 'user_id' // somewhere around line 79

它有效。

答案 1 :(得分:0)

您需要一个首先创建会话的登录路线。然后得到用户。

Route::post('sessions/create', ['uses' => 'Auth\JwtAuthController@authenticate']);
Route::get('sessions/user', ['uses' => 'Auth\JwtAuthController@getAuthenticatedUser']);

在控制器中尝试以下代码:

/**
 * Authenticate by credentials
 */
public function authenticate()
{

    $credentials = request()->only('email', 'password');

    try {

        if ( !$token = JWTAuth::attempt($credentials) ) {
            return $this->error('invalid-credentials', 401);
        }

    } catch (JWTException $e) {
        // something went wrong whilst attempting to encode the token
        return $this->error('could-not-create-token', 500);
    }

    return response()->json(compact('token'));

}


/**
 * Get the user by jwt token, or return an error
 *
 * @return Response
 */
public function getAuthenticatedUser()
{

    try {

        if ( !$user = JWTAuth::parseToken()->authenticate() ) {
            return $this->error('user-not-found', 204);
        }

    } catch (TokenExpiredException $e) {

        return $this->error('token-expired', 401);

    } catch (TokenInvalidException $e) {

        return $this->error('token-invalid', 401);

    } catch (JWTException $e) {

        return $this->error('token-absent', 400);

    }

    // the token is valid and we have found the user via the sub claim
    return response()->json(compact('user'));
}


/**
 * Error formatter
 *
 * @param  string  $message
 * @param  integer $statuscode
 *
 * @return \Illuminate\Http\JsonResponse
 */
private function error($message, $statuscode = 401)
{
    return response()->json(['error' => $message], $statuscode);
}

答案 2 :(得分:0)

解...

如果你的代码是正确的,那么如果得到你的输出:

{
  "error": "invalid_credentials"
}

只需按照以下步骤操作:---------------

第一步检查:

dd($request->only('email', 'password')); dd($credentials);  //输出应该是这样的..

array:2 [
  "email" => "myemail@myemail.com"
  "password" => "test123"
]

第二步检查:

 dd($token); 

//输出应为:false

第三步检查:

1)在app/Http/Kernel.php内,确保\App\Http\Middleware\VerifyCsrfToken::class被注释掉。   2)在config/jwt.php内,确保将标识符设置为Users表的主键。

'identifier' => 'userid' //默认设置为'id'

上一步转到:App \ Config \ auth.php

在线号码:70更改模型保存模型的位置(用户)

例如:App\Model\Myuser\User

在线号码:71将表格名称更改为您在模型中设置的内容(用户)

例如:protected $table = 'my_user';

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

它可能对你有帮助....

答案 3 :(得分:0)

尝试:在用户模型中,写以下一行:保护的$primaryKey = 'user_id';

示例:

class User extends Authenticatable
{
    use Notifiable;

    protected $table = 'my_user';
    protected $primaryKey = 'user_id';
}