2016-03-21 17 views
0

私はLaravel 5.1アプリケーションの内部でステートレスログインと検証にJWT認証を使用するAPIセクションを作成しました。 このアプリは、laravelによって提供される認証サービスと 'users'テーブルをデフォルトとして使用します。私のAPIは 'クライアント'テーブルの認証が必要です。 私は、auth.php設定ファイルをmodel => 'Models\AuthClient'table => 'clients'に変更するミドルウェアを作成することで、JWTを使用するときにusersテーブルを回避することができました。すべての良好な検証作業は、資格情報が正しいときにトークンを作成します。Laravel 5.1 JWTカスタムテーブルからログインしたユーザーを取得します

ミドルウェア:

public function handle($request, Closure $next) 
{ 
    \Config::set('auth.model', 'App\Models\AuthClient'); 
    \Config::set('auth.table', 'clients'); 

    return $next($request); 
} 

ApiAuthControllerログイン機能:

public function authenticate(Request $request) 
{ 
    $cred = $request->only('email', 'password', 'client_code'); 

    $validator = $this->validator($cred); 
    if($validator->fails()) { 
     return response()->json($validator->errors()); 
    } 

    $credentials = ['email'=> $cred['email'], 'password'=> $cred['password']]; 

    /* 
    * If the user enters a "client_code", login the user with that credential 
    */ 
    if(issetNotEmpty($cred['client_code'])) { 
     \App\Models\AuthClient::$defaultAuth = 'client_code'; 
     $credentials = ['client_code' => $cred['client_code'], 'password' => $cred['client_code']]; 
    } 

    try { 
     if (!$token = JWTAuth::attempt($credentials)) { 
      return response()->json(['error' => 'Datele de autentificare nu sunt corecte.'], 401); 
     } 
    } catch (JWTException $e) { 
     // something went wrong 
     return response()->json(['error' => 'could_not_create_token'], 500); 
    } 

    // if no errors are encountered we can return a JWT 
    return response()->json(compact('token')); 
} 

私はこのようなトークンからログインしているユーザーを取得しようとすると、私の問題がある:

public function getContracts(Request $request) 
{ 
    $client = JWTAuth::parseToken()->authenticate(); 
    $contracts = $client->contracts; 
    dd($client); 

    return response()->json($contracts); 
} 

authenticate()関数は 'clients'の代わりに 'users'テーブルからマッチモデルを返しますalt私はauth.phpとjwt.phpを 'Models \ AuthClient'に設定し、IDは 'clients'からのものです。

AuthCientモデル:

class AuthClient extends Model implements AuthenticatableContract, CanResetPasswordContract 
{ 
    use Authenticatable, CanResetPassword; 

    protected $table = 'clients'; 

    public static $defaultAuth = 'email'; 
    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 'email', 'login_password', 'api_token']; 

    protected $hidden = ['login_password', 'api_token']; 
} 

私は何をしないのですか?

ありがとうございます!

答えて

2

私はメインルートグループ(api-amanet)にミドルウェアを置いており、そのトリックをしたと思います。 auth.phpをauthenticate関数内で変更する前に、Authクラスがデフォルトのauth.php設定で既にインスタンス化されていて、設定を変更したときに「リフレッシュ」しなかったと推測しています。

/** ********************* API ROUTES ********************** */ 
Route::group(['prefix' => 'api-amanet', 'middleware' => ['config.clients']], function() 
{ 

Route::post('authenticate','Api\[email protected]'); 

Route::group(['middleware' => ['jwt.auth']], function() { 
    Route::post('password/reset', 'Api\[email protected]'); 

    Route::resource('update-profile','Api\[email protected]'); 

    Route::resource('get-contracts','Api\[email protected]'); 
}); 

});

これは他の人に役立つことを願っています。

関連する問題