2017-09-02 12 views
1

私はJWT認証用のTymonパッケージをセットアップしました。新しいユーザーのサインアップやログインの場合は、トークンが正常に取得されます。しかし、私がLaravel JWTにトークンを渡すと、ユーザーが見つからないためにエラーが発生します。JWT認証user_not_found Tymon

コントローラコード

public function authenticate() 
    { 
     $credentials = request()->only('user_name','password'); 
     try{ 
      $token = JWTAuth::attempt($credentials); 
      if(!$token){ 
       return response()->json(['error'=>'invalid_credentials'],401); 
      } 
     } 
     catch(JWTException $e){ 
      return response()->json(['error'=>'something went wrong'],500); 
     } 
     return response()->json(['token'=>$token],200); 
    } 

    public function register() 
    { 
     $user_name = request()->user_name; 
     $c_name = request()->company_name; 
     $accessibility_level = request()->accessability_level; 
     $password = request()->password; 
     $contact_number = request()->contact_number; 
     $address = request()->address; 

     $user = User::create([ 
      'user_name'=>$user_name, 
      'c_name'=>$c_name, 
      'accessibility_level'=>$accessibility_level, 
      'password'=>bcrypt($password), 
      'contact_number'=>$contact_number, 
      'address'=>$address 
     ]); 

     $token = JWTAuth::fromUser($user); 

     return response()->json(['token'=>$token],200); 
    } 

上記のコードに問題は正常に動作します。

しかし、JWT検証でいくつかのデータにアクセスしようとすると、USER_NOT_FOUNDとしてエラーが発生します。私は私が持っているトークンをヘッダーとして郵便配達員に渡しました。

ルートコード

Route::get('/some_route','[email protected]')->middleware('jwt.auth'); 

そしてjwt.phpも、私はモデルで使用している正しい識別子(主キー)

'identifier' => 'user_name', 

答えて

2

に設定されているJWT識別子が動作しません。何らかの理由でコード内にidとしてhardcodedがあるため、設定を変更するだけです。

もちろん、calの前にsetIdentifierメソッドを使用することはできます識別子を設定する他のJWTAuthメソッドを実装しています。

public function authenticate() 
    { 
     $credentials = request()->only('user_name','password'); 
     try{ 
      $token = JWTAuth::setIdentifier('user_name')->attempt($credentials); 
      if(!$token){ 
       return response()->json(['error'=>'invalid_credentials'],401); 
      } 
     } 
     catch(JWTException $e){ 
      return response()->json(['error'=>'something went wrong'],500); 
     } 
     return response()->json(['token'=>$token],200); 
    } 

が続いてJWT認証用のカスタムミドルウェアを作成します:

はここに方法です

public function handle($request, \Closure $next) 
    { 
     if (! $token = $this->auth->setIdentifier('user_name')->setRequest($request)->getToken()) { 
      return $this->respond('tymon.jwt.absent', 'token_not_provided', 400); 
     } 

     try { 
      $user = $this->auth->authenticate($token); 
     } catch (TokenExpiredException $e) { 
      return $this->respond('tymon.jwt.expired', 'token_expired', $e->getStatusCode(), [$e]); 
     } catch (JWTException $e) { 
      return $this->respond('tymon.jwt.invalid', 'token_invalid', $e->getStatusCode(), [$e]); 
     } 

     if (! $user) { 
      return $this->respond('tymon.jwt.user_not_found', 'user_not_found', 404); 
     } 

     $this->events->fire('tymon.jwt.valid', $user); 

     return $next($request); 
    }