Поставщик пользовательской аутентификации возвращает 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
, даже если поставщик аутентификации возвращает пользователя-администратора.
1 answers
Маршруты должны указывать поставщиков аутентификации, которых они хотят поддерживать.
По умолчанию это сеанс, поэтому аутентификация с помощью чего-либо другого не допускается.
Вы делаете это, указывая _auth: ['your_authentication_provider']
в параметрах: ключ вашего маршрута.