Как аутентифицировать вызовы клиента 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), но вам нужен доступ к коду вашего сервиса отдыха.