需要一个使用django-tastypie进行授权的示例

时间:2011-08-31 06:06:39

标签: django tastypie

我对Django和它的生态系统相对较新。我正在使用django-tastypie为我们的移动客户端编写REST api。我已经浏览了网上几乎所有关于如何使用tastypie创建REST接口的例子。但它们都不是特定于从客户端发布数据以及如何授权客户端。

我使用了示例中显示的tastypie.authentication.BasicAuthentication。它打开一个弹出窗口询问用户名和密码,并在浏览器上正常工作。但我不确定,它是否会在移动设备上做同样的事情(具体来说,本机IOS应用程序)。当用户没有使用浏览器而是使用本机应用程序时,如果用户将请求登录如何在他/她的移动设备上显示此弹出窗口,我就不太了解。

我完全迷失了,我真的很感激你的帮助。

2 个答案:

答案 0 :(得分:2)

您可以查看来源并使用例如ApiKeyAuthentication。 你只需要POST用户名和api密钥来验证用户身份。

它看起来像ios应用程序可用。 这是检查代码的一部分。

def is_authenticated(self, request, **kwargs):
    """
    Finds the user and checks their API key.

    Should return either ``True`` if allowed, ``False`` if not or an
    ``HttpResponse`` if you need something custom.
    """
    from django.contrib.auth.models import User

    username = request.GET.get('username') or request.POST.get('username')
    api_key = request.GET.get('api_key') or request.POST.get('api_key')

    if not username or not api_key:
        return self._unauthorized()

    try:
        user = User.objects.get(username=username)
    except (User.DoesNotExist, User.MultipleObjectsReturned):
        return self._unauthorized()

    request.user = user
    return self.get_key(user, api_key)

https://github.com/toastdriven/django-tastypie/blob/master/tastypie/authentication.py#L128 https://github.com/toastdriven/django-tastypie/blob/master/tastypie/authorization.py#L42

答案 1 :(得分:0)

感谢您的帮助。

我使用了@Iurii提到的类似方法。这是我的解决方案。

我写了一个用于处理身份验证的类并覆盖了is_authenticated方法。然后我可以在tastypie资源类的Meta定义中使用这个类。


    from tastypie.authentication import BasicAuthentication
    from tastypie.resources import Resource, ModelResource

    # class for handling authentication
    class MyAuthentication(BasicAuthentication):
        def is_authenticated(self, request, **kwargs):
            # put here the logic to check username and password from request object
            # if the user is authenticated then return True otherwise return False

    # tastypie resource class
    class MyResource(ModelResource):
        class Meta:
            authentication = MyAuthentication()

这将确保访问资源的请求将通过您的身份验证代码。