6

我有一个通过 TastyPie 与 Django 通信的 Adob​​e Air 移动应用程序。要使用该应用程序,人们必须先注册。因此,他们必须提供他们的电子邮件和密码。之后,他们将能够“登录”。我认为最好的办法是在输入成功的用户名/密码组合后,将 api-key 发送回移动应用程序并将其缓存,这样用户就“登录”了。

如果您认为注册和“登录”用户有更好的方法,请告诉我。

在 Django 内部,我有一个 UserRessource 类,用于在通过 POST 发送数据时注册新用户:

class UserResource(ModelResource):
    class Meta:
        allowed_methods = ['get', 'post']
        queryset = User.objects.all()
        resource_name = 'auth'
        authentication = Authentication()
        authorization = Authorization()
        fields = ['username', 'email']

    def obj_create(self, bundle, request=None, **kwargs):
        username, email, password = bundle.data['username'], bundle.data['password'], bundle.data['password'], 
        try:
            bundle.obj = User.objects.create_user(username, email, password)
        except IntegrityError:
            raise BadRequest('That username already exists')
        return bundle

这很好用。

但现在我正在为实际的登录过程而苦苦挣扎。在我看来,最好通过 GET(和 https)将用户名和密码发送到此资源,如果这些是有效的,则返回用户 api 密钥。但这可能吗?它干净吗?如果您向该资源发送 GET 请求,通常 TastyPie 会显示数据库中当前的所有用户。但我不需要那些数据,所以我可以以某种方式覆盖它。我已经检查了http://django-tastypie.readthedocs.org/en/v0.9.9/resources.html但我没有让它工作。甚至有可能覆盖该行为吗?

所以实际的问题是使用 ApiKeyAuthentication“登录”用户的最佳方式是什么?的方法是正确和干净的还是你有更好的方法?你有这个案例的例子吗

提前非常感谢!

4

2 回答 2

3

我使用的是 BasicAuth,所以可能会略有不同。但我的解决方案基本上是一个需要身份验证的空资源。如果身份验证成功,服务将返回响应代码 200 和经过身份验证的用户,我会覆盖 obj_get_list 并将经过身份验证的用户填入其中。如果凭据错误,服务将返回响应代码 401。

 class LoginResource(ModelResource):
        class Meta:
            allowed_methods = ['get']
            resource_name = 'login'
            include_resource_uri = False
            object_class = User
            authentication = BasicAuthentication()
            authorization = DjangoAuthorization()

        def obj_get_list(self, bundle, **kwargs):
            return [bundle.request.user]
于 2013-11-27T21:58:49.620 回答
1

好的,我将尝试解释我对该主题的看法:

首先,我的美味派页面上的 UserResource 示例有一个重要问题:用户对象不应在任何时候呈现给单个用户,它们应该能够看到他们是自己的“个人资料”或其他任何东西,但从不浏览和查看其他人。当然,这可以通过清除该资源的主要“列表视图”并将 APIKeyAuth 应用于各个配置文件来使用 UserResource 来完成,但我仍然不喜欢 UserResource 的想法。

在开发 API 时的第二种形式(例如使用美味派),APIKey 是实际的“密码”,因此应请求发送的不是用户名和密码,而是用户名和 APIKey,它是通过其他方式获得的(通常是电子邮件或某种基于网站的 UI)。建议通过授权标头而不是在 GET 参数中发送它们。

第三,当我们谈论 API 时,没有登录之类的东西——至少在 RESTFULL API 中没有——它在某种意义上是无连接的,所以你实际上要在每个请求中发送 Authorization 标头。至于问题,是的,您可以覆盖数据。查看 Tastypie 文档中的水合物/脱水循环,以了解它如何呈现内容,如果您有更多问题,请继续提问。

于 2012-09-06T12:00:57.170 回答