Не проверяет JWT-токен из React в заголовке или не видит токен
Есть приложение - front на React
, back на Django
. Также есть приложение на Microsoft Azure
для аутентификации пользователя.
Для проверки токена я использую этот учебник: Валидация JSON веб-токенов (JWT) из Azure AD, в Python
После этого создаются 2 файла.
demo.py
:
import jwt
from jwksutils import rsa_pem_from_jwk
# To run this example, follow the instructions in the project README
# obtain jwks as you wish: configuration file, HTTP GET request to the endpoint returning them;
jwks = {
"keys": [
{
"kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk",
"nbf": 1493763266,
"use": "sig",
"kty": "RSA",
"e": "AQAB",
"n": "tVKUtcx_n9rt5afY_2WFNvU6PlFMggCatsZ3l4RjKxH0jgdLq6CScb0P3ZGXYbPzXvmmLiWZizpb-h0qup5jznOvOr-Dhw9908584BSgC83YacjWNqEK3urxhyE2jWjwRm2N95WGgb5mzE5XmZIvkvyXnn7X8dvgFPF5QwIngGsDG8LyHuJWlaDhr_EPLMW4wHvH0zZCuRMARIJmmqiMy3VD4ftq4nS5s8vJL0pVSrkuNojtokp84AtkADCDU_BUhrc2sIgfnvZ03koCQRoZmWiHu86SuJZYkDFstVTVSR0hiXudFlfQ2rOhPlpObmku68lXw-7V-P7jwrQRFfQVXw"
}
]
}
# configuration, these can be seen in valid JWTs from Azure B2C:
valid_audiences = ['d7f48c21-2a19-4bdb-ace8-48928bff0eb5'] # id of the application prepared previously
issuer = 'https://ugrose.b2clogin.com/9c2984ff-d596-4e5c-8e74-672be7b592e3/v2.0/' # iss
class InvalidAuthorizationToken(Exception):
def __init__(self, details):
super().__init__('Invalid authorization token: ' + details)
def get_kid(token):
headers = jwt.get_unverified_header(token)
if not headers:
raise InvalidAuthorizationToken('missing headers')
try:
return headers['kid']
except KeyError:
raise InvalidAuthorizationToken('missing kid')
def get_jwk(kid):
for jwk in jwks.get('keys'):
if jwk.get('kid') == kid:
return jwk
raise InvalidAuthorizationToken('kid not recognized')
def get_public_key(token):
return rsa_pem_from_jwk(get_jwk(get_kid(token)))
def validate_jwt(jwt_to_validate):
public_key = get_public_key(jwt_to_validate)
decoded = jwt.decode(jwt_to_validate,
public_key,
verify=True,
algorithms=['RS256'],
audience=valid_audiences,
issuer=issuer)
# do what you wish with decoded token:
# if we get here, the JWT is validated
print(decoded)
def main():
import sys
import traceback
if len(sys.argv) < 2:
print('Please provide a JWT as script argument')
return
jwt = sys.argv[1]
if not jwt:
print('Please pass a valid JWT')
try:
validate_jwt(jwt)
except Exception as ex:
traceback.print_exc()
print('The JWT is not valid!')
else:
print('The JWT is valid!')
if __name__ == '__main__':
main()
и jwksuit.py
:
import base64
from cryptography.hazmat.primitives.asymmetric.rsa import RSAPublicNumbers
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
def ensure_bytes(key):
if isinstance(key, str):
key = key.encode('utf-8')
return key
def decode_value(val):
decoded = base64.urlsafe_b64decode(ensure_bytes(val) + b'==')
return int.from_bytes(decoded, 'big')
def rsa_pem_from_jwk(jwk):
return RSAPublicNumbers(
n=decode_value(jwk['n']),
e=decode_value(jwk['e'])
).public_key(default_backend()).public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
Я создал эти 2 файла в своем проекте. Я успешно аутентифицируюсь с помощью React
на Azure
и получаю access token
, который хранится в header
. Когда я пытаюсь получить доступ к backend Django
, я получаю 403 forbidden
. Как будто функциональность, которая должна подтвердить token
, не запускается.
Что я упускаю???? Я думаю о том, чтобы запустить эту функциональность через Middleware
, но не думаю, что это будет правильным решением. И, очевидно, это должно работать без Middleware
.
Я могу получить token
из header
вручную: request.header['Authorization']
, но я думаю, что мне это не нужно, потому что библиотека jwt
делает это сама.
Также, в моем приложении эта строка отличается:
issuer = 'https://ugrose.b2clogin.com/9c2984ff-d596-4e5c-8e74-672be7b592e3/v2.0/' # iss
У меня есть:
issuer = 'https://login.microsoftonline.com/<tenant id>/v2.0/'
Я сделал все из примера, но, возможно, не до конца понял раздел: Как получить открытые ключи RSA и другие метаданные от эмитента.
https://login.microsoftonline.com/{TENANT_ID}/discovery/keys?p={NAME_OF_POLICY}
И я не нашел для своего приложения Azura: {NAME_OF_POLICY}
Любая помощь будет полезна.
Подскажите, должно ли оно само запускаться без Middleware
? У кого есть похожие примеры, буду очень рад любой помощи.