【问题标题】:Tastypie APIKey authenticationTastypie APIKey 认证
【发布时间】:2012-09-18 21:07:35
【问题描述】:

Tastypie APIKey 身份验证如何工作?我知道文档中提到了一个信号:

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)

但是,这是什么时候调用的?如果我想给用户他们的 APIkey,我知道我可以在 APIKey db 中找到它,这个 create_api_key 函数将密钥添加到其中,但是我应该在何时何地调用这个 models.signals.post_save 函数?

这只是另一个 django 模型吗?我认为是?

每次保存用户帐户时都会调用它吗?

【问题讨论】:

    标签: django tastypie api-key


    【解决方案1】:

    您可以将其放入相关应用程序的models.py 文件中(例如main/)。 post_save.connect(create_api_key, sender=User) 所做的是每次保存User 实例时,都会调用create_api_key()

    现在让我们通过深入了解tastypie 的源代码来了解create_api_key() 的作用:

    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'))
    

    如您所见,create_api_key() 将创建一个新的ApiKey 记录,该记录将与调用User 相关。此记录在保存到ApiKey 表时也将有一个HMAC 键。密钥由generate_key()函数生成。

    【讨论】:

    • 太棒了……谢谢。因此,如果我更改用户的帐户信息,那么 api 密钥也会更改(比如密码已更改)?
    • 不,API key 只会在新的用户记录为 created: docs.djangoproject.com/en/dev/ref/signals/#post-save 时创建。基本上,当创建新的User 记录时,会向create_api_key() 发送created=True 参数,更新User 不会设置created=True,因此不会触发ApiKey 创建。
    • 我不清楚这一点,那么您可以为现有用户传递 create_api_key 吗?如果不是,您如何为现有用户创建一个?
    • @Dave 我不确定你的第一个问题是什么意思,但是 create_api_key 是一个不会通过更新现有用户调用的信号,如果这回答了你的问题。第二个,快速(和可能很脏)的方式是为所有没有密钥的用户编写一个简单的脚本,以便为他们generate_key并将其存储到他们所在行的ApiKey表中。
    猜你喜欢
    • 1970-01-01
    • 2012-07-18
    • 2012-08-09
    • 2013-10-26
    • 2014-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多