Проблемы со входом в Coinbase API с помощью oauth2

Я пишу веб-приложение 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 перенаправления, поскольку я работаю с локального хоста.

Как мне здесь двигаться вперед?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы неправильно поняли документацию. Во-первых, вам необходимо перенаправить пользователя на сайт 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 содержит токен доступа, который вы можете использовать для дальнейших запросов.

Хорошо, у меня есть кнопка входа в систему, и в настоящее время она вызывает функцию JS, которая вызывает метод контроллера Spring. Похоже, вы говорите, что кнопка входа в систему должна вести прямо на этот URL-адрес. Я правильно понимаю?

Gary Kephart 29.05.2024 22:14

Да, он должен напрямую попасть в Coinbase.

siom 29.05.2024 22:20

Не уверен насчет этого утверждения: сеанс должен быть открыт на клиенте OAuth2 (бэкэнд Spring, настроенный с помощью oauth2Login). Таким образом, первый запрос должен быть обращен к бэкэнду Spring, который открывает сеанс, если он не существует для пользовательского агента, а затем перенаправляет на Coinbase, который перенаправляет обратно на бэкэнд Spring с кодом (обмененным на токены бэкэндом Spring), который последний раз перенаправляет на внешний интерфейс. .

ch4mp 13.06.2024 21:48

При использовании клиента 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, чтобы убедиться, что сеанс инициирован. Токены и параметры безопасности, используемые во время потока кода авторизации, сохраняются в сеансе.

Напоминаем, что последовательность кода авторизации следующая:

  1. Spring создает URI авторизации, а затем перенаправляет пользовательский агент на конечную точку авторизации сервера авторизации (https://login.coinbase.com/oauth2/auth в случае Coinbase) со всеми необходимыми параметрами (учетные данные клиента, URI перенаправления, состояние и область действия).
  2. сервер авторизации запускает поток «входа» (отображает формы, проверяет наличие файла cookie «запомнить меня» или что-то еще)
  3. после успешной аутентификации сервер авторизации перенаправляет пользовательский агент клиенту OAuth2 с кодом авторизации (https://{my-domain}/login/oauth2/code/my-bff в случае с приведенной выше конфигурацией)
  4. клиент вызывает конечную точку токена сервера авторизации для обмена кода на токены (https://login.coinbase.com/oauth2/token в случае Coinbase)

Но чтобы выполнить шаг 1 (перенаправление Spring на Coinbase с правильными параметрами запроса), вы должны сначала указать пользовательскому агенту Spring...

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