Получить пользователя по Sanctum plainTextToken

Как получить "авторизованного" пользователя с токена 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 в качестве значения.


person Ezrab_    schedule 01.07.2020    source источник
comment
Вы пробовали Auth::user()?   -  person Makdous    schedule 02.07.2020
comment
@Makdous Да, это возвращает null. Потому что нет пользователя, вошедшего в систему через сеанс.   -  person Ezrab_    schedule 02.07.2020


Ответы (3)


наверняка вы сначала добавили токен в токен на предъявителя

и чтобы вывести пользователя из промежуточного программного обеспечения Sanctum, теперь токен не является обязательным

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

чем выйти

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

примечание: это удаляет только текущий токен

если вам нужно использовать все токены

foreach ($user->tokens as $token) {
     $token->delete();
}
person mohamed elshazly    schedule 28.01.2021

просто добавьте маршрут в сгруппированные маршруты промежуточного программного обеспечения ('auth: sanctum'), затем из целевой функции вы можете получить пользователя, подобного этому auth () - ›user (), или, если вы просто хотите выйти из системы, вы можете отозвать токен, например это $ request- ›user () -› currentAccessToken () - ›delete ();

person Muhammad Almoayad    schedule 01.10.2020

Поскольку вы отправляете носитель / токен на URL-адрес выхода, вы можете попытаться переопределить logout функцию AuthenticatesUsers:

    /**
* 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('/');
}
person Makdous    schedule 01.07.2020
comment
Извините за пояснение, я использую не URL-адрес выхода по умолчанию, а пользовательский. Также, если я dd $ request- ›user (), он вернет null, поскольку активного пользователя нет. - person Ezrab_; 02.07.2020