如何在django-rest-framework中使用django.contrib.auth?

时间:2014-10-14 05:54:22

标签: django angularjs authentication django-rest-framework

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

但是,文档中没有说明如何使用rest-framework对用户进行实际身份验证

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

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

问题:

  • 我是否遗漏了django-rest-framework文件,解释了如何进行用户身份验证?

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

  • 如果没有,推荐的方法是什么才能实现这一目标,同时尽量减少车轮的重新发明?

2 个答案:

答案 0 :(得分:0)

假设您有登录视图:

注意:使用此方法,您必须确保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

答案 1 :(得分:0)

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