在 Django 中使用 JWT 进行身份验证
Posted
技术标签:
【中文标题】在 Django 中使用 JWT 进行身份验证【英文标题】:Authentication using JWT in Django 【发布时间】:2016-12-16 15:01:50 【问题描述】:我想要做的是使用 JWT 对我的 Django 项目进行身份验证。 首先,我很困惑我必须安装哪个库,一个是 django-jwt-auth,另一个是 djangorestframework-jwt。
这是我的views.py,其中我有一个用户模型,我想在生成新用户时进行身份验证。
class UserDetails(APIView):
def get(self, request, *args, **kwargs):
users = Users.objects.all().order_by('-created_at')
serializer = UserSerializer(users, many=True)
return Response(serializer.data)
def options(self, request, *args, **kwargs):
return Response()
def post(self, request, *args, **kwargs):
serializer = UserSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(status=HTTP_201_CREATED)
return Response(status=HTTP_400_BAD_REQUEST)
我有models.py
class Users(models.Model):
group_id = models.IntegerField()
name = models.CharField(max_length=100, null=True)
email = models.CharField(max_length=100, null=True)
password = models.CharField(max_length=255, null=False)
remember_token = models.CharField(max_length=255, null=True)
activated = models.IntegerField(default=1)
banned = models.IntegerField(default=0)
ban_reason = models.CharField(max_length=255, null=True)
otp = models.CharField(max_length=255, null=True)
created_at = models.DateTimeField()
updated_at = models.DateTimeField(null=True)
我的 url.py
urlpatterns = [
url(r'^api-token-auth/', 'rest_framework_jwt.views.obtain_jwt_token'),
url(r'userdetails/$', UserDetails.as_view()),
现在我不知道如何访问该 api-token-auth。在views.py中放置身份验证的位置
以及我应该在哪里添加这些设置
JWT_ENCODE_HANDLER = 'jwt_auth.utils.jwt_encode_handler'
JWT_DECODE_HANDLER = 'jwt_auth.utils.jwt_decode_handler',
JWT_PAYLOAD_HANDLER = 'jwt_auth.utils.jwt_payload_handler'
JWT_PAYLOAD_GET_USER_ID_HANDLER = 'jwt_auth.utils.jwt_get_user_id_from_payload_handler'
JWT_SECRET_KEY: SECRET_KEY
JWT_ALGORITHM = 'HS256'
JWT_VERIFY = True
JWT_VERIFY_EXPIRATION = True
JWT_LEEWAY = 0
JWT_EXPIRATION_DELTA = datetime.timedelta(seconds=300)
JWT_ALLOW_REFRESH = False
JWT_REFRESH_EXPIRATION_DELTA = datetime.timedelta(days=7)
JWT_AUTH_HEADER_PREFIX = 'Bearer'
有些帖子说我必须在我的 settings.py 中这样做
REST_FRAMEWORK =
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
那么请告诉我如何使用 JWT。
【问题讨论】:
【参考方案1】:-
你应该安装
djangorestframework-jwt
按照步骤here
将此装饰器添加到您想要身份验证的函数中(更改适合您使用的方法的 GET,如果您希望无需身份验证即可访问视图,请将 AllowAny 添加到 DEFAULT_AUTHENTICATION_CLASSES)
@api_view(['GET'])
@permission_classes((IsAuthenticated, ))
使用用户名和密码拨打api-token-auth/
获取令牌
Authorization: JWT <your_token>"
所有设置都必须添加到settings.py
文件中,如here 所述
我看到您的 User
模型没有扩展 AbstractUser
或 BaseUser
模型。如果您想将 JWT auth 与 Django 一起使用,以这里描述的简单方式,您的 User
模型应该扩展其中一个模型(我建议使用 AbstractUser)。因此,Django 将为您管理所有的身份验证工作。
【讨论】:
以上是关于在 Django 中使用 JWT 进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
JWT 身份验证:使用 UI 令牌对 Graphene/Django (GraphQL) 查询进行身份验证?
在测试期间使用 Django Rest + JWT 进行身份验证
如何在 graphene-django GraphQLTestCase 中使用 django-grahql-jwt 进行身份验证?