Как аутентифицировать вызовы клиента 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
}

person xxtesaxx    schedule 31.03.2020    source источник
comment
То, что вы делаете, подходит мне. Но я советую сделать какой-нибудь общий код, который выполняет логику проверки / обновления токена и использовать его. Я знаю, что у Spring есть что-то вроде OAuthRestClient, но на самом деле это не так уж и важно, и я считаю, что это легко реализовать.   -  person iabughosh    schedule 02.04.2020
comment
Есть предложения, с чего начать? Я думал о том, чтобы позвонить и поместить его в ловушку. В уловке я проверял статус 401 и рекурсивно вызывал функцию снова после попытки получить новый токен.   -  person xxtesaxx    schedule 03.04.2020
comment
Вы можете использовать это или можете хранить токены в базе данных в памяти. Всякий раз, когда вы получаете уже существующий токен, вы можете проверить, истекает ли срок действия токена ›текущее время, затем вы можете нажать« Обновить »и сохранить обновленный токен.   -  person iabughosh    schedule 03.04.2020
comment
Хм, интересно: в 99,9999 ...% случаев это может работать хорошо, но если вызов будет сделан за несколько миллисекунд до истечения срока действия токена, он может выйти из строя, не так ли? Но если я вычту время ожидания из времени истечения срока, я думаю, все должно сработать. Спасибо за идею.   -  person xxtesaxx    schedule 05.04.2020
comment
Тогда в этом случае вы можете сделать комбинацию по моему и вашему предложению, чтобы получить лучшее :)   -  person iabughosh    schedule 05.04.2020


Ответы (2)


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

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

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

person xxtesaxx    schedule 05.04.2020
comment
Нашли еще лучшее решение? - person Michel; 01.07.2020

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

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

person Nather Webber    schedule 04.10.2020