php 删除laravel passport用户令牌

azpvetkf  于 2023-02-03  发布在  PHP
关注(0)|答案(5)|浏览(251)

在我的单元测试中,我为一个用户生成了一个令牌:

$tokenString = $this->user->createToken('PHPunit', ['example'])->accessToken;

之后如何删除此用户的令牌?

bxjv4tth

bxjv4tth1#

这是当用户注销时我所做的。

public function logout() {
    Auth::user()->tokens->each(function($token, $key) {
        $token->delete();
    });

    return response()->json('Successfully logged out');
}

此代码将删除用户生成的每个令牌。

bvjxkvbb

bvjxkvbb2#

我认为类似下面的代码可以撤销令牌:

$this->user->token()->revoke()

基于this link

ygya80vv

ygya80vv3#

Laravel Sanctum的文档说明了3种不同的方法来撤销令牌。你可以在这里找到它。
但在大多数情况下,我们只是通过以下方式撤销所有用户的令牌:

// Revoke all tokens...
auth()->user()->tokens()->delete();

注意:由于某种原因,intephense给出了一个错误,说tokens()方法未定义,但代码工作正常。Hirotaka Miyata找到了一个变通方案here
所以overall logout方法可以是这样的:

public function logout()
{
    //the comment below just to ignore intelephense(1013) annoying error.
    /** @var \App\Models\User $user **/
    $user = Auth::user();
    $user->tokens()->delete();

    return [
        'message' => 'logged out'
    ];
}
zrfyljdw

zrfyljdw4#

最佳解决方案是

public function logout(LogoutRequest $request): \Illuminate\Http\JsonResponse
    {
        if(!$user = User::where('uuid',$request->uuid)->first())
            return $this->failResponse("User not found!", 401);

        try {
            $this->revokeTokens($user->tokens);

            return $this->successResponse([

            ], HTTP_OK, 'Successfully Logout');

        }catch (\Exception $exception) {
            ExceptionLog::exception($exception);

            return $this->failResponse($exception->getMessage());
        }

    }

    public function revokeTokens($userTokens)
    {
        foreach($userTokens as $token) {
            $token->revoke();
        }
    }
edqdpe6u

edqdpe6u5#

public function __invoke(Request $request)
{
    $request->user()
        ->tokens
        ->each(function ($token, $key) {
            $this->revokeAccessAndRefreshTokens($token->id);
        });

    return response()->json('Logged out successfully', 200);
}

protected function revokeAccessAndRefreshTokens($tokenId) {
    $tokenRepository = app('Laravel\Passport\TokenRepository');
    $refreshTokenRepository = app('Laravel\Passport\RefreshTokenRepository');

    $tokenRepository->revokeAccessToken($tokenId);
    $refreshTokenRepository->revokeRefreshTokensByAccessTokenId($tokenId);
}

相关问题