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.
58 lines
2.3 KiB
58 lines
2.3 KiB
package com.example.demo.Util;
|
|
|
|
import io.jsonwebtoken.Jwts;
|
|
import io.jsonwebtoken.SignatureAlgorithm;
|
|
import io.jsonwebtoken.io.Decoders;
|
|
import java.nio.file.Files;
|
|
import java.nio.file.Paths;
|
|
import java.security.KeyFactory;
|
|
import java.security.PrivateKey;
|
|
import java.security.spec.PKCS8EncodedKeySpec;
|
|
import java.util.Date;
|
|
|
|
public class AppleTokenGenerator {
|
|
|
|
// 你提供的真实信息(已全部填好)
|
|
private static final String KEY_ID = "3J2S9VXU3V";
|
|
private static final String ISSUER_ID = "69a6de7e-1f9a-47e3-e053-5b8c7c11a4d1";
|
|
private static final String P8_FILE_PATH = "E:/Work/newgold/gold-java/src/main/java/com/example/demo/Util/AuthKey_3J2S9VXU3V.p8";
|
|
|
|
public static String generateToken() {
|
|
try {
|
|
// 读取 P8 私钥内容
|
|
String p8Content = Files.readString(Paths.get(P8_FILE_PATH))
|
|
.replace("-----BEGIN PRIVATE KEY-----", "")
|
|
.replace("-----END PRIVATE KEY-----", "")
|
|
.replaceAll("\\s+", "");
|
|
|
|
// 解码私钥
|
|
byte[] keyBytes = Decoders.BASE64.decode(p8Content);
|
|
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
|
|
KeyFactory keyFactory = KeyFactory.getInstance("EC");
|
|
PrivateKey privateKey = keyFactory.generatePrivate(spec);
|
|
|
|
// 生成苹果官方标准 JWT(补全typ字段,完全符合文档要求)
|
|
return Jwts.builder()
|
|
.setHeaderParam("alg", "ES256")
|
|
.setHeaderParam("kid", KEY_ID)
|
|
.setHeaderParam("typ", "JWT") // 🔴 苹果官方强制要求,之前漏了!
|
|
.setIssuer(ISSUER_ID)
|
|
.setAudience("appstoreconnect-v1")
|
|
.setIssuedAt(new Date())
|
|
.setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 15)) // 15分钟有效期(≤20分钟)
|
|
.signWith(privateKey, SignatureAlgorithm.ES256)
|
|
.compact();
|
|
|
|
} catch (Exception e) {
|
|
e.printStackTrace();
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// // 运行直接输出可用 Token
|
|
// public static void main(String[] args) {
|
|
// String token = generateToken();
|
|
// System.out.println("复制下面这一行直接用:");
|
|
// System.out.println("Bearer " + token);
|
|
// }
|
|
}
|