【问题标题】:Tymon JWT user_not_found - Laravel 5.1Tymon JWT user_not_found - Laravel 5.1
【发布时间】:2016-03-18 17:16:14
【问题描述】:

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

每当我使用通过身份验证方法提供给我的令牌时,我都会不断收到错误消息:{"error":"user_not_found"}

我的过程:

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

    为用户设置 Token
    $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);
    }
    

它正在使用这个方法返回一个令牌:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOm51bGwsImlzcyI6Imh0dHA6XC9cL3BlZGxyLmRldlwvYXBpXC9sb2dpbiIsImlhdCI6MTQ0OTk2NDQ2NywiZXhwIjoxNDQ5OTY4MDY3LCJuYmYiOjE0NDk5NjQ0NjcsImp0aSI6IjJlMDMyMjA5MjMyZWM1MDVlY2I3YzE4ODFjNDk1MzFmIn0.tbO_fv4WDQ6WgiHtyYJAq2rjnOtaYPq85VO2ja2YVzw

但是当尝试使用令牌对用户进行身份验证时,它会抛出错误{"error":"user_not_found"}

我的路线.php:

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

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

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

【问题讨论】:

  • 你的问题已经回答了
  • @PeteHouston 检查我 2 小时前的回答。我设法解决了。

标签: php laravel authentication laravel-5.1 jwt


【解决方案1】:

试试看:在用户模型中写一行:protected $primaryKey = 'user_id';

例子:

class User extends Authenticatable
{
    use Notifiable;

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

【讨论】:

    【解决方案2】:

    解决方案...

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

    {
      "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 内部,确保将标识符设置为用户表的主键。

    '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】:

      我终于明白了。

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

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

      它奏效了。

      【讨论】:

      【解决方案4】:

      您需要一个登录路由,它首先创建一个会话。然后获取用户。

      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);
      }
      

      【讨论】:

      • 但它在第一个请求中给了我令牌
      • 1)。首先,您将登录详细信息发布到 /sessions/create。 2)。当令牌返回给您时......然后用户拥有有效的凭据。这意味着您可以将令牌用于所有进一步的授权。
      • 我正在这样做,我正在取回令牌,我有有效的凭据,但之后令牌不起作用。
      • 您需要使用令牌设置请求标头。授权:不记名令牌
      猜你喜欢
      • 2018-02-11
      • 2017-06-10
      • 2017-09-17
      • 2018-01-09
      • 2020-05-11
      • 2019-05-22
      • 2017-03-31
      • 2017-07-29
      • 2018-10-21
      相关资源
      最近更新 更多