Мой исходный backend API, основанный на Django REST Framework, работал без каких-либо мер безопасности.
Теперь я реализую процесс аутентификации токена JWT, но понял, что проблема с постоянными ошибками на стороне backend-Django заключалась в том, что после добавления «IsAuthenticated» в «'DEFAULT_PERMISSION_CLASSES': ('rest_framework.permissions.IsAuthenticated') ", страница, которую выдает Django, постоянно представляет собой внутреннюю ошибку 500, а не ошибку аутентификации 401/403, из которой я, по крайней мере, могу знать, как двигаться дальше в разрешении.
Таким образом, я надеюсь, что кто-то может помочь мне указать направление в решении этой проблемы.
В течение последних 5 дней я пытался реализовать токен JWT, межмашинную проверку, с нулевой учетной записью и исключительно на основе доступа к авторизации токена, и я вроде как разобрал большую часть фронт- завершить процесс запроса доступа через Auth0.
Процесс, который, как я предполагал, работает, основан на том, что я прочитал из Auth0 API:
- Клиентский браузер отправляет запрос в API аутентификации токена Auth0
- Auth0 отвечает токеном
- Клиентский браузер использует ответный токен для отправки в качестве заголовка авторизации в серверный API.
- Серверный API отвечает данными результатов.
Текущая проблема, которую я осознал, заключается в том, что на шаге 4 мой сервер продолжал выдавать 500 ошибок вместо ошибок 401/403.
Я совершенно не уверен, где я мог ошибиться, и надеюсь, что кто-то может оказать некоторую помощь в добавлении кода, который поможет генерировать ответ Authenticated-Error.
SETTINGS.PY
import json
from six.moves.urllib import request
from cryptography.x509 import load_pem_x509_certificate
from cryptography.hazmat.backends import default_backend
INSTALLED_APPS = [
# Third-Party Apps
'corsheaders',
'rest_framework',
'rest_framework_jwt',
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
# GLOBAL SETTINGS SETUP FOR "DEFAULT_PERMISSION_CLASSES"
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
# GLOBAL SETTINGS SETUP FOR "DEFAULT_AUTHENTICATION_CLASSES"
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
'EXCEPTION_HANDLER': (
# GLOBAL SETTINGS SETUP FOR "EXCEPTION_HANDLER"
'rest_framework.views.exception_handler',
),
}
MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.auth.middleware.RemoteUserMiddleware',
]
AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'django.contrib.auth.backends.RemoteUserBackend',
]
AUTH0_DOMAIN = os.environ.get('AUTH0_DOMAIN')
API_IDENTIFIER = os.environ.get('API_IDENTIFIER')
PUBLIC_KEY = os.environ.get('PUBLIC_KEY')
JWT_ISSUER = os.environ.get('ISSUER')
# If AUTH0_DOMAIN is defined, load the jwks.json
if AUTH0_DOMAIN:
jsonurl = request.urlopen('https://' + AUTH0_DOMAIN + '/.well-known/jwks.json')
jwks = json.loads(jsonurl.read())
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 + '/'
# JWT settings
JWT_AUTH = {
'JWT_PAYLOAD_GET_USERNAME_HANDLER':
'backend.user.jwt_get_username_from_payload_handler', # REDIRECT TO "backend.user" INSTEAD OF "auth0authorization.user"
'JWT_PUBLIC_KEY': PUBLIC_KEY,
'JWT_ALGORITHM': 'RS256',
'JWT_AUDIENCE': API_IDENTIFIER,
'JWT_ISSUER': JWT_ISSUER,
'JWT_AUTH_HEADER_PREFIX': 'Bearer',
'JWT_ALLOW_REFRESH': True,
}
VIEWS.PY
class TestsViewSet(ModelViewSet):
queryset = Job.objects.all()
serializer_class = JobsSerializer
renderer_classes = (JSONRenderer, )
http_method_names = ['get']
SETTINGS.PY
Django==1.11.21
django-cors-headers==3.0.0
djangorestframework==3.9.4
djangorestframework-jwt==1.11.0
DEBUG
включен, это должно привести к появлению кода ошибки более 500, должно быть какое-то сообщение об ошибке. - person Nikita Tonkoskur   schedule 24.06.2019