Базовая авторизация на сервере Dart Aqueduct - PullRequest
0 голосов
/ 25 апреля 2019

Я узнаю о том, как работает аутентификация с использованием инфраструктуры Aqueduct.

В моем файле channel.dart у меня есть маршрут:

router
  .route('/protected') 
  .link(() => Authorizer.basic(validator))
  .link(() => ProtectedController()); 

Но я не знаю, как создать validator. В документах я вижу, что я могу сделать собственный Authorizer без использования AuthServer. Пример кода такой:

class BasicValidator implements AuthValidator {
  @override
  FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {}
    var user = await userForName(usernameAndPassword.username);
    if (user.password == hash(usernameAndPassword.password, user.salt)) {
      return Authorization(...);
    }

    return null;
  }
}

Я хотел бы привести базовый рабочий пример, но это самое близкое, что я мог бы получить:

class BasicValidator implements AuthValidator {
  @override
  FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {

    final validUsername = 'bob';
    final validPassword = 'password123';

    // How do I get the parsed username?
    // How do I get the parsed password?

    if (parsedUsername == validUsername && parsedPassword == validPassword) {
      // How do I create an Authorization?
      return Authorization(...);
    }

    return null;
  }

  // What is this?
  @override
  List<APISecurityRequirement> documentRequirementsForAuthorizer(APIDocumentContext context, Authorizer authorizer, {List<AuthScope> scopes}) {
    return null;
  }
}

Может ли кто-нибудь показать мне базовый рабочий пример средства проверки базовой авторизации?

1 Ответ

1 голос
/ 29 апреля 2019

authorizationData является экземпляром AuthBasicCredentials при использовании Authorizer.basic. Объект этого типа имеет поля username и password, полученные в результате анализа заголовка «Авторизация» из запроса.

Объект Authorization - это контейнер для данных, связанных с авторизованным владельцем ресурса (например, их идентификатор пользователя). Он используется последующими контроллерами для управления авторизацией без необходимости повторного поиска авторизованного пользователя; Вы должны заполнить его любой имеющейся у вас авторизационной информацией.

documentRequirementsForAuthorizer используется во время генерации документа OpenAPI. Authorizer, использующий ваш валидатор, закодирует возвращенные требования безопасности в защищаемые операции OpenAPI.

См. Также http://aqueduct.io/docs/auth/authorizer/#using-authorizers-without-authserver.

@override
FutureOr<Authorization> validate<T>(AuthorizationParser<T> parser, T authorizationData, {List<AuthScope> requiredScope}) {

    final validUsername = 'bob';
    final validPassword = 'password123';

    final credentials = authorizationData as AuthBasicCredentials;

    if (credentials.username == validUsername 
    && credentials.password == validPassword) {

      return Authorization(
       null, // no client ID for basic auth 
       await getUserIDFromUsername(validUsername), // This is your problem to solve
       this, // always this
       credentials: credentials // if you want to pass this info along 
       );
    }

    return null;
  }
...