목표:
Apple 계정 탈퇴(연동 해제, revoke) API를 호출하려면
반드시 JWT 기반의 client_secret을 생성해서 보내야 함.
이 JWT의 서명에 **애플 개발자 사이트에서 받은 private key(PEM 포맷)**가 사용됨.
Flutter(dart)에서의 접근:
서버가 아닌 클라이언트(Dart/Flutter)에서 직접 JWT를 만들어 dart_jsonwebtoken 라이브러리로 서명해서
Apple 서버에 POST 요청을 보내는 구조로 시도.
.env에서 PEM(개인키) 문자열 여러 줄로 분할해 불러와 조립
final privateKey = [
dotenv.env['APPLE_PRIVATE_KEY_LINE1']!,
dotenv.env['APPLE_PRIVATE_KEY_LINE2']!,
// ...
].join('\n');
JWT 객체 생성
final jwt = JWT({
'iss': teamId,
'iat': ...,
'exp': ...,
'aud': 'https://appleid.apple.com',
'sub': clientId,
}, header: {
'kid': keyId,
'alg': 'ES256',
});
JWT 서명
final clientSecret = jwt.sign(
privateKey, // <- PEM string 사용
algorithm: JWTAlgorithm.ES256,
);
오류 메시지:
The argument type 'String' can't be assigned to the parameter type 'JWTKey'
원인:
sign() 함수가 PEM 문자열 직접 서명을 지원하지 않거나,시도 코드:
import 'package:basic_utils/basic_utils.dart';
import 'package:pointycastle/ecc/api.dart' as pc;
final pc.ECPrivateKey ecPrivateKey =
CryptoUtils.ecPrivateKeyFromPem(privateKey);
// ...
final clientSecret = jwt.sign(
ecPrivateKey,
algorithm: JWTAlgorithm.ES256,
);
오류 메시지:
The argument type 'ECPrivateKey' can't be assigned to the parameter type 'JWTKey'
원인:
ECPrivateKey를 기대하는 게 아니라 자체 정의된 JWTKey만 지원오류 메시지:
The method 'fromPem' isn't defined for the type 'JWTKey'
원인:
dart_jsonwebtoken을 1.0.1/2.7.1/3.1.1 등으로 다운그레이드/업그레이드
여전히 같은 오류 반복
결과:
"PEM → 서명 키" 변환 방법 자체가 불안정하며, pure Dart로 client_secret(JWT) 생성이 사실상 불가능에 가까움
Apple 공식 문서도 JWT 생성은 일반적으로 서버에서 진행하는 것을 가정
실패:
원인:
교훈: