【问题标题】:Can anyone give a better explanation of Authorization and Authentication of Django tasty pie?谁能更好地解释 Django 美味派的授权和身份验证?
【发布时间】:2012-10-03 16:28:07
【问题描述】:

我在创建一个非常简单的东西时有点卡住了 - 一个新用户。

我脑海中的工作流程是这样的:用户使用 api 密钥发送查询。检查用户是否存在。如果没有,请创建用户。

这是我的 UserSignUpResource:

   class UserSignUpResource(ModelResource):

        class Meta:
            object_class = User
            queryset = User.objects.all()
            allowed_methods = ['post']
            include_resource_uri = False
            resource_name = 'newuser'
            excludes = ['is_active','is_staff','is_superuser']
            authentication = ApiKeyAuthentication()
            authorization = DjangoAuthorization()
            models.signals.post_save.connect(create_api_key, sender=User)

        def obj_create(self,bundle,request=None,**kwargs):
            try:
                bundle = super(UserSignUpResource, self).obj_create(bundle,request,**kwargs)
                bundle.obj.set_password(bundle.data.get('password'))
                bundle.obj.save()
            except IntegrityError:
                raise BadRequest('The username already exists')
            return bundle
    def apply_authorization_limits(self,request,object_list):
        return object_list.filter(id=request.user.id,is_superuser=True)

我的 api 调用:

curl -v -X POST -d '{"username" : "puck", "password" : "123456"}' -H "Authorization: ApiKey puck:link" -H "Content-Type: application/json" http://127.0.0.1:8000/api/v1/newuser/

我收到 401 错误。那正是因为我不知道如何创建 API 密钥以便我可以使用它来创建新用户。

我可以在 django admin 中看到一个 api 列,但它只允许我为每个用户创建一个 api 密钥。 因此,这是如何工作的?我如何使它工作?

关于教程的信息很少。几乎没有任何关于它的博客。你能帮忙的话,我会很高兴。我挣扎得很厉害。

【问题讨论】:

    标签: django tastypie


    【解决方案1】:

    您可以使用以下方法创建 ApiKey:

    ApiKey.objects.create(user=user)
    

    (您也可以通过管理界面进行操作,但请注意,保存空内联实际上不会保存它,即:更改 api 键内联的日期/时间字段)。

    拥有 api_key 后,这应该可以工作:

    curl -v -X POST -d '{"username" : "puck", "password" : "123456"}' -H "Content-Type: application/json" http://127.0.0.1:8000/api/v1/newuser/?username=user&api_key=API_KEY
    

    【讨论】:

    • 但这不是:models.signals.post_save.connect(create_api_key, sender=User) 就像一个信号来创建一个 api 密钥吗?
    • 根据您使用的tastepie版本,信号是否自动注册。查看此变更集:github.com/toastdriven/django-tastypie/commit/…
    • 我终于熬过来了。对我自己的身份验证进行了一些更改并实现了它。如果可以的话,还有一些疑问: 1. 为了使 api 更好一点,我不想在每次调用时都发送标头。那可能吗? 2. 使用相同的 obj_create 如何让它为登录用户工作?
    • 有一个会话身份验证功能,但我没有任何经验。
    • 是的,我已经彻底阅读了文档。我真的希望有一个正确实施的工作示例。我的代码非常hacky。 API 非常不安全。
    猜你喜欢
    • 1970-01-01
    • 2014-11-13
    • 2013-08-27
    • 2017-07-21
    • 2013-10-06
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多