Apple API 호출하기

정명진·2022년 7월 11일
1
post-thumbnail

Apple App store Connect API 사용하기

Apple App store Connect API를 사용하려면 private key를 발급 받아야 한다.
이는 1번 다운로드가 가능하여 잘 보관해야함..
이 키를 이용해 JWT를 생성해 API 호출마다 같이 보내줘야한다. 그래야
올바른 사용자로 인식하여 정상적 호출이 가능하다.
키 발급 방법은 app store connect 사이트 접속후
user > key > generate key 해서 키 생성하면 됨.

이제 JWT Header를 만들어 보자.
Header Field는 총 3개로 나뉜다.

  • Encryption Algorithm : 무슨 알고리즘 쓸건지. apple에서 무조건 ES256으로 사용하라함.
  • Key ID : 키 발급 받으면 개인키 ID 확인 가능.
  • Token Type : type JWT 로 세팅

이제 토큰에 실어보낼 payload 정보를 만들어야한다.
payload는 다음과 같은 필드로 구성된다.

  • Issuer ID : 이것도 key 발급 받은 페이지에서 확인 가능. issuer id라고 나타남. xxxxxxxx-xxx-xxx-xxxx이런 형식
  • Issued at Time : token 생성 시간. now 로 해주면 됨.
  • Expiration Time : apple에서 토큰 유효시간은 최대 20분이라고 지정함. 실제로 20분 이상 세팅했더니 응답 거부 당함.
  • Audience : appstoreconnect-v1으로 세팅
  • Token Scope : token 범위 지정 기능임. Optional 이라 안해도 됨.
{
    "iss": "57246542-96fe-1a63-e053-0824d011072a",
    "iat": 1528407600,
    "exp": 1528408800,
    "aud": "appstoreconnect-v1",
    "scope": [
        "GET /v1/apps?filter[platform]=IOS"
    ]
}

apple 공식 사이트에서 확인하면 대략 이런식으로 payload를 작성하면 된다함.
아래는 실제 작성한 JWT 토큰 작성법.

public String createJWT( ){
        JWSHeader header=new JWSHeader.Builder(JWSAlgorithm.ES256).keyID(keyId).type(JOSEObjectType.JWT).build();

        JWTClaimsSet claimsSet=new JWTClaimsSet();
        Date now=new Date();
        claimsSet.setIssuer(issuer_Id);
        claimsSet.setIssueTime(now);
        claimsSet.setExpirationTime(new Date(now.getTime()+900000)); // exp 15 minutes
        claimsSet.setAudience("appstoreconnect-v1");

        SignedJWT jwt=new SignedJWT(header,claimsSet);

        try{
        ECPrivateKey ecPrivateKey=new ECPrivateKeyImpl(readPrivateKey(keyPath));
        JWSSigner jwsSigner=new ECDSASigner(ecPrivateKey.getS());
        jwt.sign(jwsSigner);

        }catch(InvalidKeyException e)
        {
        e.printStackTrace();
        }catch(JOSEException e)
        {
        e.printStackTrace();
        }
        
        return jwt.serialize();
}



private byte[] readPrivateKey(String keyPath){
        Resource resource = new ClassPathResource(keyPath);
        byte[] content = null;

        try(FileReader keyReader = new FileReader(resource.getFile());
        PemReader pemReader = new PemReader(keyReader))
        {
        PemObject pemObject = pemReader.readPemObject();
        content = pemObject.getContent();

        }catch(IOException e)
        {
        e.printStackTrace();
        }
        return content;
}

필요한 라이브러리

implementation 'com.nimbusds:nimbus-jose-jwt:3.10'

실제로 API 호출 부분도 필요하다면 댓글 남겨주세요.

profile
개발자로 입사했지만 정체성을 잃어가는중... 다시 준비 시작이다..

0개의 댓글