拉拉维尔7圣堂注销

25

我正在使用 Laravel 7 和 Sanctum 认证我的应用程序。
我该如何实现登出过程?
我使用:

Auth::user()->tokens()->delete();

它可以工作,但它删除了该用户的所有令牌。我想只删除请求注销的用户的令牌,这样其他会话应该保持打开状态。

5个回答

43

你需要指定用户:

// Revoke a specific user token
Auth::user()->tokens()->where('id', $id)->delete();

// Get user who requested the logout
$user = request()->user(); //or Auth::user()

// Revoke current user token
$user->tokens()->where('id', $user->currentAccessToken()->id)->delete();

更新Laravel 7, 8, 9, 10

// Revoke the token that was used to authenticate the current request...
$request->user()->currentAccessToken()->delete();

// Revoke a specific token...
$user->tokens()->where('id', $tokenId)->delete();

不,我不知道如何设置 $id 变量。它不是 id 标记吗? - enfix
@enfix,在这种情况下,id和token不同。如果您是登录用户,则可以通过 $id = Auth :: user()-> id;来获取$id。所以它应该是Auth :: user()-> tokens()-> where('id',Auth :: user()-> id)-> delete(); - STA
1
我使用以下解决方案:Auth::user()->tokens()->where('id', Auth::user()->currentAccessToken()->id)->delete(); - enfix
调用 undefined 方法 App\User::tokens() - Rejaul
@Rejaul App\Models\User::tokens() @Rejaul App\Models\User::tokens() - STA
显示剩余5条评论

20

Laravel 8.x.x 更新

你可以使用三种不同的方法。

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

// Revoke the token that was used to authenticate the current request...
$request->user()->currentAccessToken()->delete();

// Revoke a specific token...
$user->tokens()->where('id', $tokenId)->delete();

13

对于退出登录,如果您使用currentAccessToken(),则可以直接删除令牌。

$request->user()->currentAccessToken()->delete();

1
调用未定义的方法 App\User::currentAccessToken()。 - Rejaul
在你的User模型上添加HasApiTokens特性。 - Stefan Tanevski
即使在我的请求用户上使用了这个特性,也没有结果。:/ - Micheal C Wallas
如果使用当前的AccessToken,那么这个也可以工作:auth()->user()->tokens()->delete() - Paul Iverson Cortez

9

在 Laravel 9 中退出登录

   use Laravel\Sanctum\PersonalAccessToken;


   // Get bearer token from the request
    $accessToken = $request->bearerToken();
    
    // Get access token from database
    $token = PersonalAccessToken::findToken($accessToken);

    // Revoke token
    $token->delete();

2

对于那些遇到 currentAccessToken() 为 null 或未定义的错误的人,请不要忘记将您的注销路由放在 auth:sanctum 中间件中。

这样做后,再执行其他操作。

$request->user()->currentAccessToken()->delete();

将注销路由放置在这里:
Route::middleware('auth:sanctum')->group( function () {
    Route::post('logout', [AuthController::class, 'signout']);
});

不要忘记在请求中添加Bearer令牌。 - timgavin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接