web-dev-qa-db-ja.com

laravel Passportを使用してAPIからユーザーをログアウトする方法

現在、2つのプロジェクトを使用しています。 1つのフロントエンド(laravelバックエンドを使用してAPIと通信する)と別のlaravelプロジェクト(API))。

次に、Laravel Passportを使用してユーザーを認証し、すべてのAPI呼び出しが承認された呼び出しであることを確認します。

今、ユーザーをログアウトしたいとき、APIに(Bearerトークンを使用して)ポストリクエストを送信し、APIからログアウトしようとします(そしてセッション、Cookieをクリアします...)

その後、クライアントでセッションを更新して、トークンが認識されないようにします。ログインページに戻ると、ユーザーが自動的にログインします。 (または、私のユーザーはまだログインしているだけです)。

Laravelパスポートでユーザーを適切にログアウトする方法を誰かが説明できますか?

前もって感謝します。

28
Joren vh

データベーステーブルからトークンを削除する必要がありますoauth_access_tokensOauthAccessTokenのような新しいモデルを作成することでそれを行うことができます

  1. コマンドphp artisan make:model OauthAccessTokenを実行して、モデルを作成します。

  2. 次にUser.php addで、Userモデルと新しく作成されたOauthAccessToken Modelの間にリレーションを作成します。

    public function AauthAcessToken(){
        return $this->hasMany('\App\OauthAccessToken');
    }
    
  3. userController.phpで、ログアウト用の新しい関数を作成します。

    public function logoutApi()
    { 
        if (Auth::check()) {
           Auth::user()->AauthAcessToken()->delete();
        }
    }
    
  4. Api.php routerで、新しいルートを作成します:

     Route::post('logout','UserController@logoutApi');
    
  5. URL /api/logoutへの投稿を呼び出すことでログアウトできるようになりました
27
Mahdi

ログアウトのルートを作成します。

$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);
    }
19
PHP Worm...

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

これにより、ユーザーはどこからでもログアウトされます。これは、ユーザーがパスワードのリセットまたはパスワードを忘れたオプションを使用してパスワードを変更し、どこからでもユーザーをログアウトする必要がある場合に役立ちます。

18
Koushik Das

これはログアウトに使用するサンプルコードです

public function logout(Request $request)
{
    $request->user()->token()->revoke();
    return response()->json([
        'message' => 'Successfully logged out'
    ]);
}
9
Ramadhan