【问题标题】:How to use api key authentication by django tastypie? [duplicate]如何使用 django sweetpie 的 api 密钥身份验证? [复制]
【发布时间】:2013-02-03 10:03:05
【问题描述】:

来自美味派教程:

from django.contrib.auth.models import User
from django.db import models
from tastypie.models import create_api_key

models.signals.post_save.connect(create_api_key, sender=User)

教程说:

“Tastypie 包含一个信号函数,可用于自动创建 ApiKey 对象。”

我不知道把这段代码放在哪里,请帮忙。

【问题讨论】:

  • 我把这段代码放在我的 api.py 中。它奏效了!!当我创建新用户时,它会自动生成 api_key。我知道这一点是因为我是通过管理页面完成的。但我不知道如何将 apikey 发送回用户。第二个问题是“当用户从这个应用程序中注销时应该删除客户端的apikey是否正确。并且当他登录时会再次获得相同的apikey
  • 这取决于您的使用情况——但我想不出有多少用例需要在每次用户注销时重新生成 API 密钥。你可能想到session keys
  • 当用户登录时,将通过与User模型中的属性进行比较来检查用户和密码的兼容性。然后把apikey寄回给他。这个说法是真的吗?
  • 我强烈怀疑你想的是session key而不是API key
  • 哦,我误解了 api key 的概念。谢谢你的建议。实际上,Api Key 是用于通过该键识别用户 >

标签: django authentication tastypie


【解决方案1】:

您可以将此代码放在相关应用程序的models.py 文件中。或者,您也可以将其放在您的应用目录下的signals.py 中——记住还要在您的应用的__init__.py 文件中添加import signals

这里代码的作用是通过使用signals,每次创建User,都会自动为该用户[source]创建一个HMAC API密钥:

class ApiKey(models.Model):
    user = models.OneToOneField(User, related_name='api_key')
    key = models.CharField(max_length=256, blank=True, default='')
    created = models.DateTimeField(default=datetime.datetime.now)

    def __unicode__(self):
        return u"%s for %s" % (self.key, self.user)

    def save(self, *args, **kwargs):
        if not self.key:
            self.key = self.generate_key()

        return super(ApiKey, self).save(*args, **kwargs)

    def generate_key(self):
        # Get a random UUID.
        new_uuid = uuid.uuid4()
        # Hmac that beast.
        return hmac.new(str(new_uuid), digestmod=sha1).hexdigest()


def create_api_key(sender, **kwargs):
    """
    A signal for hooking up automatic ``ApiKey`` creation.
    """
    if kwargs.get('created') is True:
        ApiKey.objects.create(user=kwargs.get('instance'))

【讨论】:

  • 好了,现在密钥已经生成了,但是用户如何找回密钥呢?他会永久存储该密钥吗?
  • 糟糕的解决方案,代码中没有导入,而且信号不好用,你可以覆盖保存方法
猜你喜欢
  • 1970-01-01
  • 2011-12-10
  • 2019-09-04
  • 2021-01-22
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-10
相关资源
最近更新 更多