我正在尝试创建自定义令牌身份验证端点,该端点在请求POST中接受电话号码,令牌和状态,然后按如下所示响应
成功的响应应创建一个链接到用户对象的状态对象
失败请求可以是未授权请求,也可以是基于身份验证令牌/电话的错误请求 数字组合。
为此,我编写了以下代码片段:
serializers.py
class TokenSerializer(serializers.Serializer):
phone_number = serializers.CharField(required=True, allow_blank=False)
def validate(self, attrs):
phone_number = attrs.get('phone_number')
user = authenticate(request=self.context.get('request'),phone_number=phone_number)
if user is None:
msg = ('Unable to log in with provided credentials.')
raise serializers.ValidationError(msg, code='authorization')
else:
msg = ('Must include "phone_number.')
raise serializers.ValidationError(msg, code='authorization')
attrs['user'] = user
return attrs
views.py
class TokenView(APIView):
serializer_class=TokenSerializer
authentication_classes = (CustomTokenAuthentication, )
def post(self, request, *args, **kwargs):
serializer = self.serializer_class(data=request.data,
context={'request': request})
serializer.is_valid(raise_exception=True)
new_data = serializer.data
user = serializer.validated_data
login(request,user)
token, created = Token.objects.get_or_create(user=user)
return Response({
'user':new_data,
'token':token.key
})
authbackend.py:
class CustomTokenAuthentication(TokenAuthentication):
def authenticate_credentials(self, key,phone_number):
try:
user = UserProfile.objects.get(phone_number=username)
return user
except ObjectDoesNotExist:
# Run the default password hasher once to reduce the timing
# difference between an existing and a non-existing user (#20760).
raise exceptions.AuthenticationFailed('Invalid phone ')
try:
token = self.model.objects.get(key=key)
except self.model.DoesNotExist:
raise exceptions.AuthenticationFailed('Invalid token')
return (token.user, token)
尝试登录时出现此错误:
/ token / 处的TypeError
无法将请求转换为电话号码。
请求方法:POST
要求网址:http://127.0.0.1:8000/token/
Django版本:2.1.5
异常类型:TypeError
异常值:
无法将请求转换为电话号码。
异常位置:to_python,第107行中的/usr/local/lib/python3.6/dist-packages/phonenumber_field/phonenumber.py
Python可执行文件:/ usr / bin / python
的Python版本:3.6.7
Python路径:
['/ home / zynaboo / Desktop / dev / Customers',
'/usr/lib/python36.zip',
'/usr/lib/python3.6',
'/usr/lib/python3.6/lib-dynload',
'/home/zynaboo/.local/lib/python3.6/site-packages',
'/usr/local/lib/python3.6/dist-packages',
'/ usr / lib / python3 / dist-packages']
服务器时间:周二,2019年9月17日16:48:01 +0000
请帮忙吗?预先感谢