Если вы хотите отозвать все токены с данным токеном, возьмите идентификатор пользователя из токена авторизации и выполните запрос на удаление токенов этого пользователя:
class TokenManagerController extends ResourceController {
@Operation.delete()
Future<Response> deleteTokens() async {
final userId = request.authorization.ownerID;
final query = Query<ManagedAuthToken>(context)
..where((token) => token.resourceOwner).identifiedBy(userId);
final count = await query.delete();
return Response.ok({"userId": userId, "tokensDeleted": count});
}
}
И убедитесь, что вы связали авторизатор:
router.route("/tokens")
.link(() => Authorizer.bearer(authServer))
.link(() => TokenManagerController(context));
FWIW, я рекомендую иметь область действия специально для этого действия, которая предоставляется только для этого сценария через дополнительный вход в систему.UX заключается в том, что пользователь должен снова ввести свой пароль.
Если вы просто хотите удалить один токен, просто запустите запрос на удаление, где access_token
= токен в заголовке авторизации.
class LogoutController extends ResourceController {
@Operation.delete()
Future<Response> deleteTokens(@Bind.header('authorization') String authHeader) async {
final parser = AuthorizationBearerParser();
final userToken = parser.parse(authHeader);
final query = Query<ManagedAuthToken>(context)
..where((token) => token.accessToken).equalTo(userToken);
final count = await query.delete();
final userId = request.authorization.ownerID;
return Response.ok({"userId": userId, "tokensDeleted": count});
}
}