Как аутентифицировать вызовы клиента REST MicroProfile с помощью OAuth?

В моем серверном приложении я хочу использовать сторонний API с помощью клиента MicroProfile REST. Для этого мне нужно отправитьAuthorization Заголовок с токеном на предъявителя.

Я не хочу всегда получать токен перед тем, как совершить какой-либо вызов, поэтому мне нужен механизм для извлечения нового токена только в том случае, если токена еще нет или срок действия токена истек. Затем токен может быть сохранен и использован в каждом вызове до истечения срока его действия. Следующий вызов API, который вызовет HTTP 401 Unauthorized, должен привести к получению нового токена.

К сожалению, пока мне не удалось найти какие-либо ресурсы о том, как использовать API-интерфейсы, защищенные OAuth, с помощью клиента MicroProfile REST. Я надеюсь, что кто-нибудь может дать мне какие-нибудь советы. Я использую Kotlin и Quarkus, но документация по Java тоже подойдет. Все помогает.

Вот мой довольно простой клиент:

@RegisterRestClient
@Produces(MediaType.APPLICATION_JSON)
interface SomeThirdPartyApiClient {
    @POST
    @Path("/some/random/url")
    fun someRandomUrl(body: SomeJsonRequestObject, @HeaderParam("Authorization") bearer: String): SomeJsonResponseObject
}

1 ответ

Как обсуждалось с iabughosh, автоматического способа делать то, что я хочу, не существует. Вместо этого я сам написал код, как предложил iabughosh. Я пошел путем отлова ошибок в звонке. Если ошибка имеет статус 401, я получаю новый токен и повторяю вызов.

Когда приложение запускается и еще не имеет токена, первый вызов всегда вызывает ошибку 401, а затем я получаю первый токен. Следующий 401 появляется только тогда, когда срок действия токена истекает (или он был удален администратором сервера преждевременно), поэтому я просто получаю токен и снова выполняю вызов.

На данный момент все работает нормально. Мне нужно посмотреть, как это будет выглядеть в продакшене при большом количестве (параллельных) вызовов. Если я найду лучшее решение, я постараюсь запомнить этот вопрос и соответствующим образом обновить его.

Нет никакого способа передать его на уровне аннотации, через конфигурацию микропрофиля eclipse, единственный способ передать динамический токен - добавить

@HeadParameter("Authorization") authStringв вашем вызове отдыха, если вы используете jwt, обычно вы можете ввести JsonWebToken и выполнить все проверки с этим объектом, поэтому вам не понадобится этот параметр, однако вы можете добавить его и просто игнорировать, чем в вашем отдыхе объявление метода клиента, вы также должны добавить его (как я видел ваш случай, вы уже это сделали, просто убедитесь, что порядок параметров такой же), и restclient сможет передать токен через заголовок (вам нужно передать "Bearer "+tokenString), но вам нужен доступ к коду вашего сервиса отдыха.

Другие вопросы по тегам