Поставщик пользовательской аутентификации возвращает 403 для доступа: "ИСТИНА"


Модуль Jenny реализует API и должен проходить аутентификацию на основе этого заголовка...

Authorization: Jenny 8675309

Вот мой маршрут API...

jenny.api.get:
  path: '/api/jenny'
  defaults:
    _controller: '\Drupal\jenny\Controller\ApiController::get'
  methods: [GET]
  requirements:
    _access: 'TRUE'

API возвращает данные для любого типа пользователей, но для некоторых ролей включены дополнительные данные.

Вот моя реализация для AuthenticationProviderInterface...

public function applies(Request $request) {
  if ($header = $request->headers->get('Authorization')) {
    if(strpos($header, 'Jenny ') !== FALSE) {
      \Drupal::logger('jenny')->info('this applies');
      return TRUE;
    }
  }
  return FALSE;
}

public function authenticate(Request $request) {
  \Drupal::logger('jenny')->info('authenticate');
  return $this->entityTypeManager->getStorage('user')->load(1);
}

Этот пример кода аутентифицирует пользователя-администратора всякий раз, когда есть заголовок Authorization: Jenny. Очевидно, что реальный код реализует логику для аутентификации надлежащего пользователь.

Вот что отображается в журнале...

uid  type            message
0    jenny           this applies
0    jenny           this applies
0    jenny           authenticate
1    jenny           this applies
1    jenny           this applies
1    jenny           this applies
1    accesss denied  /api/jenny

Он показывает изменение идентификатора uid, поэтому он предполагает, что мой поставщик аутентификации выполняет его часть, но по какой-то причине он все еще возвращает 403 отказа в доступе, даже если маршрут _access: 'TRUE'. Запрос на /api/jenny без заголовка Authorization: Jenny возвращает ожидаемые данные.

Для меня это не имеет смысла. Может кто-нибудь, пожалуйста, указать, что я делаю неправильно или почему это не работает? Спасибо.

При дальнейшем рассмотрении этот происходит на всех маршрутах, если есть заголовок Authorization: Jenny, даже если поставщик аутентификации возвращает пользователя-администратора.

 3
Author: konadave, 2017-08-25

1 answers

Маршруты должны указывать поставщиков аутентификации, которых они хотят поддерживать.

По умолчанию это сеанс, поэтому аутентификация с помощью чего-либо другого не допускается.

Вы делаете это, указывая _auth: ['your_authentication_provider'] в параметрах: ключ вашего маршрута.

 6
Author: Berdir, 2017-08-25 18:33:12