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

Вернуться на верх