ES256的JWT签名要求

时间:2018-11-08 21:00:51

标签: javascript algorithm api jwt sign

我正在尝试通过使用ES256为我的JWT生成签名来编译我演唱的最后部分。

根据jwt.io,我可以使用HMAC SHA256对其进行签名-如果我的标头使用ES256,这是我有点困惑的地方-这是否意味着我必须使用ES256算法对其进行签名?

这是我必须ES256的要求。

{
"alg": "ES256",
"kid": "DSR74G",
"typ": "JWT"
}

2 个答案:

答案 0 :(得分:1)

RFC 7518定义(in section 3.1)“ alg”值与MAC算法之间允许的配对。 ES256 必须ECDSA using P-256 and SHA-256作为MAC算法配对。

由于您面临Apple要求使用ES256的要求,这意味着您必须使用ECDSA。

答案 1 :(得分:0)

当您的密钥存在问题时,我们将获得“无效的客户端”,而在通过ES256验证授权代码时,将获得“子”。使用下面的代码,您的问题将得到解决,因为我已经解决了问题。

代码:

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;