【问题标题】:Laravel Sanctum | Delete current user token not workingLaravel 圣所 |删除当前用户令牌不起作用
【发布时间】:2021-09-16 04:18:07
【问题描述】:

在我尝试做的一件小事上,我真的需要帮助。我尝试在我的 laravel / Vue 设置中为一位用户使用并发的 personal_access_tokens。一切工作正常,除了一件事我想在用户注销时通过它的 id 删除一个令牌。通过一个用户的登录,我为他们创建了一个personal_access_token。随着注销,这个特定的 access_token 应该被删除。

现在在我的注销方法中,我删除了所有令牌。这很好用,但是当删除一个特定的令牌(应该可以)时,我总是会收到此方法不存在的错误:

public function logout(Request $request){
    
   Auth::guard('web')->logout();
    
   // First try: auth()->user()->currentAccessToken()->delete();
   // Second try: $request->user()->token()->revoke();
   auth()->user()->tokens()->delete();
}

错误:

LOG.error:调用未定义的方法 Laravel\Sanctum\TransientToken::delete() {"userId":18,"exception":{}}

api.php

Route::group(['middleware' => 'auth:sanctum'], function () {
    Route::post('/logout', [AuthController::class, 'logout']);
});

我尝试了以下内容:

https://laracasts.com/discuss/channels/laravel/passport-how-can-i-manually-revoke-access-token (护照)https://laracasts.com/discuss/channels/laravel/deleting-users-passport-token-on-logout https://divinglaravel.com/authentication-and-laravel-airlock https://laracasts.com/discuss/channels/laravel/spa-and-mobile-logout?page=1&replyId=698040

在所有这些线程中,使用的方法都应该有效,但不适用于我。我忽略了什么吗?

感谢每一个帮助!

【问题讨论】:

  • 你试过$request->user()->currentAccessToken()->delete();吗?
  • 是的,我确实尝试了 Sanctum 文档中的所有内容。

标签: laravel vue.js laravel-sanctum


【解决方案1】:

我也有同样的问题,调用auth()->user()->currentAccessToken()->delete() 给出错误Call to undefined method Laravel\\Sanctum\\TransientToken::delete()

我发现这是因为 Sanctum 身份验证保护的工作原理。当 Laravel 会话已经存在时,通过会话 cookie,守卫将 TransientToken 放在用户身上,然后通过currentAccessToken() 返回。但是这个TransientToken 不是真正的PersonalAccessToken,也没有delete() 方法。

source code here 中发现了这一点。

我的解决方法是将注销路由不放在 web 组中,而是放在 api 组中,其中不包括会话的中间件。

【讨论】:

  • 我也有同样的问题。我的注销路线是 api/v1/auth/logout 并使用 API 保护组......不幸的是,这并不能解决我的问题。可以分享一下你的步骤吗?
【解决方案2】:

对于特定用户:

Auth::user()->tokens()->where('id', $id)->delete();

对于想要退出的请求用户

$user = request()->user();
$user->tokens()->where('id', $user->currentAccessToken()->id)->delete();

【讨论】:

  • $user->currentAccessToken()->id 不工作。方法未定义。
  • 尝试调试先检查 dd($user->currentAccessToken()) 是否提供了一些价值?
【解决方案3】:

我遇到了同样的问题,如果用户通过 session/cookie 登录,Laravel Sanctum 似乎使用 TransientToken 作为默认 Token 类而不是 PersonalAccessToken。而且 TransientToken 只有 can/cant 方法,所以不支持 delete() 或 ->id 属性。

所以我所做的是检查 currentAccessToken 对象是否有 delete 方法,如果有,我会使用它,如果没有,我会进一步删除会话。

if(method_exists(auth()->user()->currentAccessToken(), 'delete')) {
    auth()->user()->currentAccessToken()->delete();
}

auth()->guard('web')->logout();

【讨论】:

    【解决方案4】:

    文档上很清楚:https://laravel.com/docs/8.x/sanctum#revoking-tokens

    $user->tokens()->where('id', auth()->id())->delete();
    

    【讨论】:

    • 我尝试为一个用户创建并发的personal_access_tokens。如果我使用经过身份验证的用户的 id,我会删除每个令牌。访问currentAccessToken时,获取不到id,无法删除。
    • @Taranis 我刚刚在我使用 Sanctum 的一个项目中对其进行了测试,它运行良好。这是一个屏幕截图。当我 dd 时它返回 true。 prntscr.com/18rgpmn
    • 获取经过身份验证的用户令牌:auth()->user()->currentAccessToken()->token;
    【解决方案5】:

    如果您使用 不记名令牌 进行注销,此代码将有所帮助。 Sanctum Bearer 令牌以令牌 ID 开头,来自 personal_access_tokens

    $tokenId = Str::before(request()->bearerToken(), '|');
    auth()->user()->tokens()->where('id', $tokenId )->delete();
    

    【讨论】:

      猜你喜欢
      • 2021-11-06
      • 1970-01-01
      • 2018-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-11-09
      • 2018-07-20
      • 2023-04-03
      • 2021-06-28
      相关资源
      最近更新 更多