nuget 설치
- JWT 설치
Install-Package JWT -Version 10.0.0-beta5
- System.IdentityModel.Tokens.Jwt 설치
Install-Package System.IdentityModel.Tokens.Jwt -Version 6.21.0
설명
- apn 인증용 p8코드를 미리 발급받아 준비한다.
- 준비한 p8을 읽어 앞 뒤의 "private key" 키워드 삭제
- 줄바꿈을 공백으로 변경
- 준비된 p8데이터를 MakeToken 함수에 넣음.
CODE
// p8데이터 읽음
var p8Data = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "\\p8data.p8");
Console.WriteLine(p8Data);
// keeping only the payload of the key
// 불필요한 부분 제거
p8Data = p8Data.Replace("-----BEGIN PRIVATE KEY-----", "");
p8Data = p8Data.Replace("-----END PRIVATE KEY-----", "");
p8Data = p8Data.Replace("\r\n", string.Empty);
// jwt 토큰으로 변환
var jwtSecretToken = MakeToken(p8Data);
// 변환 함수
static string MakeToken(string p8key)
{
string aud = "https://appleid.apple.com";
string issuer = "teamId"; // apple 개발자 team id
string subject = "clientId"; // Apple 클라이언트 ID(서비스 ID이기도 함)
string kid = "kid"; // 다운로드한 키의 ID
var now = DateTime.UtcNow;
IList<Claim> claims = new List<Claim> {
new Claim ("sub", subject),
new Claim("iat", EpochTime.GetIntDate(now).ToString(), ClaimValueTypes.Integer64),
};
// 윈도우즈에서만 지원됩니다.
CngKey cngKey = CngKey.Import(Convert.FromBase64String(p8key), CngKeyBlobFormat.Pkcs8PrivateBlob);
SigningCredentials signingCred = new SigningCredentials(
new ECDsaSecurityKey(new ECDsaCng(cngKey)),
SecurityAlgorithms.EcdsaSha256
);
JwtSecurityToken token = new JwtSecurityToken(
issuer,
aud,
claims,
now,
now.AddDays(180),
signingCred
);
token.Header.Add("kid", kid);
token.Header.Remove("typ");
token.Payload.Remove("nbf");
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
return tokenHandler.WriteToken(token);
}
▶ 우리클라이언트 팀에서 payload부분에 nbf는 필요 없다고 하셔서 remove로 제거함
참고)
https://docs.microsoft.com/ko-kr/azure/app-service/configure-authentication-provider-apple
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[디자인패턴]- State 패턴 (0) | 2023.03.14 |
---|---|
[C#] DateTime값 Serialization/Deserialization시 DateTime.Minvalue 수치 변하는 현상. (0) | 2022.12.16 |
[vs] visualstudio community 버전업시 발생하는 에러. (0) | 2022.03.30 |
[C#] Nested transactions are not supported. (0) | 2021.06.07 |
[C#] localIP / public IP 가져오기 (0) | 2021.03.23 |
댓글