You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
2.3 KiB

  1. package com.example.demo.Util;
  2. import io.jsonwebtoken.Jwts;
  3. import io.jsonwebtoken.SignatureAlgorithm;
  4. import io.jsonwebtoken.io.Decoders;
  5. import java.nio.file.Files;
  6. import java.nio.file.Paths;
  7. import java.security.KeyFactory;
  8. import java.security.PrivateKey;
  9. import java.security.spec.PKCS8EncodedKeySpec;
  10. import java.util.Date;
  11. public class AppleTokenGenerator {
  12. // 你提供的真实信息(已全部填好)
  13. private static final String KEY_ID = "3J2S9VXU3V";
  14. private static final String ISSUER_ID = "69a6de7e-1f9a-47e3-e053-5b8c7c11a4d1";
  15. private static final String P8_FILE_PATH = "E:/Work/newgold/gold-java/src/main/java/com/example/demo/Util/AuthKey_3J2S9VXU3V.p8";
  16. public static String generateToken() {
  17. try {
  18. // 读取 P8 私钥内容
  19. String p8Content = Files.readString(Paths.get(P8_FILE_PATH))
  20. .replace("-----BEGIN PRIVATE KEY-----", "")
  21. .replace("-----END PRIVATE KEY-----", "")
  22. .replaceAll("\\s+", "");
  23. // 解码私钥
  24. byte[] keyBytes = Decoders.BASE64.decode(p8Content);
  25. PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
  26. KeyFactory keyFactory = KeyFactory.getInstance("EC");
  27. PrivateKey privateKey = keyFactory.generatePrivate(spec);
  28. // 生成苹果官方标准 JWT(补全typ字段,完全符合文档要求)
  29. return Jwts.builder()
  30. .setHeaderParam("alg", "ES256")
  31. .setHeaderParam("kid", KEY_ID)
  32. .setHeaderParam("typ", "JWT") // 🔴 苹果官方强制要求,之前漏了!
  33. .setIssuer(ISSUER_ID)
  34. .setAudience("appstoreconnect-v1")
  35. .setIssuedAt(new Date())
  36. .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 15)) // 15分钟有效期(≤20分钟)
  37. .signWith(privateKey, SignatureAlgorithm.ES256)
  38. .compact();
  39. } catch (Exception e) {
  40. e.printStackTrace();
  41. return null;
  42. }
  43. }
  44. // // 运行直接输出可用 Token
  45. // public static void main(String[] args) {
  46. // String token = generateToken();
  47. // System.out.println("复制下面这一行直接用:");
  48. // System.out.println("Bearer " + token);
  49. // }
  50. }