如何在登录过程中生成rest_framework_jwt token
Posted
技术标签:
【中文标题】如何在登录过程中生成rest_framework_jwt token【英文标题】:how to generate rest_framework_jwt token in the login process 【发布时间】:2018-04-28 11:11:20 【问题描述】:我正在尝试实现 django-rest-framework-jwt 进行身份验证。我做了所有 jwt 教程所说的(添加设置、url 和 curl 测试)。我确实在可浏览的 api 中使用127.0.0.1:8000/api/auth/token/
成功获取了令牌。
但我没有得到的是如何在登录过程中生成令牌。我的猜测可能是在 LoginSerializer 中生成它? (或者我误解了这个概念!)
这是我所拥有的:
# settings.py
REST_FRAMEWORK =
'DEFAULT_RENDERER_CLASSES': (
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
# project/urls.py
url(r'^api/auth/token/', obtain_jwt_token),
登录序列化器并查看:
class UserLoginSerializer(ModelSerializer):
token = CharField(allow_blank=True, read_only=True)
class Meta:
model = User
fields = ('username', 'password', 'token')
def validate(self, data):
username = data.get('username',None)
password = data['password']
user = authenticate(username=username, password=password)
if not user or not user.is_active:
raise ValidationError("Invalid username/password.")
# generate jwt token ??
# data['token'] = generated jwt token??
return data
class UserLoginAPIView(APIView):
permission_classes = [AllowAny]
serializer_class = UserLoginSerializer
def post(self, request, *args, **kwargs):
data = request.data
serializer = UserLoginSerializer(data=data)
if serializer.is_valid(raise_exception=True):
new_data = serializer.data
return Response(new_data, status=HTTP_200_OK)
return Response(serializer.errors, status=HTTP_400_BAD_REQUEST)
那我该怎么办?
【问题讨论】:
【参考方案1】:这就是我所做的。
from rest_framework_jwt.settings import api_settings
class LoginView(APIView):
'''
Post call for user login.
'''
def post(self, request, format=None):
serializer = LoginSerializer(data=request.data)
if serializer.is_valid():
# Check if user has valid credentials and return user instance else None
user = authenticate(username=serializer.validated_data['username'],
password=serializer.validated_data['password'])
if user is not None:
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return Response('msg':'Login successful', 'token': token, 'is_login_success': True, status=status.HTTP_200_OK)
else:
return Response('msg': 'Credentials are not valid!', status=status.HTTP_400_BAD_REQUEST)
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
但您不必这样做,因为您的 127.0.0.1:8000/api/auth/token/
所做的几乎完全相同,除非您想在登录前记录一些内容。
如果您想了解更多关于obtain_jwt_token
视图如何工作的信息,JSONWebTokenSerializer
将为您提供帮助。
【讨论】:
以上是关于如何在登录过程中生成rest_framework_jwt token的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Zend Framework 中生成用于重置密码的随机密码或临时 URL?