Есть ли способ обойти RatpackPac4j#requireAuth, не устанавливая заголовок WWW-Authenticate?

При тестировании аутентификации Pac4j (2.x) в контексте приложения Ratpack (1.5.x) я обнаружил, что при использовании этого обработчика:

all RatpackPac4j.requireAuth(HeaderClient)

...Неавторизованные запросы корректно отклоняются со статусом 401 и RFC-7235 указывает, что следует добавить заголовок WWW-Authenticate, а это не так.

Я поднял вопрос о трекере RatpackPac4j здесь, но он был закрыт как ( Я делаю вывод) «не исправит», так как Pac4j v3 реализует это правильно. И RatpackPac4j еще не был обновлен для работы с Pac4j v3.

Итак: можно ли вставить что-то, что постобработает все ответы, например, условно добавить заголовок на основе ответа?

Кроме того, я использую следующие версии в своей конфигурации gradle:

    compile group: 'io.ratpack', name: 'ratpack-groovy', version: '1.5.4'
    compile group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
//    compile ratpack.dependency('pac4j') // Don't use this, because we need the org.pac4j version
    compile group: 'org.pac4j', name: 'ratpack-pac4j', version: '2.0.0'
    compile group: 'org.pac4j', name: 'pac4j-core', version: '2.2.1'
    compile group: 'org.pac4j', name: 'pac4j-jwt', version: '2.2.1'
    compile group: 'org.pac4j', name: 'pac4j-http', version: '2.2.1'

person wu-lee    schedule 19.06.2018    source источник


Ответы (1)


Спасибо Джону Энгельману на канале Ratpack Slack, вот обходной путь: используйте Response#beforeSend

handlers {
  all {
    response.beforeSend { response ->
      if (response.status.code == 401) {
        response.headers.set('WWW-Authenticate', 'bearer realm="authenticated api"')
      }
    }
  }
}

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

person wu-lee    schedule 19.06.2018