Генерация токена для API App Store Connect - PullRequest
0 голосов
/ 21 января 2019

Мне нужно сгенерировать токен JWT для Store Connect API .Я пытаюсь использовать jwt ruby ​​gem ruby-jwt .Это мой код генерации токена,

payload = {
      'iss': my_issuer_id_from_db,
      'exp': generated_unix_timestamp, #Time.now + 20min
      'aud': 'hard_coded_string_from_doc'
  }
  header = {
      'alg': 'ES256',
      'kid': my_key_id_from_db,
      'typ': 'JWT'
  }

private_key = OpenSSL::PKey.read(File.read('/tmp/private_key.pem'))
# private_key - <OpenSSL::PKey::EC:0x000000000XXXXXXX>

@token = JWT.encode(payload, private_key, 'ES256', header)
# encoded_header.encoded_payload.emcoded_signature

Этот токен, который я вставил в заголовок моего запроса:

headers = { Authorization: 'Bearer' + @token }

в ответ я получаю:

        "errors": [{
                "status": "401",
                "code": "NOT_AUTHORIZED",
                "title": "Authentication credentials are missing or invalid.",
                "detail": "Provide a properly configured and signed bearer token, and make sure that it has not expired. Learn more about Generating Tokens for API Requests https://developer.apple.com/go/?id=api-generating-tokens"
        }]
}

У меня проблема с токеном (напрямую с подписью).Когда я пытаюсь декодировать токен с помощью онлайн-инструмента , моя полезная нагрузка и заголовок декодируются правильно.Статус: неверная подпись

Что я делаю не так?Есть идеи как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 25 июля 2019

В вашей строке авторизации пропущен пробел. Ваш код работал нормально при изменении на

headers = { Authorization: 'Bearer ' + @token }

0 голосов
/ 14 июня 2019

Я столкнулся с подобным типом ошибки аутентификации, т.е. NOT_AUTHORIZED .И я решил это, выполнив следующие действия:

1.Создайте файл сценария Ruby для создания действительного Bearer токена:

Ref: https://medium.com/xcblog/generating-jwt-tokens-for-app-store-connect-api-2b2693812a35

require "base64"
require "jwt"
ISSUER_ID = "YOUR_ISSUER_ID"
KEY_ID = "YOUR PRIVATE KEY ID"    // this is ID part from downloaded .p8 file name (see below for ref.)
private_key = OpenSSL::PKey.read(File.read(path_to_your_private_key/AuthKey_#{KEY_ID}.p8))   // you can enclose your file path in quotes if needed, and can pass here totally static file path (here we are reusing Key_ID variable)

token = JWT.encode(
   {
    iss: ISSUER_ID,
    exp: Time.now.to_i + 20 * 60,
    aud: "appstoreconnect-v1"
   },
   private_key,
   "ES256",
   header_fields={
       kid: KEY_ID }
)
puts token

Затем запустите этот сценарий с помощью следующей команды на своем Mac.

$ ruby jwt.rb

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

Примечания:

  • Для запуска вышеуказанного сценария вам необходимо установить ruby.
  • Вы скопируете ID эмитента из вашей учетной записи разработчика.Создайте его, если у вас его нет.
  • Убедитесь, что вы используете сертификат «.p8» для аутентифицированного пользователя, что означает, что учетная запись, для которой вы скачали сертификат «.p8», должна иметь разрешение на выполнение уровня API.операция.Для моего случая я использовал учетную запись типа Admin .Первоначально я использовал учетную запись пользователя типа Developer , которая постоянно выдавала мне ошибку Not_Authorized , когда я обращаюсь к последнему вызову Curl для получения токена.

2.Использование токена:

Теперь, когда мы увидели, как генерировать токен для доступа к API App Store Connect, мы можем использовать его, передав заголовок авторизации.например, чтобы получить список всех пользователей, которых мы можем использовать

$ curl  https://api.appstoreconnect.apple.com/v1/users --Header "Authorization: Bearer lOOOOOOOOOOOONG_GENERATED_TOKEN"

В этом списке будут перечислены все пользователи App Store Connect.Помните, что мы должны использовать этот токен при каждом запросе, который мы делаем, и мы должны создавать новый токен через каждые 20 минут.

...