【问题标题】:What is the right way to write a django-piston client?编写 django-piston 客户端的正确方法是什么?
【发布时间】:2010-12-16 05:59:36
【问题描述】:

我已经阅读了很多关于 django-piston 的内容,并使用 to 为我正在开发的应用程序制作 API,但我被世界的客户端挂断了。我已经编写了处理程序和 uri 映射,我可以将 JSON 或 XML 返回到我心中的内容。我被卡住的地方是现在该怎么办。

我的理想结局是让 iPhone 和 Android 客户端消费和返回数据,但我不知道处理身份验证的正确方法。我能想到的最简单的方法是将用户名和密码保存在设备上并用它标记每个请求,最终使用基本身份验证,但这会出错。我已经查看了活塞对 OAuth 的支持,并在 this tutorial 的帮助下使其工作,但这也不是正确的答案。最终,我真的很想在设备上有一个简单的用户名和密码提示,这些将通过 Piston 和 REST 发送到 Django,API 密钥将返回。设备将存储该密钥并用它标记所有后续请求。这感觉是正确的方法,但我不知道该怎么做。任何人都可以指出我正确的方向吗?

【问题讨论】:

    标签: django rest api django-piston


    【解决方案1】:

    您可以编写自己的身份验证模块。这是一个例子:

    class ApiKeyAuthentication(object):
    
        def is_authenticated(self, request):
            auth_string = request.META.get("HTTP_AUTHORIZATION")
    
            if not auth_string:
                return False
    
            key = get_object_or_None(ApiKey, key=auth_string)
    
            if not key:
                request.user = AnonymousUser()
                return False
    
            request.user = key.user
    
            return True
    
        def challenge(self):
            resp = HttpResponse("Authorization Required")
            resp['WWW-Authenticate'] = "Key Based Authentication"
            resp.status_code = 401
            return resp
    

    您需要一个模型来存储 API 密钥到用户的映射:

    class ApiKey(models.Model):
        user = models.ForeignKey(User, related_name='keys')
        key = models.CharField(max_length=KEY_SIZE)
    

    您需要一些方法来生成实际的密钥。这样的事情会起作用(比如,在 ApiKey 模型的 save 方法中:

    key = User.objects.make_random_password(length=KEY_SIZE)
    
    while ApiKey.objects.filter(key__exact=key).count():
        key = User.objects.make_random_password(length=KEY_SIZE)
    

    最后,连接新的身份验证后端:

    # urls.py
    
    key_auth = ApiKeyAuthentication()
    
    def ProtectedResource(handler):
        return resource.Resource(handler=handler, authentication=key_auth)
    
    your_handler = ProtectedResource(YourHandler)
    

    至于将用户名/密码交换为 API 密钥,只需编写一个处理程序,使用 BasicAuthentication 创建并返回新的 ApiKey(用于 request.user)。

    【讨论】:

    • 太棒了。基本上就是我想的那样,所以我感谢你如此具体地拼写出来。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2015-09-13
    • 1970-01-01
    • 2012-03-11
    • 2014-06-26
    相关资源
    最近更新 更多