Я пишу веб-приложение Java Spring, которое интегрируется с API Coinbase. У меня возникли проблемы со входом в систему с помощью OAuth2. Документы кажутся неполными, поэтому я столкнулся с некоторыми проблемами. В качестве руководства я использовал https://docs.cdp.coinbase.com/sign-in-with-coinbase/docs/sign-in-with-coinbase-integration. Первый шаг — запросить доступ, вызвав «/oauth2/token». Моя первая проблема заключалась в том, что я получил ошибку 403 Forbidden, но в конце концов я ее преодолел, добавив заголовки «User-Agent» и «CB-VERSION» (нет в документации).
Теперь я получаю обратно HTML-страницу, которую, как мне кажется, я должен отображать пользователю, но мне пришлось добавить «базовый» элемент, чтобы ссылки в ней работали. Это позволяет пользователю войти в Coinbase, и я думал, что это приведет к вызову моего обратного вызова, но этого не произошло.
Кстати, мне приходится использовать «urn:ietf:wg:oauth:2.0:oob» в качестве URI перенаправления, поскольку я работаю с локального хоста.
Как мне здесь двигаться вперед?




Вы неправильно поняли документацию. Во-первых, вам необходимо перенаправить пользователя на сайт coinbase (замените значения параметров значениями для вашего зарегистрированного приложения):
GET https://login.coinbase.com/oauth2/auth?response_type=code&client_id=1532c63424622b6e9c4654e7f97ed40194a1547e114ca1c682f44283f39dfa49&redirect_uri=https%3A%2F%2Fexample.com%2Foauth%2Fcallback&state=134ef5504a94&scope=wallet:user:read,wallet:accounts:read
Затем coinbase перенаправит на значение, которое вы указали с помощью параметра redirect_uri (здесь: https://example.com/oauth/callback). В этом перенаправлении вы получаете код:
GET https://example.com/oauth/callback?code=4c666b5c0c0d9d3140f2e0776cbe245f3143011d82b7a2c2a590cc7e20b79ae8&state=134ef5504a94
Затем вы используете этот код для входа:
curl https://login.coinbase.com/oauth2/token \
-X POST \
-d 'grant_type=authorization_code&code=4c666b5c0c0d9d3140f2e0776cbe245f3143011d82b7a2c2a590cc7e20b79ae8&client_id=1532c63424622b6e9c4654e7f97ed40194a1547e114ca1c682f44283f39dfa49&client_secret=3a21f08c585df35c14c0c43b832640b29a3a3a18e5c54d5401f08c87c8be0b20&redirect_uri=https://example.com/oauth/callback'
Ответ от coinbase содержит токен доступа, который вы можете использовать для дальнейших запросов.
Да, он должен напрямую попасть в Coinbase.
Не уверен насчет этого утверждения: сеанс должен быть открыт на клиенте OAuth2 (бэкэнд Spring, настроенный с помощью oauth2Login). Таким образом, первый запрос должен быть обращен к бэкэнду Spring, который открывает сеанс, если он не существует для пользовательского агента, а затем перенаправляет на Coinbase, который перенаправляет обратно на бэкэнд Spring с кодом (обмененным на токены бэкэндом Spring), который последний раз перенаправляет на внешний интерфейс. .
При использовании клиента Spring OAuth2 с oauth2Login первый запрос должен быть https://{your-spring-backend}/oauth2/authorization/{registration-id}, где {registration-id} — это ключ для потока registration с authorization_code. Например, со следующими свойствами загрузки:
spring:
security:
oauth2:
client:
provider:
coinbase:
authorization-uri: https://login.coinbase.com/oauth2/auth
token-uri: https://login.coinbase.com/oauth2/token
user-info-uri: https://api.coinbase.com/v2/user
registration:
my-bff:
provider: coinbase
client-id: ${oauth2-client-id}
client-secret: ${oauth2-client-secret}
authorization-grant-type: authorization_code
scope: wallet:user:read, wallet:accounts:read
Я бы инициировал вход пользователей на https://{my-domain}/oauth2/authorization/my-bff
Важно начать с запроса к бэкэнду Spring, чтобы убедиться, что сеанс инициирован. Токены и параметры безопасности, используемые во время потока кода авторизации, сохраняются в сеансе.
Напоминаем, что последовательность кода авторизации следующая:
https://login.coinbase.com/oauth2/auth в случае Coinbase) со всеми необходимыми параметрами (учетные данные клиента, URI перенаправления, состояние и область действия).https://{my-domain}/login/oauth2/code/my-bff в случае с приведенной выше конфигурацией)https://login.coinbase.com/oauth2/token в случае Coinbase)Но чтобы выполнить шаг 1 (перенаправление Spring на Coinbase с правильными параметрами запроса), вы должны сначала указать пользовательскому агенту Spring...
Хорошо, у меня есть кнопка входа в систему, и в настоящее время она вызывает функцию JS, которая вызывает метод контроллера Spring. Похоже, вы говорите, что кнопка входа в систему должна вести прямо на этот URL-адрес. Я правильно понимаю?