해당 예제에서는 Microsoft.IdentityModel.Tokens, System.IdentityModel.Tokens.Jwt 패키지를 사용
아래는 예제 코드
var parts = Resource1.token_ios2.Split('.');var header = parts[0];var payload = parts[1];// 헤더 정보가 궁금하거나 TokenValidationParameters에 ValidAudience, ValidIssuer값을 모를경우 사용var hh = JwtHeader.Base64UrlDeserialize(header);var pp = JwtPayload.Base64UrlDeserialize(payload);
apple에 key발급
발급받은 json에 kid랑 토큰에 kid랑 일치
// 꼭 key를 발급받아야함. kid가 토큰 header에 kid와 일치
string url = "https://appleid.apple.com/auth/keys";
string responseText = string.Empty;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.Timeout = 30 * 1000;
using (HttpWebResponse resp = (HttpWebResponse)request.GetResponse()) {
HttpStatusCode status = resp.StatusCode;
Console.WriteLine(status);
Stream respStream = resp.GetResponseStream(); using (StreamReader sr = new StreamReader(respStream)) { responseText = sr.ReadToEnd(); }
}
발급받은 key와 정보로 객체 생성
// 발급받은 key를 사용
var jwks = new JsonWebKeySet(responseText);
// jwt.io 사이트에서 encoded시에 나오는 iss,aud
var validationParameters = new TokenValidationParameters {
IssuerSigningKeys = jwks.Keys,
ValidAudience = "aud", // aud는 어플리케이션id
ValidIssuer = "iss", // iss는 고정
ValidateLifetime = true,
ValidateAudience = true,
ValidateIssuer = true,
};
토큰과 위에서 생성한 객체로 인증
var tokenHandler = new JwtSecurityTokenHandler();
try {
var claimsPrincipal = tokenHandler.ValidateToken(Resource1.token_ios2, validationParameters, out SecurityToken securityToken);
if (securityToken == null) {
// 인증 실패
}
} catch (Exception ex) {
// 인증 실패
Console.WriteLine(ex);
}