无法解码在 ASP.NET 中使用秘密创建的 python 中的令牌
Cannot decode token in python created in ASP.NET using secret
Secret 是使用以下代码在 .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中解码:
Secret是XYZ
生成并存储在数据库中。 Secret 在存储到数据库之前使用 TextEncodings.Base64Url.Encode
编码。我试图通过添加 "="
来解码 python 中的密钥
base64.urlsafe_b64decode("XYZ=")
我还尝试使用以下方法添加双等号“==”
base64.b64decode("XYZ==")
最后我尝试了以上两种方法来解码秘密并在jwt.decode()
中使用它
jwt.decode(token, secret, algorithms=['HS256'])
None 个有效。
令牌看起来像
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),
)
首先秘密需要填充。虽然 Base64Url 编码通常 does not require padding,但 Python Base64 解码器需要它。
所以秘诀是:
XYZ=
(填充到 44 个字符)。
没有填充你会得到:
binascii.Error: Incorrect padding
然后你的令牌包含一个 audience claim 并且 PyJWT 必须验证观众。
引用上面链接的文档:
If the principal processing the claim does not identify itself with a value in the “aud” claim when this claim is present, then the JWT MUST be rejected.
如果您没有将有效受众作为参数传递给 decode
,您将得到一个异常:
InvalidAudienceError('Invalid audience')
如果您通过了有效受众,如本例所示:
import jwt
import base64
token = "abc"
secret = base64.urlsafe_b64decode("XYZ=")
allowed_audience = "6A00574AE5514C1C90D2D5332FEF78F9"
decoded = jwt.decode(token, secret, audience = allowed_audience)
print(decoded)
它工作正常。
Secret 是使用以下代码在 .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中解码:
Secret是XYZ
生成并存储在数据库中。 Secret 在存储到数据库之前使用 TextEncodings.Base64Url.Encode
编码。我试图通过添加 "="
base64.urlsafe_b64decode("XYZ=")
我还尝试使用以下方法添加双等号“==”
base64.b64decode("XYZ==")
最后我尝试了以上两种方法来解码秘密并在jwt.decode()
jwt.decode(token, secret, algorithms=['HS256'])
None 个有效。
令牌看起来像
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),
)
首先秘密需要填充。虽然 Base64Url 编码通常 does not require padding,但 Python Base64 解码器需要它。 所以秘诀是:
XYZ=
(填充到 44 个字符)。
没有填充你会得到:
binascii.Error: Incorrect padding
然后你的令牌包含一个 audience claim 并且 PyJWT 必须验证观众。
引用上面链接的文档:
If the principal processing the claim does not identify itself with a value in the “aud” claim when this claim is present, then the JWT MUST be rejected.
如果您没有将有效受众作为参数传递给 decode
,您将得到一个异常:
InvalidAudienceError('Invalid audience')
如果您通过了有效受众,如本例所示:
import jwt
import base64
token = "abc"
secret = base64.urlsafe_b64decode("XYZ=")
allowed_audience = "6A00574AE5514C1C90D2D5332FEF78F9"
decoded = jwt.decode(token, secret, audience = allowed_audience)
print(decoded)
它工作正常。