iOS 앱을 출시했고 App Store Connect API에서 일부 정보 (예 : 설치, 업데이트, 리뷰)를 가져오고 싶습니다.
공식 Apple 문서에 설명 된대로 JSON 웹 토큰을 생성합니다. 링크
그 후 헤더의 토큰으로 요청을합니다. 이제 나는 '401'| 'NOT_AUTHORIZED'매번 답변으로 다음 그림을 참조하십시오. REST 응답
다음 스 니펫에서 내 파이썬 코드를 볼 수 있습니다 (Python과 R에서 해결하려고했지만 결과는 항상 동일합니다).
먼저 JWT를 만듭니다.
from datetime import datetime, timedelta from jose import jwt, jws import ecdsa KEY_ID = "XXXXXXXXXX" ISSUER_ID = "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" PRIVATE_KEY = open ( 'AuthKey_XXXXXXXXXX.p8', 'r'). read () TIMESTAMP = int ((datetime.now ()-timedelta (분 = 45)). timestamp () * 1000) 클레임 = { "iss": ISSUER_ID, "exp": TIMESTAMP, "aud": "appstoreconnect-v1"} header = { "alg": "ES256", "kid": KEY_ID, "typ": "JWT" } # 인코딩 된 JWT 생성 = jwt.encode (claim, PRIVATE_KEY, algorithm = 'ES256', headers = header)
이제 encode를 인쇄 하면 다음 JWT에 도달합니다 (나에게 유효 해 보입니다).
'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlhYWFhYWFhYWFgifQ.eyJpc3MiOiJYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFgiLCJleHAiOjE1NDUzOTc1MTQ1ODAsImF1ZCI6ImFwcHN0b3JlY29ubmVjdC12MSJ9.eTl6iaAW-Gp67FNmITrWCpLTtJzVdLYXIl5_KKgqaNgzwyGo7npBOBo9_u5PtLNnssQFEwJWbPND-6Ww5ACgEg'
Base64를 통해 JWT의 처음 두 부분을 디코딩하더라도 올바른 헤더 (인코딩을위한 올바른 알고리즘 포함 : 'alg': 'ES256') 및 Claim :
jose.utils에서 수입 base64url_decode의 인쇄 (base64url_decode (b'eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6IlhYWFhYWFhYWFgifQ ')) 인쇄 (base64url_decode (b'eyJpc3MiOiJYWFhYWFhYWC1YWFhYLVhYWFgtWFhYWC1YWFhYWFhYWFhYWFgiLCJleHAiOjE1NDUzOTc1MTQ1ODAsImF1ZCI6ImFwcHN0b3JlY29ubmVjdC12MSJ9'))
다음 그림을 참조하십시오. 출력 Base64 디코딩
이제 JWT-Object가 준비되었다고 생각하므로 API에 요청을 보냅니다.
가져 오기 요청 JWT = 'Bearer'+ 인코딩 된 URL = 'https://api.appstoreconnect.apple.com/v1/apps'HEAD = { 'Authorization': JWT} print (HEAD) R = requests.get (URL, headers = HEAD) R.json ()
이제 내 문제를 볼 수 있습니다. 그림을 참조하십시오. Header | REST 응답
내가 숨겨진 것을주십시오 참고 KEY_ID , ISSUER_ID 및 PRIVATE_KEY을 예제를 위해.
토큰에 만료 시간이 있습니다.
"exp": 1545397514580,
50941 년 9 월 12 일과 같습니다.
마지막 세 자리를 삭제하면
"exp": 1545397514,
2018 년 12 월 21 일에 훨씬 더 의미가 있습니다.
그 라인 변경
TIMESTAMP = int( (datetime.now() - timedelta(minutes = 45)).timestamp() * 1000)
...에
TIMESTAMP = int( (datetime.now() - timedelta(minutes = 45)).timestamp())
특급 또한 1970년 1월 1일 0시 참조하기 때문에 초로 정의 된 시간 소인입니다 여기
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다