Djangorestframework-simplejwt с auth0 - проблема с настройками?
окружение:
- django (4.0.4)
- rest_framework (3.13.1)
- djangorestframework-simplejwt (5.2.0)
Какие именно настройки нужно использовать с simplejwt+auth0? Я не могу найти ни одного примера и, к сожалению, мне не удалось разобраться в этом самостоятельно.
Я пробовал следующее:
AUTH0_DOMAIN = 'dev-demo-xxxx.auth0.com'
API_IDENTIFIER = 'xxxxx'
PUBLIC_KEY = None
JWT_ISSUER = None
if AUTH0_DOMAIN:
jsonurl = request.urlopen('https://' + AUTH0_DOMAIN + '/.well-known/jwks.json')
jwks = json.loads(jsonurl.read().decode('utf-8'))
cert = '-----BEGIN CERTIFICATE-----\n' + jwks['keys'][0]['x5c'][0] + '\n-----END CERTIFICATE-----'
certificate = load_pem_x509_certificate(cert.encode('utf-8'), default_backend())
PUBLIC_KEY = certificate.public_key()
JWT_ISSUER = 'https://' + AUTH0_DOMAIN + '/'
SIMPLE_JWT = {
'ALGORITHM': 'RS256',
'AUDIENCE': 'https://issuer-domain',
'ISSUER': JWT_ISSUER,
'VERIFYING_KEY': PUBLIC_KEY
}
но токены, отправленные с клиента (успешно полученные с помощью библиотеки auth0 javascript), не проверяются должным образом на бэкенде. (токен был успешно проверен с помощью инструмента отладки jwt.io)
текущая ошибка:
code: "token_not_valid" detail: "Given token not valid for any token type"
Вот настройки, которые сработали для меня сегодня:
AUTH0_DOMAIN = "YOUR_DOMAIN"
AUTH0_AUDIENCE = "YOUR_AUDIENCE"
SIMPLE_JWT = {
'ALGORITHM': 'RS256',
'AUDIENCE': AUTH0_AUDIENCE,
'ISSUER': f"https://{AUTH0_DOMAIN}/",
'JWK_URL': f"https://{AUTH0_DOMAIN}/.well-known/jwks.json",
"USER_ID_CLAIM": f"{AUTH0_AUDIENCE}/email",
'JTI_CLAIM': None,
'TOKEN_TYPE_CLAIM': None,
}
Зависимости:
django==3.2.15
djangorestframework==3.11.2
djangorestframework-simplejwt[crypto]==5.2.0
authlib==1.0.1
Мне удалось заставить Auth0 работать с Django 4.1.3 и djangorestframework-simplejwt 5.2.2, используя приведенную ниже конфигурацию.
Ключевыми областями, которые ставили меня в тупик, были клавиши USER_ID_FIELD
и USER_ID_CLAIM
.
USER_ID_CLAIM
- это значение, которое находится внутри JWT. Вы можете проверить, что находится в вашем JWT, с помощью отладчика JWT token. Auth0 должен включать поле sub
(для уникального подзапроса идентификатора пользователя и должен выглядеть как auth0|1234..
), которое, вероятно, вы хотите использовать для USER_ID_CLAIM
. Вы можете добавить дополнительные данные в JWT с помощью custom claims, но я не заходил так далеко.
USER_ID_FIELD
- это столбец в вашей базе данных, который будет соотноситься со значением, полученным в USER_ID_CLAIM
. В моем случае, я храню значения идентификатора пользователя Auth0 в столбце subclaim
, поэтому именно его я и поместил.
SIMPLE_JWT = {
'ALGORITHM': 'RS256',
'AUDIENCE': API_IDENTIFIER,
'ISSUER': f"https://{AUTH0_DOMAIN}/",
'JWK_URL': f"https://{AUTH0_DOMAIN}/.well-known/jwks.json",
'USER_ID_FIELD': 'subclaim',
'USER_ID_CLAIM': 'sub',
'ACCESS_TOKEN_LIFETIME': timedelta(days=1),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'JTI_CLAIM': None,
'TOKEN_TYPE_CLAIM': None,
}
Другое замечание - вы можете использовать поле JWK_URL
, чтобы устранить необходимость вручную разбирать сертификаты, запускать код в блоке if AUTH0_DOMAIN:
или указывать VERIFYING_KEY