【问题标题】:How can I logout and revoke all oauth tokens in laravel 8 api?如何注销并撤销 laravel 8 api 中的所有 oauth 令牌?
【发布时间】: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 表中的条目。

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

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

【问题讨论】:

    标签: laravel api token logout


    【解决方案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 从令牌中提取用户吗?
        猜你喜欢
        • 1970-01-01
        • 2017-06-20
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 2018-09-21
        • 2021-02-09
        • 1970-01-01
        • 2015-04-16
        相关资源
        最近更新 更多