【问题标题】:How to use django.contrib.auth with django-rest-framework?如何将 django.contrib.auth 与 django-rest-framework 一起使用?
【发布时间】:2014-12-08 19:37:42
【问题描述】:

django-rest-framework 使用django.contrib.auth 进行身份验证和授权(如django-rest-framework authentication api guide 中所述)

但是,文档中没有任何地方提到用户是如何使用 rest-framework 进行实际身份验证的

默认情况下,django.contrib.auth 视图将响应服务器端呈现的登录表单。

但是,如果使用诸如 AngularJs 之类的客户端框架,则不需要这样做 - 您只需要一个可以进行身份​​验证的 api 端点。

问题:

  • 我是否缺少 django-rest-framework 文档来解释用户身份验证是如何开箱即用的?

  • 是否存在开箱即用的解决方案?

  • 如果不是,建议采用什么方法来实现这一目标,同时对车轮进行最少的改造?

【问题讨论】:

标签: django angularjs authentication django-rest-framework


【解决方案1】:

在 API 端点对自己进行身份验证时,您通常不会通过登录表单 - 您可以使用 API 令牌或通过标头发送身份验证凭据,请参阅 How to use Basic Auth with jQuery and AJAX? 了解如何执行此操作。

【讨论】:

    【解决方案2】:

    假设您有登录视图:

    注意:使用此方法您必须确保 SSL/TLS,因为用户名和密码以纯文本形式发送。

    import json
    import requests
    
    def login(request):
        if request.method == "POST":
            username = request.POST['username']
            password = request.POST['password']
            login_url = 'http://your_url:port/rest-api/login/'
            response = requests.post(login_url, data={'username': username, 'password': password})
            response = json.loads(response.text)
            if response.status_code == 200:
                return render_to_response("login.html", {"success": True}, RequestContext(request))
    

    你在 rest-api 中的看法:

    from django.contrib.auth.backends import ModelBackend as DjangoModelBackend
    
    def login(request):
        response = base_response.copy()
        username = request.DATA.get('username', '')
        password = request.DATA.get('password', '')
    
        user = DjangoModelBackend().authenticate(username=email, password=password)
        if user is not None:
            response["message"] = "Authenticated"
        else:
            response["message"] = "Login Failed"
    
        return Response(response)
    

    这里是ModelBackend的部分

    from django.contrib.auth import get_user_model
    
    class ModelBackend(object):
    
    def authenticate(self, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        if username is None:
            username = kwargs.get(UserModel.USERNAME_FIELD)
        try:
            user = UserModel._default_manager.get_by_natural_key(username)
            if user.check_password(password):
            return user
        except UserModel.DoesNotExist:
            return None
    

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2012-08-02
      • 2018-03-23
      • 2016-08-27
      • 2013-02-16
      • 1970-01-01
      • 2018-07-13
      • 2017-03-18
      • 2016-05-30
      相关资源
      最近更新 更多