Apns JWT Format
Heder
{
"alg": "ES256", // 알고리즘
"kid": "ABC123DEFG“ // key 8글자
}
계정 인증키는 아래에서 확인 할 수 있다. 주의 할 점은 함부로 노출되선 안되며 발급은 최초 한번 밖에 안되니 따로 저장해둘 것.
PayLoad
{
"iss": "DEF123GHIJ", // 10-character Team ID
"iat": 1437179036 // in terms of the number of seconds since Epoch, in UTC
}
{
base64_header + "." + base64_payload,
secret
) base64_endcoding
- APN은 ES256 알고리즘으로 서명 된 공급자 인증 토큰 만 지원합니다.
- 보안되지 않은 JWT 또는 다른 알고리즘으로 서명 된JWT는 거부되고 공급자는 InvalidProviderToken(403) 응답을 받습니다 .
- 보안을 보장하기 위해 APN은 주기적으로 새 토큰을 생성해야합니다.
- 새 토큰에는 토큰이 생성 된 시간을 나타내는 claim 키에서 업데이트 된 발급 항목이 있습니다.
- 만일 토큰 문제가 발생하고 토큰 문제에 대한 타임 스탬프가 지난 1 시간 이내에 있지 않으면 APN은 후속 푸시 메시지를 거부하고 ExpiredProviderToken (403) 오류를 반환합니다.
-제공자 토큰 서명 키가 유출 된 것으로 의심되면 개발자 계정에서 해지 할 수 있습니다. 새 키 쌍을 발행 할 수 있으며 새 개인 키를 사용하여 새 토큰을 생성 할 수 있습니다. 보안을 최대화하려면 지금 폐기 된 키로 서명 된 토큰을 사용했던 APN에 대한 모든 연결을 닫고 새 키로 서명 된 토큰을 사용하기 전에 다시 연결하십시오.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.security.InvalidKeyException; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.Signature; import java.security.SignatureException; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import java.security.spec.PKCS8EncodedKeySpec; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; public class JsonWebToken { private String token; public String createToken() throws InvalidKeyException, NoSuchAlgorithmException, InvalidKeySpecException, SignatureException { long nowMillis = System.currentTimeMillis() / 1000; //json String jwt_header = "{\"alg\" : \"ES256\" , \"kid\":\"KA1KG44A\"}"; //json String jwt_payload = "{\"iss\" : \"TEAMID1234\" , \"iat\":" + nowMillis + "}"; String KEY_PATH = JsonWebToken.class.getResource("").getPath() + "../../lib/AuthKey.p8"; String base64_header = new String(Base64.encode(jwt_header.getBytes(StandardCharsets.UTF_8))); String base64_payload = new String(Base64.encode(jwt_payload.getBytes(StandardCharsets.UTF_8))); String part1 = base64_header + "." + base64_payload; BufferedReader br = null; String secret = ""; try { String currentLine; br = new BufferedReader(new FileReader(KEY_PATH)); while ((currentLine = br.readLine()) != null) { secret += currentLine; } br.close(); } catch (IOException e) { e.printStackTrace(); } token = base64_header + "." + base64_payload + "." + ES256(secret, part1); System.err.println(token); return token; } public String ES256(final String secret, final String data) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException { KeyFactory kf; kf = KeyFactory.getInstance("EC"); KeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(secret)); // KeySpec keySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(secret)); PrivateKey key; key = kf.generatePrivate(keySpec); final Signature sha256withECDSA = Signature.getInstance("SHA256withECDSA"); sha256withECDSA.initSign(key); sha256withECDSA.update(data.getBytes(StandardCharsets.UTF_8)); final byte[] signed = sha256withECDSA.sign(); return Base64.encode(signed).toString(); } } | cs |
'Cloud & NoSQL & Middleware > Apns' 카테고리의 다른 글
APNS HTTP/2 토큰 방식 인증 (2) - JWT 장/단점 (0) | 2018.06.11 |
---|---|
APNS HTTP/2 토큰 방식 인증 (1) - JWT (Json Web Token) (0) | 2018.06.11 |
Binary Provider API 구현 (0) | 2018.06.11 |
HTTP/2 - based Apns Provider API (0) | 2018.05.31 |
FeedbackService - Format, Packet (0) | 2018.05.29 |