生成 JWS 时清空负载
Empty payload when generating JWS
我的目标是创建一个未加密的签名令牌。我正在这样生成我的 JWT :
private const string C_ISSUER_SIGNINGKEY = "kXp2s5v8y/B?D(G+KbPeShVmYq3t6w9z";
private const JweAlgorithm JWE_ALGO = JweAlgorithm.DIR;
private const JweEncryption JWE_ENCR = JweEncryption.A128CBC_HS256;
public string GenerateToken(Dictionary<string, object> aPayload, TimeSpan aExpirationTime)
{
var aNowMs = DateTime.Now.ToUniversalTime().Subtract(
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
).TotalMilliseconds;
if (aExpirationTime.TotalMilliseconds > 0)
{
var lExp = aNowMs + aExpirationTime.TotalMilliseconds;
aPayload.Add("exp", lExp);
}
var aSecretKey = Encoding.UTF8.GetBytes(C_ISSUER_SIGNINGKEY);
var aToken = JWT.Encode(aPayload, aSecretKey, JWE_ALGO, JWE_ENCR);
return aToken;
}
使用这个时,我得到一个这样的令牌:
var lPayLoad = new Dictionary<string, object>()
{
{ "emailAddress", "peter@email.com" },
{ "password", "password" }
};
var lToken = lEncryptor.GenerateToken(lPayLoad, new TimeSpan(50,50,50,50));
然后我会得到这样的令牌:eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..4lvBJr_Q0X_hj5OL5rdMsA.d0S--Vdm0JDkjYcN1Djnx4KV3DbehzwkHlvDKlFQuAk.DVS5O8zmJr2l1axenk2Fgw
(注意,令牌中的有效负载部分为空)
当我尝试对此进行解码(通过 jwt.Io 或任何其他工具)时,我无法验证签名者,也无法获取有效负载。
我到底做错了什么?
在您的代码中,您为签名令牌 (JWS) 使用了错误的算法类型。
JweAlgorithm JWE_ALGO = JweAlgorithm.DIR
var aToken = JWT.Encode(aPayload, aSecretKey, JWE_ALGO, JWE_ENCR);
并且 JWE_ENCR
参数在此上下文中是错误的。
对于使用 jose-jwt 创建的 JWS,您需要选择合适的签名算法,例如:
JwsAlgorithm.HS256
或
JwsAlgorithm.HS512
JwsAlgorithm.RS256
JwsAlgorithm.RS512
JwsAlgorithm.ES256
等(Reference)
如果将行更改为:
JWT.Encode(aPayload, aSecretKey, JwsAlgorithm.HS256);
它应该可以正常工作。
我的目标是创建一个未加密的签名令牌。我正在这样生成我的 JWT :
private const string C_ISSUER_SIGNINGKEY = "kXp2s5v8y/B?D(G+KbPeShVmYq3t6w9z";
private const JweAlgorithm JWE_ALGO = JweAlgorithm.DIR;
private const JweEncryption JWE_ENCR = JweEncryption.A128CBC_HS256;
public string GenerateToken(Dictionary<string, object> aPayload, TimeSpan aExpirationTime)
{
var aNowMs = DateTime.Now.ToUniversalTime().Subtract(
new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
).TotalMilliseconds;
if (aExpirationTime.TotalMilliseconds > 0)
{
var lExp = aNowMs + aExpirationTime.TotalMilliseconds;
aPayload.Add("exp", lExp);
}
var aSecretKey = Encoding.UTF8.GetBytes(C_ISSUER_SIGNINGKEY);
var aToken = JWT.Encode(aPayload, aSecretKey, JWE_ALGO, JWE_ENCR);
return aToken;
}
使用这个时,我得到一个这样的令牌:
var lPayLoad = new Dictionary<string, object>()
{
{ "emailAddress", "peter@email.com" },
{ "password", "password" }
};
var lToken = lEncryptor.GenerateToken(lPayLoad, new TimeSpan(50,50,50,50));
然后我会得到这样的令牌:eyJhbGciOiJkaXIiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0..4lvBJr_Q0X_hj5OL5rdMsA.d0S--Vdm0JDkjYcN1Djnx4KV3DbehzwkHlvDKlFQuAk.DVS5O8zmJr2l1axenk2Fgw
(注意,令牌中的有效负载部分为空)
当我尝试对此进行解码(通过 jwt.Io 或任何其他工具)时,我无法验证签名者,也无法获取有效负载。
我到底做错了什么?
在您的代码中,您为签名令牌 (JWS) 使用了错误的算法类型。
JweAlgorithm JWE_ALGO = JweAlgorithm.DIR
var aToken = JWT.Encode(aPayload, aSecretKey, JWE_ALGO, JWE_ENCR);
并且 JWE_ENCR
参数在此上下文中是错误的。
对于使用 jose-jwt 创建的 JWS,您需要选择合适的签名算法,例如:
JwsAlgorithm.HS256
或
JwsAlgorithm.HS512
JwsAlgorithm.RS256
JwsAlgorithm.RS512
JwsAlgorithm.ES256
等(Reference)
如果将行更改为:
JWT.Encode(aPayload, aSecretKey, JwsAlgorithm.HS256);
它应该可以正常工作。