如何登录? Django TastyPie与ApiKeyAuthentication实际身份验证过程

时间:2012-09-06 08:55:38

标签: django authentication login tastypie

我有一个Adobe Air移动应用程序,通过TastyPie与Django通信。要使用该应用程序,人们必须先注册。因此,他们必须提供他们的电子邮件和密码。之后他们就可以“登录”了。我认为最好的想法是,在输入成功的用户名/密码组合后,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“登录”用户的最佳方式? 并且我的方法是正确和干净的还是你有更好的方法?你有这个案例的例子吗?

提前多多谢谢!

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:1)

好的,我会尝试解释我对这个话题的看法:

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

当您开发API(例如tastypie用法)时,表单中的第二个APIKey是实际的“密码”,因此应根据请求发送的不是用户名和密码,而是用户名和APIKey,这是以其他方式获得的(通常是电子邮件或某种基于网站的UI)。建议通过授权标题发送,而不是通过GET参数发送。

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