如何注销并撤销 laravel 8 api 中的所有 oauth 令牌?

Posted

技术标签:

【中文标题】如何注销并撤销 laravel 8 api 中的所有 oauth 令牌?【英文标题】:How can I logout and revoke all oauth tokens in laravel 8 api? 【发布时间】:2021-12-03 19:42:10 【问题描述】:

我用passport和laravel 8搭建的api默认不注销。

我找到了一个脚本,但它没有删除 oauth-access-tokens 表中的条目

我在 AuthController 中添加了一个函数:

 
    public function logout(Request $request)
        $accessToken = auth()->user()->token();
        $token= $request->user()->tokens->find($accessToken);
        $token->revoke();
        return response(['message'=> 'Je bent uitgelogd'], 200);
    

并在api.php中添加了路径:

Route::post( 'logout', 'App\Http\Controllers\API\AuthController@logout')->middleware('auth:api'); 

当我尝试使用 Postman 注销时,我收到一条成功消息,但未删除 oauth-access-token 表中的条目。

我打算为用户删除所有令牌,以便从所有设备中注销

谁能告诉我我做错了什么?

【问题讨论】:

【参考方案1】:

如果您使用的是护照, Auth::user()->AauthAcessToken()->delete(); 将删除用户的所有令牌。

【讨论】:

【参考方案2】:

已解决:

我使用了以下代码:


use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\User;
use Illuminate\Support\Facades\Auth;

和功能:

public function logout(Request $request)
    Auth::user()->tokens->each(function($token, $key) 
        $token->delete();
    );
    return response(['message'=> 'Je bent uitgelogd'], 200);
   
 

所以没有任何东西被撤销,但是所有的令牌都被删除了..

【讨论】:

【参考方案3】:

将注销功能改成如下:

public function logout(Request $request)
    $user = Auth::user()->token();
    $user->revoke();
    return response(['message'=> 'Je bent uitgelogd'], 200);

这将使用户从他请求注销的当前设备中注销。如果你想从他登录的所有设备上注销。然后这样做:

use Laravel\Passport\RefreshToken;
use Laravel\Passport\Token;

public function logout(Request $request)
    $tokens =  $user->tokens->pluck('id');
    Token::whereIn('id', $tokens)->update(['revoked', true]);

    RefreshToken::whereIn('access_token_id', $tokens)->update(['revoked' => true]);


这将撤销颁发给该用户的所有访问和刷新令牌。

【讨论】:

谢谢,试过了。不幸的是不起作用。我在 VS CODE 中有一个警告:“未定义的方法 'token'.intelephense(1013)”。我认为这是由于 vs 代码中的设置。第一个解决方案显示成功响应,但 oauth-access-tokens 中的条目仍然存在。我不能两次发帖,因为我是未经授权的。所以它让我退出,但不会从表中删除条目..我猜。第二个函数返回:“消息”:“在 null 上调用成员函数 pluck()”,作为响应。 现在我看到 $request 从未在您描述的函数中使用过...不应该 AUTH 从令牌中提取用户吗?

以上是关于如何注销并撤销 laravel 8 api 中的所有 oauth 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中进行前端 api 身份验证

Sanctum Laravel 8 用于 API 身份验证的问题(不会在注销时删除令牌)

Laravel API 验证/保护后续请求:没有登录/注销和没有“用户”表

Laravel 8 中的 API

Laravel 几秒钟后自动注销?

如何从 Laravel 8 中的自定义 Web 路由中删除“api/”前缀?