首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Laravel Sanctum \x删除当前用户令牌不工作

Laravel Sanctum \x删除当前用户令牌不工作
EN

Stack Overflow用户
提问于 2021-07-05 11:15:05
回答 6查看 8.2K关注 0票数 5

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

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

代码语言:javascript
运行
复制
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,“异常”:{}

api.php

代码语言:javascript
运行
复制
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

在所有这些线程中,所使用的方法应该有效,但对我不起作用。我是不是忽略了什么?

我很感激每一个人的帮助!

EN

回答 6

Stack Overflow用户

发布于 2021-08-08 22:54:12

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

我发现这是因为桑克顿认证警卫的工作方式。当一个Laravel会话已经就位时,通过会话cookie,守护程序将一个TransientToken放在用户上,然后通过currentAccessToken()返回。但是,这个TransientToken不是真正的PersonalAccessToken,也没有delete()方法。

这是在这里的源代码中发现的。

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

票数 5
EN

Stack Overflow用户

发布于 2021-12-12 10:51:33

我也面临同样的问题,如果用户是通过会话/cookie登录的,Laravel似乎使用TransientToken作为默认令牌类而不是PersonalAccessToken。而且TransientToken只有can/ And方法,所以它不支持delete()或->id属性。

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

代码语言:javascript
运行
复制
if(method_exists(auth()->user()->currentAccessToken(), 'delete')) {
    auth()->user()->currentAccessToken()->delete();
}

auth()->guard('web')->logout();
票数 3
EN

Stack Overflow用户

发布于 2021-07-05 11:31:24

对于特定用户:

代码语言:javascript
运行
复制
Auth::user()->tokens()->where('id', $id)->delete();

对于想要注销的被请求用户

代码语言:javascript
运行
复制
$user = request()->user();
$user->tokens()->where('id', $user->currentAccessToken()->id)->delete();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68255192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档