Как выйти (то есть отозвать, удалить или аннулировать токены) для пользователя на сервере Aqueduct? - PullRequest
1 голос
/ 22 мая 2019

Я знаю, как реализовать маршрут для регистрации пользователя, а также как обменять учетные данные пользователя на токен доступа. Обе они описаны в официальном руководстве .

Как сделать недействительным токен доступа (и токен обновления) для зарегистрированного пользователя. Это необходимо как для выхода из системы, так и для ограничения ущерба, если учетная запись пользователя взломана.

Я вижу, что есть метод

authServer.revokeAllGrantsForResourceOwner(identifier)

но я все еще работаю над тем, как получить идентификатор от пользователя, поскольку клиентское приложение знает имя пользователя, но не идентификатор пользователя в базе данных сервера. Было бы неплохо просто передать текущий токен и заставить сервер отменить все токены для этого пользователя.

1 Ответ

1 голос
/ 22 мая 2019

Если вы хотите отозвать все токены с данным токеном, возьмите идентификатор пользователя из токена авторизации и выполните запрос на удаление токенов этого пользователя:

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});
  }
}
...