Как получить данные из токена доступа Spotify и как проверить токен доступа

#authentication #oauth-2.0 #oauth #jwt #spotify

#аутентификация #oauth-2.0 #oauth #jwt #spotify

Вопрос:

В API Spotify есть опция авторизации пользователей, которую я сейчас использую. По завершении авторизации вы получите токен аутентификации, который можно обменять на токен доступа и токен обновления. В моем случае токен доступа будет отправлен на серверную часть, которая запрашивает данные пользователя с помощью /me вызова, после чего пользователь будет создан или авторизован на основе данных Spotify. Идентификатор Spotify (в ответе) будет использоваться для создания пользователя в моем бэкэнде, поэтому в основном ваш идентификатор Spotify привязан к учетной записи в бэкэнде.

Проблема, с которой я сейчас сталкиваюсь, заключается в следующем: чтобы получить идентификатор пользователя Spotify, серверная часть должна выполнить /me вызов. Это не идеально, потому что Spotify имеет ограничения скорости, которые могут быть легко запущены таким образом. Обычно при аутентификации с использованием OAuth вы получаете токен JWT, который содержит данные, возможно, идентификатор. Вы также можете проверить, был ли подделан токен JWT, используя ваш открытый / закрытый ключ. В случае Spotify мы получаем не токен JWT, а скорее общий токен. Кажется, я не могу понять, как получить какую-либо информацию из токена, я просто не знаю. Я пробовал декодировать его в Base64, а затем AES (и DES, и TripleDES, и Rabbit, и RC4) расшифровывают его с помощью открытого / закрытого ключа, но никаких полезных данных не извлекается. Я не могу найти никакой информации о том, как извлечь из него какие-либо данные, похоже, никто еще не пробовал..

Auth0 имеет интеграцию с Spotify, где они также (насколько я мог видеть) используют /me вызов в серверной части. Я полагаю, что они используют прокси или что-то подобное, чтобы обойти ограничение скорости, но на данный момент это неприменимо. Проблема, которую я предвижу, заключается в том, что любой токен Spotify из Интернета потенциально может войти в мой серверный сервер, потому что я не могу проверить, что токен был создан с использованием моего идентификатора клиента…

В надежде, что какой-нибудь незнакомец в StackOverflow знает ответ или знает, как помочь, я перечислил все открытые / закрытые ключи и ответы, которые я получил (примечание: это тестовые ключи, а не ключи моего приложения 😉):

 Client ID: 6577d59d8dd643d5b2e53b25b0d5211e
Client Secret: c04640db6312400c9611229a81e65c6b
Authorization code: AQAGm98h91D9AsvavJXAL_V5DK-r6BtybDPbg7B31vZocO7TjOXqLQwhVSOmrHViXkippOPFjtrNjEjCQG6D0n1ImYbFXaTUNYGK4uIaeqqUdGne-KTZBE3MmBUP0iagpCY5HVjtTnty2FnL_JjD1a6omPAvSqTds1iexV6a
Access Token: BQAdbMy4Dhj0VCfnFS_VcEgjmMHBb9Sekjcal5F8T9HaXb7zIJjtsIRgjuzp4x3SGvAXgBw1NWdURSGGGHP5wPSU0Baqc9Zz4b5AvPGOX6aZy6w5c15GktTT_bvB-3wA3rfOqjYsrAGuzHuqxz0simNcYiQNiIyuhw
Refresh Token: AQApR35msEEcgq0pH7TWPXefcA8bHvc2rApA-mxRAuPo3QJVu5ksZMJMmh4jXy6USj2napzrZ9bJijVbkpZpgzPE8js-i-e9f7vVO0INnp-Q3P_gt3MIQ-4AbQ8eDBXORmw
 

TL; DR:

Как получить данные из токена доступа Spotify, возможно, используя идентификатор клиента / секрет клиента?

Поскольку я не могу придумать (вот в чем вопрос) какой-либо способ проверки токена, любой токен Spotify может быть использован для создания учетной записи в моем бэкэнде, а не только токен, созданный с моим идентификатором клиента.

Ответ №1:

Это распространенная проблема, если вы пытаетесь использовать внешние токены доступа в своих собственных API. Этот тип токена доступа предназначен только для API Spotify, а не для использования ваших собственных API.

Формат токена доступа, вероятно, является ссылочным токеном, и утверждения, которые он использует, могут быть получены только с помощью самоанализа OAuth, что является операцией, на выполнение которой, я сомневаюсь, у вас будут права.

ПРАВИЛЬНЫЙ ПОДХОД

  • Вы предоставляете сервер авторизации (AS), например Auth0
  • Пользователи могут входить в систему несколькими способами, одним из которых является Spotify
  • Для входа пользователя в систему ваше приложение сначала перенаправляется на ваш AS, который затем перенаправляется на Spotify, где пользователь проходит аутентификацию
  • Spotify выдает токены вашему AS, который затем выдает свои собственные токены вашему пользовательскому интерфейсу
  • Ваш пользовательский интерфейс отправляет токены в ваш API, и API полностью контролирует работу с токеном и любыми идентификаторами / утверждениями / областями внутри него

Это может показаться сложным, но все детали безопасности передаются извне из ваших пользовательских интерфейсов и API, поэтому это приводит к простому коду. В моем сообщении в блоге есть более подробная информация о шаблоне.

Комментарии:

1. Да, я тоже об этом думал, у них, вероятно, есть свой собственный формат, который посторонним не разрешен для чтения. В моем случае использования все развивается вокруг учетной записи Spotify, поэтому я не хотел бы иметь другой способ входа в систему. В упомянутых вами шагах любой токен (не созданный моим идентификатором клиента) может отправлять действительный токен пользователя из «пользовательского интерфейса» на сервер, что вызывает сожаление. Я понимаю, я просто хотел бы, чтобы был другой способ, например, проверка токена или конечной точки Spotify для его проверки..

2. Стандартный способ выдачи токенов доступа заключается в том, что клиенту предоставляется аудитория для токенов доступа, например ‘api.mycompany.com ‘, и вы также управляете ключом подписи токена. Это означает, что у любого вредоносного клиента не будет нужных токенов, поэтому он получит 401 при вызове вашего API. Конечно, эти гарантии отсутствуют, если вы используете токены доступа Spotify для вызова собственных API.

3. Да, действительно, я привык иметь токен JWT с аудиторией или любой вариант проверки того, что токен был создан с помощью закрытого ключа (и может быть проверен с помощью открытого ключа). Они действительно отсутствуют, я надеюсь, что кто-то знает более конкретную информацию о токене Spotify (возможно, у него есть структура), я не хочу менять метод входа.