2017-07-18 15 views
0

現在、私は自分のプロジェクトでJWTを実装しています。このAPIは特定のmodelでのみ利用可能です。このモデルは、私がログインしたいときに宣言したカスタムガードを使って正しく動作します。契約と認証可能な特性が正しく適用されていますが、->byIdメソッドは常に失敗します。ここに私のコードがあります:私は実行するとLaravel + JWT - ユーザーが見つかりませんでした。

'user' => \App\Customer::class, 

:私のjwt.phpファイルで

namespace App; 

class Customer extends Model implements Authenticatable { 

    use \Illuminate\Auth\Authenticatable; 

、私は私のカスタムモデルを使用するように指示しました

JWTAuth::fromUser($customer); 

私は適切なトークンを受け取ります。

私はAuthorization: Bearer <token>ヘッダーを渡してこれをチェックするためにPostmanを使用します。トークンが正しく設定されています。

私の保護されたルートに後続の要求のために、私はこの方法でユーザーを認証しよう:

$token = JWTAuth::parseToken()->authenticate(); 

->authenticate()は常に失敗します。

それが失敗した理由は、このためです:

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

これは常にfalseを返します。

しかし、id$id = $this->getPayload($token)->get('sub');コールから解決すると、この特定のカスタマーの有効なIDがわかります。さらに、このモデルは従来のモデル、PKは、id列で、実際に、私の識別子が正しく設定されている:

'identifier' => 'id', 

はなぜCustomerのインスタンスを解決することができEloquentUserAdapterではないでしょうか?

私はGoogleを精査し、さまざまな修正を試みましたが、何も達成されていません。どんな助けでも大歓迎です。

更新

私が実行されたSQLクエリをダンプしてきたし、それが参照しようとテーブルには、それは私のカスタムモデルではありません、私のデフォルトのユーザー・モデルです。何故ですか?

アップデート2 たUserInterfaceにバインドtymon.jwt.provider.userシングルトンは正しく私のカスタムモデルを参照:

return $app['tymon.jwt.provider.user']; 

は提供:

EloquentUserAdapter {#849 
    #user: Customer {#850 
    #primaryKey: "id" 
    #table: "customers" 

アップデート3

JWTを起動するにはユーザープロバイダ、それは知っている私が使用したいモデルS:

$model = $app->make($this->config('user')); 

収量:

Customer {#1040 
    #primaryKey: "id" 
    #table: "customers" 
+0

試みに対してあなたのトークンbyIdbyCredentialsを認証できるようになります:私はしてみてくださいでしたmichail1982 @明確 – michail1982

+0

それは何もない。 – Ohgodwhy

答えて

0

私は、問題を見つけることができました。

JWTはあなたのモデルを使ってトークンを生成します。ただし、モデルを検証しようとするときに使用するAuth Managerを照らすために、そのモデルを渡すことはありません。 AuthAdapterはもちろんJWTのAuthInterface

use Tymon\JWTAuth\Providers\Auth\AuthInterface; 

class CustomerAuthAdapter extends AuthInterface { 

を拡張する必要があります

それは、同じメソッドのすべてを実装する必要があります。私は自分のAuthAdapterとモデル(顧客)アダプタを作成するために必要な、この目的のために

AuthInterfaceがあります。

この機能のbyCredentialsおよびbyIdメソッドの中で、ユーザーはアプリケーションにログインする必要があります。これにより、後でJWTがトークンを解析して->authenticate()と呼ぶときに、ユーザはAuth::guard('customer')->user()として利用できるようになります。あなたの目的のために、あなたはカスタムガードに気を配らず、ただAuth::user()(またはauth() - > user())を使うことができます。

あなたはまた、JWT UserInterfaceを拡張した、EloquentAdapterあなた自身を提供する必要があります:

use Tymon\JWTAuth\Providers\User\UserInterface; 

class EloquentCustomerAdapter implements UserInterface 

このファイルでは、それはコンストラクタにあなたのCustomerモデル(私の例のために)依存関係を注入することが不可欠です。

public function __construct(Customer $user) 

はその後/config

であなたの jwt.phpファイルを更新します

その後、あなたはコンフィグキャッシュ 職人の設定をクリアするためにあなたのCustomerモデル(または任意のカスタムモデル、使用したい)

関連する問題