Невозможно декодировать токен в python, созданный в ASP. NET с использованием секрета - PullRequest
0 голосов
/ 06 августа 2020

Секрет создан в. 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:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImRldnVzZXIiLCJzdWIiOiJkZXZ1c2VyIiwicm9sZSI6WyJNYW5hZ2VyIiwiU3VwZXJ2aXNvciJdLCJpc3MiOiJodHRwczovL2ppbmFsYXV0aGFwaWRldi5henVyZXdlYnNpdGVzLm5ldCIsImF1ZCI6IjZBMDA1NzRBRTU1MTRDMUM5MEQyRDUzMzJGRUY3OEY5IiwiZXhwIjoxNTk2NzA4NTU1LCJuYmYiOjE1OTY3MDY3NTV9.fAbd_fz8y2EKPbYk7N42_kPXqGGOdVGSDYtJhSOz1DA

Секрет - это IxrAjDoa2FqElO7IhrSrUJELhUckePEPVpaePlS_Xaw, который создается и сохраняется в базе данных. Секрет кодируется с использованием TextEncodings.Base64Url.Encode перед сохранением в базе данных. Я попытался расшифровать секретный ключ в python, добавив «=»

base64.urlsafe_b64decode("IxrAjDoa2FqElO7IhrSrUJELhUckePEPVpaePlS_Xaw=")

. Я также попытался, добавив двойное равное «==», используя метод ниже

base64.b64decode("IxrAjDoa2FqElO7IhrSrUJELhUckePEPVpaePlS_Xaw==")

Fianlly Я пробовал два вышеупомянутых метода для декодирования секрета и использования его в 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),
)

1 Ответ

0 голосов
/ 06 августа 2020

Сначала секрет нуждается в дополнении. Хотя кодировка Base64Url обычно не требует заполнения , декодер Python Base64 этого хочет. Итак, секрет:

IxrAjDoa2FqElO7IhrSrUJELhUckePEPVpaePlS_Xaw=

(дополнено до 44 символов).

Без заполнения вы получите:

binascii. Ошибка: Неверное заполнение

И затем ваш токен содержит утверждение аудитории , и PyJWT должен проверить аудиторию.

Цитата из указанной выше документации:

Если принципал, обрабатывающий утверждение, не идентифицирует себя со значением в утверждении «aud» при наличии этого утверждения, тогда JWT ДОЛЖЕН быть отклонен.

Если вы не прошли допустимую аудиторию в качестве параметра для decode вы получите исключение:

InvalidAudienceError ('Invalid Audience')

Если вы передадите допустимую аудиторию, как в этом пример:

import jwt
import base64

token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6ImRldnVzZXIiLCJzdWIiOiJkZXZ1c2VyIiwicm9sZSI6WyJNYW5hZ2VyIiwiU3VwZXJ2aXNvciJdLCJpc3MiOiJodHRwczovL2ppbmFsYXV0aGFwaWRldi5henVyZXdlYnNpdGVzLm5ldCIsImF1ZCI6IjZBMDA1NzRBRTU1MTRDMUM5MEQyRDUzMzJGRUY3OEY5IiwiZXhwIjoxNTk2NzA4NTU1LCJuYmYiOjE1OTY3MDY3NTV9.fAbd_fz8y2EKPbYk7N42_kPXqGGOdVGSDYtJhSOz1DA"

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

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

работает нормально.

...