【发布时间】:2020-11-26 10:53:37
【问题描述】:
使用以下代码在 .Net 中创建秘密
var key = new byte[32];
RNGCryptoServiceProvider.Create().GetBytes(key);
var base64Secret = TextEncodings.Base64Url.Encode(key)
Audience newAudience = new Audience { ClientId = clientId, Base64Secret = base64Secret, Name = name };
使用以下代码在 .Net 中创建令牌
string symmetricKeyAsBase64 = audience.Base64Secret;
var keyByteArray = TextEncodings.Base64Url.Decode(symmetricKeyAsBase64);
var signingKey = new HmacSigningCredentials(keyByteArray);
var issued = data.Properties.IssuedUtc;
var expires = data.Properties.ExpiresUtc;
var token = new JwtSecurityToken(_issuer, audienceId, data.Identity.Claims, issued.Value.UtcDateTime, expires.Value.UtcDateTime, signingKey);
以上代码成功创建了需要在python中解码的token:
秘密是XYZ,它被生成并存储在数据库中。在存储到数据库之前,秘密使用TextEncodings.Base64Url.Encode 进行编码。我尝试通过添加“=”
base64.urlsafe_b64decode("XYZ=")
我还尝试使用以下方法添加双等号“==”
base64.b64decode("XYZ==")
最后我尝试了以上两种方法来解码秘密并在jwt.decode()中使用它
jwt.decode(token, secret, algorithms=['HS256'])
一切都没有奏效。
令牌看起来像
HEADER:ALGORITHM & TOKEN TYPE
{
"typ": "JWT",
"alg": "HS256"
}
PAYLOAD:DATA
{
"unique_name": "devuser",
"sub": "devuser",
"role": [
"Manager",
"Supervisor"
],
"iss": "https://xxxxxxx.azurewebsites.net",
"aud": "6A00574AE5514C1C90D2D5332FEF78F9",
"exp": 1596636265,
"nbf": 1596634465
}
**VERIFY SIGNATURE**
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
)
【问题讨论】:
-
那么现在有什么问题? 所有的事情都不起作用。 - 这不是一个足够的错误描述。又是填充错误吗?至少您应该从旧问题中的链接重复项中了解到,base64 字符串的长度应该可以被 4 整除,因此添加两个 '=' 没有意义。上次我还检查了当你有一个用 base64 编码的秘密签名的 JWT 时你的 python 代码是否正常工作。所以也许 C# 方面是问题所在。显示您的 C# 生成的令牌。
-
当我使用该令牌时,使用给定的秘密(用一个“=”填充)和此代码:
decoded = jwt.decode(token, secret)我收到ExpiredSignatureError('Signature has expired')错误。如果我尝试使用另一个令牌,使用相同的密钥制作并且在 jwt.io 上未过期,则解码工作正常。 -
所以您出于安全考虑编辑问题和答案,但使用从教程中复制的秘密,可以在more than 250 times on google找到?
标签: python c# jwt base64 pyjwt