ES256 的 JWT 签名要求
JWT signing requirements for ES256
我正在尝试通过使用 ES256 为我的 JWT 生成签名来编译我唱歌的最后部分。
根据 jwt.io,我可以使用 HMAC SHA256 对其进行签名 - 这是我有点困惑的地方,如果我的 header 使用 ES256 - 这是否意味着我必须使用 ES256 对其进行签名算法?
这是我必须ES256的要求。
{
"alg": "ES256",
"kid": "DSR74G",
"typ": "JWT"
}
RFC 7518 定义 (in section 3.1)“alg”值和 MAC 算法之间允许的配对。 ES256
必须 与 ECDSA using P-256 and SHA-256
配对作为 MAC 算法。
由于 Apple 要求您使用 ES256,这意味着您必须使用 ECDSA。
当使用 ES256 验证授权码时,当您的密钥或“sub”出现问题时,我们会收到“无效客户端”。使用下面的代码,你的问题就会得到解决,因为我已经解决了我的问题。
代码:
private static CngKey GetPrivateKey()
{
using (var reader = File.OpenText(ConfigurationManager.AppSettings["key2"].ToString())) //put your key's path like C:\ABC.p8
{
var ecPrivateKeyParameters = (ECPrivateKeyParameters)new PemReader(reader).ReadObject();
var x = ecPrivateKeyParameters.Parameters.G.AffineXCoord.GetEncoded();
var y = ecPrivateKeyParameters.Parameters.G.AffineYCoord.GetEncoded();
var d = ecPrivateKeyParameters.D.ToByteArrayUnsigned();
return EccKey.New(x, y, d);
}
}
var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var issueTime = DateTime.Now;
var iat = (int)issueTime.Subtract(utc0).TotalSeconds;
var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;
var payload = new Dictionary<string, object>()
{
{ "sub", "com.xyzttt" }, // you registered app
{ "aud", "https://appleid.apple.com"},
{ "iss", "ABCDEFGHttt" }, //Team id
{ "exp", exp }, }, //current time + @@@@
{ "iat", iat } } // current time
};
var extraHeader = new Dictionary<string, object>()
{
{ "alg", "ES256" },
{ "kid", "5ABCDEFGH123tt21"}, //key id
};
var sb = GetPrivateKey();
var ecdsa = new ECDsaCng(sb);
byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(extraHeader, Formatting.None));
byte[] claimsBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload, Formatting.None));
var Rpayload = Base64UrlEncode(headerBytes) + "." + Base64UrlEncode(claimsBytes);
var signature = ecdsa.SignData(Encoding.UTF8.GetBytes(Rpayload), HashAlgorithmName.SHA256);
var data = Base64UrlEncode(signature);
string token = Rpayload + "." + data;
return token;
我正在尝试通过使用 ES256 为我的 JWT 生成签名来编译我唱歌的最后部分。
根据 jwt.io,我可以使用 HMAC SHA256 对其进行签名 - 这是我有点困惑的地方,如果我的 header 使用 ES256 - 这是否意味着我必须使用 ES256 对其进行签名算法?
这是我必须ES256的要求。
{
"alg": "ES256",
"kid": "DSR74G",
"typ": "JWT"
}
RFC 7518 定义 (in section 3.1)“alg”值和 MAC 算法之间允许的配对。 ES256
必须 与 ECDSA using P-256 and SHA-256
配对作为 MAC 算法。
由于 Apple 要求您使用 ES256,这意味着您必须使用 ECDSA。
当使用 ES256 验证授权码时,当您的密钥或“sub”出现问题时,我们会收到“无效客户端”。使用下面的代码,你的问题就会得到解决,因为我已经解决了我的问题。
代码:
private static CngKey GetPrivateKey()
{
using (var reader = File.OpenText(ConfigurationManager.AppSettings["key2"].ToString())) //put your key's path like C:\ABC.p8
{
var ecPrivateKeyParameters = (ECPrivateKeyParameters)new PemReader(reader).ReadObject();
var x = ecPrivateKeyParameters.Parameters.G.AffineXCoord.GetEncoded();
var y = ecPrivateKeyParameters.Parameters.G.AffineYCoord.GetEncoded();
var d = ecPrivateKeyParameters.D.ToByteArrayUnsigned();
return EccKey.New(x, y, d);
}
}
var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var issueTime = DateTime.Now;
var iat = (int)issueTime.Subtract(utc0).TotalSeconds;
var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;
var payload = new Dictionary<string, object>()
{
{ "sub", "com.xyzttt" }, // you registered app
{ "aud", "https://appleid.apple.com"},
{ "iss", "ABCDEFGHttt" }, //Team id
{ "exp", exp }, }, //current time + @@@@
{ "iat", iat } } // current time
};
var extraHeader = new Dictionary<string, object>()
{
{ "alg", "ES256" },
{ "kid", "5ABCDEFGH123tt21"}, //key id
};
var sb = GetPrivateKey();
var ecdsa = new ECDsaCng(sb);
byte[] headerBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(extraHeader, Formatting.None));
byte[] claimsBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(payload, Formatting.None));
var Rpayload = Base64UrlEncode(headerBytes) + "." + Base64UrlEncode(claimsBytes);
var signature = ecdsa.SignData(Encoding.UTF8.GetBytes(Rpayload), HashAlgorithmName.SHA256);
var data = Base64UrlEncode(signature);
string token = Rpayload + "." + data;
return token;