0

使用以下代码在 .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在数据库中生成并存储的。TextEncodings.Base64Url.Encode秘密在存储到数据库之前使用编码。我试图通过添加“=”来解码python中的密钥

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),
)
4

1 回答 1

1

首先秘密需要填充。虽然 Base64Url 编码通常不需要 padding,但 Python Base64 解码器需要它。所以秘诀是:

XYZ=

(填充到 44 个字符)。

没有填充你会得到:

binascii.Error:不正确的填充

然后您的令牌包含受众声明,PyJWT 必须验证受众。

引用上面的链接文档:

如果处理该声明的主体在此声明存在时未将其自身标识为“aud”声明中的值,则必须拒绝 JWT。

如果您没有将有效的受众作为参数传递给decode,则会出现异常:

InvalidAudienceError('无效的观众')

如果您通过了有效的受众,就像在这个例子中:

import jwt
import base64

token = "abc"

secret = base64.urlsafe_b64decode("XYZ=")
allowed_audience = "6A00574AE5514C1C90D2D5332FEF78F9"

decoded = jwt.decode(token, secret, audience = allowed_audience)
print(decoded)

它工作正常。

于 2020-08-06T09:53:45.943 回答