現在、2つのプロジェクトを使用しています。 1つのフロントエンド(laravelバックエンドを使用してAPIと通信する)と別のlaravelプロジェクト(API))。
次に、Laravel Passportを使用してユーザーを認証し、すべてのAPI呼び出しが承認された呼び出しであることを確認します。
今、ユーザーをログアウトしたいとき、APIに(Bearerトークンを使用して)ポストリクエストを送信し、APIからログアウトしようとします(そしてセッション、Cookieをクリアします...)
その後、クライアントでセッションを更新して、トークンが認識されないようにします。ログインページに戻ると、ユーザーが自動的にログインします。 (または、私のユーザーはまだログインしているだけです)。
Laravelパスポートでユーザーを適切にログアウトする方法を誰かが説明できますか?
前もって感謝します。
データベーステーブルからトークンを削除する必要がありますoauth_access_tokens
OauthAccessToken
のような新しいモデルを作成することでそれを行うことができます
コマンドphp artisan make:model OauthAccessToken
を実行して、モデルを作成します。
次にUser.php
addで、User
モデルと新しく作成されたOauthAccessToken
Modelの間にリレーションを作成します。
public function AauthAcessToken(){
return $this->hasMany('\App\OauthAccessToken');
}
userController.phpで、ログアウト用の新しい関数を作成します。
public function logoutApi()
{
if (Auth::check()) {
Auth::user()->AauthAcessToken()->delete();
}
}
Api.php routerで、新しいルートを作成します:
Route::post('logout','UserController@logoutApi');
/api/logout
への投稿を呼び出すことでログアウトできるようになりましたログアウトのルートを作成します。
$router->group(['middleware' => 'auth:api'], function () use ($router) {
Route::get('me/logout', 'UserController@logout');
});
UserControllerでログアウト関数を作成します(またはルートに記載されているとおり)
public function logout() {
$accessToken = Auth::user()->token();
DB::table('oauth_refresh_tokens')
->where('access_token_id', $accessToken->id)
->update([
'revoked' => true
]);
$accessToken->revoke();
return response()->json(null, 204);
}
User
モデルで、これがインポートされていることを確認してください
use Laravel\Passport\HasApiTokens;
そして、あなたは使用して特性HasApiTokens
を使用しています
use HasApiTokens
ユーザークラス内。次に、ログアウトルートを作成し、コントローラーでこれを行います
$user = Auth::user()->token();
$user->revoke();
return 'logged out'; // modify as per your need
これにより、ログアウトを要求した現在のデバイスからユーザーがログアウトされます。彼がログインしているすべてのデバイスからログアウトする場合は、代わりにこれを行います
DB::table('oauth_access_tokens')
->where('user_id', Auth::user()->id)
->update([
'revoked' => true
]);
これにより、ユーザーはどこからでもログアウトされます。これは、ユーザーがパスワードのリセットまたはパスワードを忘れたオプションを使用してパスワードを変更し、どこからでもユーザーをログアウトする必要がある場合に役立ちます。
これはログアウトに使用するサンプルコードです
public function logout(Request $request)
{
$request->user()->token()->revoke();
return response()->json([
'message' => 'Successfully logged out'
]);
}