2015-01-21 48 views
5

我正在开发一个项目,为移动设备启用django rest框架身份验证。我正在使用默认的令牌认证来从发送用户名和密码的发布请求中获取用户令牌。Django rest框架:使用电子邮件获取身份验证令牌,而不是用户名

curl --data "username=username&password=password" http://127.0.0.1:8000/api/api-token-auth/ 

(API/API-令牌-AUTH /与obtain_auth_token视图配置的URL)

urlpatterns = [ 
    url(r'^api/api-token-auth/', obtain_auth_token), 
    url(r'^', include(router.urls)), 
] 

和响应是用户令牌。

{"token":"c8a8777aca969ea3a164967ec3bb341a3495d234"} 

我需要使用邮箱密码而不是用户名密码,或两者都获得用户令牌认证。我正在阅读自定义身份验证文件http://www.django-rest-framework.org/api-guide/authentication/#custom-authentication ......但真的,我不是很清楚。 这对我很有帮助......谢谢:)。

+0

哟哟你的应用程序已经有使用电子邮件和密码登录的方法吗?或者这是您为应用程序实施的第一种身份验证方法? – 2015-01-21 02:02:57

+0

嗨...是第一种身份验证方法,我以前没有实现过其他...现在我使用默认的获取令牌方法,使用用户名和密码......但是,在移动设备中,我需要获取令牌使用电子邮件和密码验证。 – 2015-01-21 02:07:03

回答

19

好吧,我发现得到使用电子邮件或用户名的身份验证令牌的方式......这是串行:

class AuthCustomTokenSerializer(serializers.Serializer): 
    email_or_username = serializers.CharField() 
    password = serializers.CharField() 

    def validate(self, attrs): 
     email_or_username = attrs.get('email_or_username') 
     password = attrs.get('password') 

     if email_or_username and password: 
      # Check if user sent email 
      if validateEmail(email_or_username): 
       user_request = get_object_or_404(
        User, 
        email=email_or_username, 
       ) 

       email_or_username = user_request.username 

      user = authenticate(username=email_or_username, password=password) 

      if user: 
       if not user.is_active: 
        msg = _('User account is disabled.') 
        raise exceptions.ValidationError(msg) 
      else: 
       msg = _('Unable to log in with provided credentials.') 
       raise exceptions.ValidationError(msg) 
     else: 
      msg = _('Must include "email or username" and "password"') 
      raise exceptions.ValidationError(msg) 

     attrs['user'] = user 
     return attrs 

在EMAIL_OR_USERNAME领域,用户可以发送电子邮件或用户名,使用功能validateEmail(),我们可以检查用户是否尝试使用电子邮件或用户名登录。然后,我们可以查询获取用户实例是否有效,并对其进行身份验证。

这是视图。

class ObtainAuthToken(APIView): 
    throttle_classes =() 
    permission_classes =() 
    parser_classes = (
     parsers.FormParser, 
     parsers.MultiPartParser, 
     parsers.JSONParser, 
    ) 

    renderer_classes = (renderers.JSONRenderer,) 

    def post(self, request): 
     serializer = AuthCustomTokenSerializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     user = serializer.validated_data['user'] 
     token, created = Token.objects.get_or_create(user=user) 

     content = { 
      'token': unicode(token.key), 
     } 

     return Response(content) 

然后:

curl --data "email_or_username=emailorusername&password=password" http://127.0.0.1:8000/api/my-api-token-auth/. 

这是准备好了。

+0

你好!我试过你的解决方案,但它抱怨方法validateEmail和身份验证丢失。你能分享一下缺少的代码吗?谢谢! – 2016-09-24 12:52:53

1

有一个更清晰的方式来获取用户令牌。

只需运行manage.py壳

然后

from rest_framework.authtoken.models import Token 
from django.contrib.auth.models import User 
u = User.objects.get(username='admin') 
token = Token.objects.create(user=u) 
print token.key 
2

写这些要求到你的settings.py

ACCOUNT_AUTHENTICATION_METHOD = 'email' 
ACCOUNT_EMAIL_REQUIRED = True 
ACCOUNT_USERNAME_REQUIRED = False 

要检查,发送此JSON格式的请求到服务器:

{ 
    "username":"[email protected]", 
    "password":"Pa$$w0rd" 
} 
+0

它是DRF设置还是设置的全局部分。 – 2017-12-15 01:13:40

相关问题