首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正在为App Store Connect API生成令牌

正在为App Store Connect API生成令牌
EN

Stack Overflow用户
提问于 2019-01-21 17:53:35
回答 3查看 3.1K关注 0票数 3

我需要为Store Connect API生成JWT令牌。我正在尝试使用jwt ruby gem ruby-jwt。这是我的令牌生成代码,

代码语言:javascript
复制
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

我把这个令牌放在我的请求的头中:

代码语言:javascript
复制
headers = { Authorization: 'Bearer' + @token }

在回复中,我收到了:

代码语言:javascript
复制
        "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"
        }]
}

我认为问题出在token(直接使用签名)。当我尝试使用online tool解码令牌时,我的有效负载和报头被正确解码。状态:签名无效

我做错了什么?你知道该怎么做吗?

EN

回答 3

Stack Overflow用户

发布于 2019-07-25 05:53:01

传入的授权字符串中缺少空格。您的代码在修改为

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

票数 2
EN

Stack Overflow用户

发布于 2019-06-14 11:22:43

我也遇到过类似的身份验证错误,即NOT_AUTHORIZED。我通过以下步骤解决了这个问题:

1.创建Ruby脚本文件,生成有效的Bearer令牌:

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

代码语言:javascript
复制
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令牌,您可以在下一步中使用它。

备注:

为了运行上述脚本,您需要让installed.

  • You'll
  • 从您的开发人员帐户复制颁发者ID。如果您没有,请生成一个。
  • 确保您对经过身份验证的用户使用的是'.p8‘证书,这意味着您下载'.p8’证书的账号应该有权限执行API级别的操作。在我的例子中,我使用了Admin类型的account。最初,我使用的是开发人员类型的用户帐户,当我进行最终的Curl调用以获取令牌时,该帐户一直给我Not_Authorized错误。

2.使用Token:

现在,我们已经看到了如何生成令牌来访问App Store Connect API,我们可以通过传递authorization header来使用它。例如,获取我们可以使用的所有用户的列表

代码语言:javascript
复制
$ curl  https://api.appstoreconnect.apple.com/v1/users --Header "Authorization: Bearer lOOOOOOOOOOOONG_GENERATED_TOKEN"

这将列出App Store Connect的所有用户。请记住,我们必须对每个请求使用此令牌,并且必须每隔20分钟创建一次新令牌。

票数 1
EN

Stack Overflow用户

发布于 2022-01-14 06:48:09

我刚刚在这里创建了python3版本。401 Authentication credentials are missing or invalid可能与getting issuedexpired有关。

检查你的功能get time是苹果推荐的UNIX epoch time

代码语言:javascript
复制
import jwt
import datetime as dt

key_id = '#####' 
alg = 'ES256'
typ = 'JWT'
issue_id = '##########################'
aud = 'appstoreconnect-v1'

# Define issue timestamp.
issued_at_timestamp = int(dt.datetime.now().timestamp())
# Define expiration timestamp. May not exceed 20 minutes from issue timestamp.
expiration_timestamp = issued_at_timestamp + 20*60

# Define JWT headers.
headers = dict()
headers['alg'] = alg
headers['kid'] = key_id
headers['typ'] = typ

# Define JWT payload.
payload = dict()
payload['iss'] = issue_id
payload['iat'] = issued_at_timestamp
payload['exp'] = expiration_timestamp
payload['aud'] = aud

# Path to signed private key.
KEY_FILE = '#########.p8' 

with open(KEY_FILE,'r') as key_file:
     key = ''.join(key_file.readlines())

client_secret = jwt.encode(
payload=payload,  
headers=headers,
algorithm=alg,  
key=key
)

with open('client_secret.txt', 'w') as output: 
     output.write(client_secret)
    
    
# Usage, after run this code by python3
# get token from `client_secret.txt` and replace to [signed token]
# Remember expired time maximum is 20 minutes
#
# curl -v -H 'Authorization: Bearer [signed token]' "https://api.appstoreconnect.apple.com/v1/apps"
#
# More detail https://developer.apple.com/documentation/appstoreconnectapi/generating_tokens_for_api_requests
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54287340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档