如何使用Tastypie ApiKeyAuthentication建立Django会话?

时间:2014-02-17 17:46:22

标签: django tastypie

我想使用Tastypie的ApiKeyAuthentication来验证请求,然后在Django视图中为用户建立会话。我有用户的用户名和api_key。我没有用户的密码。这是我目前的代码:

class ApiKeyPlusWebAuthentication(ApiKeyAuthentication):
    def is_authenticated(self, request, **kwargs):
        isAuthenticated = super(ApiKeyPlusWebAuthentication, self).is_authenticated(request, **kwargs)
        if isAuthenticated:
            print request.user.email
        return isAuthenticated

#login for access from UIWebView
def login_usingApiKeyAuthentication(request):
    auth = ApiKeyPlusWebAuthentication(request)
    if auth.is_authenticated(request):
        print 'authenticated'
        login(request, request.user)
        return redirect(reverse(view_name))
    else:
        print 'NOT authenticated'
        messages.error(request, MESSAGE_INVALID_LOGIN)
        fail_redirect = redirect(reverse('login'))
        return fail_redirect

我收到错误'用户'对象没有属性'后端'。这是因为我没有调用authenticate(用户,密码)。我正在使用Django默认身份验证后端。 在这种情况下,我只有与用户关联的APIKey,并且没有用于身份验证的原始密码。

处理此问题的一种方法可能是创建绕过密码要求的自定义身份验证后端。但是,在settings.py中注册“无密码”身份验证后端似乎很容易导致安全性崩溃。

那么,我如何使用ApiKeyAuthentication然后验证&在Django中登录用户建立会话?

1 个答案:

答案 0 :(得分:0)

我找到了在另一篇文章中设置后端的解决方案。您可以直接在用户对象上设置自定义后端。

from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class PasswordlessAuthBackend(ModelBackend):
    """Log in to Django without providing a password.
    """
    def authenticate(self, username=None):
        try:
            return User.objects.get(username=username)
        except User.DoesNotExist:
            return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

@csrf_exempt
def login_uiwebview(request):
    auth = ApiKeyPlusWebAuthentication(request)
    if auth.is_authenticated(request):
        view_name = request.POST.get('view_name')
        request.user.backend = 'app.views.PasswordlessAuthBackend'
        login(request, request.user)
        return redirect(view_name)
    else:
        print 'NOT authenticated'
        messages.error(request, MESSAGE_INVALID_LOGIN)
        fail_redirect = redirect(reverse('login'))
        return fail_redirect