【问题标题】:Retrieve user by Sanctum plainTextToken通过 Sanctum plainTextToken 检索用户
【发布时间】:2020-10-22 10:10:57
【问题描述】:

如何从 Sanctum 令牌中检索“登录”用户。

登录我有以下方法

public function login(Request $request)
{
    if (Auth::attempt($request->toArray())) {

        /* @var User $user */
        $user = $request->user();

        $token = $user->createToken('web-token')->plainTextToken;

        return response()->json([
            'user' => $user,
            'token' => $token,
        ], Response::HTTP_OK);
    }
}

现在我使用自定义方法注销。

public function logout(Request $request)
{
    dd($request->user()); // <- Always returns null
}

我想撤销令牌,但我不知道如何检索当前登录的用户。显然,为了注销,我发送了带有 Bearer 和 plainTextToken 作为值的 Authorization 标头。

【问题讨论】:

  • 你试过Auth::user()吗?
  • @Makdous 是的,返回 null。因为没有通过会话登录的用户。

标签: laravel laravel-sanctum


【解决方案1】:

确保您首先在不记名令牌中添加令牌

为了让用户退出 sanctum 中间件,现在令牌是可选的

$user = auth('sanctum')->user();

比登出

if ($user) {
    $user->currentAccessToken()->delete();
}

注意:这只会删除当前令牌

如果你需要所有令牌使用

foreach ($user->tokens as $token) {
     $token->delete();
}

【讨论】:

    【解决方案2】:

    只需在中间件('auth:sanctum') 分组路由中添加路由 然后从目标函数内部你可以得到这样的用户 auth()->user() 或者如果您只想注销用户,您可以像这样撤销令牌 $request->user()->currentAccessToken()->delete();

    【讨论】:

      【解决方案3】:

      由于您将承载/令牌发送到注销网址,您可以尝试覆盖AuthenticatesUserslogout 函数:

          /**
      * Log the user out of the application.
      *
      * @param  \Illuminate\Http\Request  $request
      * @return \Illuminate\Http\Response
      */
      public function logout(Request $request)
      {
          $this->guard()->logout();
      
          $request->user()->tokens()->delete();
      
          return redirect('/');
      }
      

      【讨论】:

      • 对不起,我没有使用默认的注销 url,而是自定义的。另外,如果我 dd $request->user() 它返回 null 因为没有活动用户。
      猜你喜欢
      • 2021-02-17
      • 2021-08-05
      • 2022-09-29
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 1970-01-01
      • 2022-10-20
      相关资源
      最近更新 更多