web-dev-qa-db-fra.com

Comment déconnecter un utilisateur de l'API à l'aide de laravel Passport

J'utilise actuellement 2 projets. 1 front end (avec laravel backend pour communiquer avec API) et un autre projet laravel (API).

J'utilise maintenant Laravel Passport pour authentifier les utilisateurs et pour m'assurer que chaque appel d'API est un appel autorisé.

Désormais, lorsque je souhaite déconnecter mon utilisateur, j'envoie une demande de publication à mon API (avec jeton porteur) et tente de le déconnecter de l'API (et d'effacer la session, les cookies, ...).

Ensuite, sur le client, j'actualise également ma session pour que le jeton ne soit plus connu. Maintenant, lorsque je retourne à la page de connexion, il se connecte automatiquement à mon utilisateur. (Ou mon utilisateur est toujours connecté).

Quelqu'un peut-il m'expliquer comment déconnecter correctement un utilisateur avec un passeport Laravel?

Merci d'avance.

18
Joren vh

Vous devez supprimer le jeton de la table de la base de données oauth_access_tokens Vous pouvez le faire en créant un nouveau modèle comme OauthAccessToken.

  1. Exécutez la commande php artisan make:model OauthAccessToken pour créer le modèle.

  2. Créez ensuite une relation entre le modèle User et le nouveau modèle OauthAccessToken créé. Dans User.php, ajoutez: 

    public function AauthAcessToken(){
        return $this->hasMany('\App\OauthAccessToken');
    }
    
  3. dans UserController.php, créez une nouvelle fonction pour vous déconnecter:

    public function logoutApi()
    { 
        if (Auth::check()) {
           Auth::user()->AauthAcessToken()->delete();
        }
    }
    
  4. Dans le routeur api.php, créez un nouvel itinéraire:

     Route::post('logout','UserController@logoutApi');
    
  5. Maintenant, vous pouvez vous déconnecter en appelant l'envoi sur URL /api/logout
18
Mahdi

Créez un itinéraire pour vous déconnecter:

$router->group(['middleware' => 'auth:api'], function () use ($router) {
    Route::get('me/logout', 'UserController@logout');
});

Créez une fonction de déconnexion dans userController (ou comme mentionné dans votre itinéraire)

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

Assurez-vous que dans le modèle User, vous avez ce fichier importé.

use Laravel\Passport\HasApiTokens;

et vous utilisez le trait HasApiTokens en utilisant 

use HasApiTokens

dans la classe d’utilisateurs . Maintenant, vous créez la route de déconnexion et dans le contrôleur, procédez comme suit

$user = Auth::user()->token();
$user->revoke();
return 'logged out'; // modify as per your need

Cela déconnectera l'utilisateur du périphérique actuel sur lequel il a demandé de se déconnecter. Si vous souhaitez vous déconnecter de tous les appareils sur lesquels il est connecté, faites-le à la place.

DB::table('oauth_access_tokens')
        ->where('user_id', Auth::user()->id)
        ->update([
            'revoked' => true
        ]);

Cela déconnectera l'utilisateur de partout. Cela vient vraiment en aide lorsque l'utilisateur modifie son mot de passe à l'aide de l'option réinitialiser le mot de passe ou mot de passe oublié et que vous devez le déconnecter de partout.

5
Koushik Das

Ceci est un exemple de code utilisé pour me déconnecter

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