我基于Django REST Framework的原始后端API在没有实施任何安全措施的情况下工作。
现在,我正在实施JWT令牌身份验证过程,但是意识到后端Django端不断出现的问题是,一旦我将“ IsAuthenticated”添加到“ 'DEFAULT_PERMISSION_CLASSES':('rest_framework.permissions。 IsAuthenticated')“,从Django抛出的页面始终是500 Internal Error,而不是401/403 Authenticated Error,我至少可能知道该错误的解决方法。
因此,我希望有人可以帮助我解决该问题。
过去5天,我一直在尝试实施JWT令牌,机器对机器的验证,零用户帐户,并且完全基于令牌授权访问,并且在大多数情况下进行了排序通过Auth0进行前端请求访问过程。
我根据Auth0 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
答案 0 :(得分:1)
我刚刚正式确定了自己的错误,而这显然是一个简单的错误,而错字是主要问题。
我经过了一次细粒度的尝试调试,并尝试使用“ print()”检查可能是问题原因的潜在变量。
最后,我发现关键问题是由于以下原因:
我真诚地相信这是所有开发人员都会犯的错误,因为代码对我来说确实合乎逻辑,所以我一次将明显错过错字错误。
我建议别人,如果像我一样,您正在使用.env文件保留所有这些变量,请使用“ print()”函数,例如“ print(” AUTH0_DOMAIN-- ---:%r“%AUTH0_DOMAIN)”,以测试可能导致代码结果泄漏的问题区域。
根据我的经验,我确实认为在我的情况下抛出500错误是由于服务器无法“回复”结果,因为“ AUTH0_DOMAIN”变量假定提供了网址。以及下面的代码,如下所示:
AUTH0_DOMAIN = os.environ.get('JWT_AUTH0_DOMAIN')
API_IDENTIFIER = os.environ.get('JWT_API_IDENTIFIER')
PUBLIC_KEY = os.environ.get('PUBLIC_KEY')
JWT_ISSUER = os.environ.get('ISSUER')
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 + '/'
显然,上面的代码(由“ AUTH0_DOMAIN”返回“ None”)仍然允许它平稳运行,直到应用了两个关键代码行为止:
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
因此,我的解决方案是,只要在“ AUTH0_DOMAIN”中传递一个有效的URL,整个过程就可以正常运行。
希望这将有助于拯救另一个灵魂,并将他们从我从我的失败中遭受的7天尝试中拯救出来。干杯!