Django REST框架验证令牌

时间:2013-08-24 07:18:13

标签: python django rest

我在Django REST Framework中使用令牌身份验证时遇到了一些麻烦。从我知道的文档来看,这是实现以下内容的问题:

from rest_framework.authtoken.models import Token

token = Token.objects.create(user=...)
print token.key

现在我的问题是,Token.objects.create(user=...)的论点到底是什么。答案here会有所帮助,并且它会显示这将提供一个外键键入用户的令牌模型。我不确定我是否理解这一点。

我有自己的用户模型,如下所示:

class Users(models.Model):
    userid = models.IntegerField(primary_key=True)
    username = models.CharField(max_length=255L, unique=True, blank=True)
    email = models.CharField(max_length=255L, unique=True, blank=True)
    password = models.CharField(max_length=64L, blank=True)
    registeredip = models.CharField(max_length=255L, blank=True)
    dob = models.DateField(null=True, blank=True)
    firstname = models.CharField(max_length=255L, blank=True)
    lastname = models.CharField(max_length=255L, blank=True)
    joindate = models.DateTimeField()

    class Meta:
        db_table = 'Users'

在这种情况下,如何为满足特定条件的用户创建令牌?

# View Pseudocode
from rest_framework.authtoken.models import Token

def token_request(request):
    if user_requested_token() and token_request_is_warranted():
        new_token = Token.objects.create(user=request.user) #What goes here?

任何帮助或指向更多文档/示例都会对我有所帮助。谢谢!

1 个答案:

答案 0 :(得分:2)

可以肯定:我们正在谈论由django rest framework提供的令牌认证?

如果是这样,这是一种非常简单的方法,其中有一个令牌(随机40个字符),而不是用户名和密码。

什么是DRF投放是一个表格(Token),您需要为用户创建条目,Token引用您的用户模型(内置或活动自定义模型)。

最初没有创建令牌,您需要创建它们。

有几种创建令牌的方法,最常见的是:

  • 使用信号处理程序(在创建时)为所有用户创建令牌
  • 在后台任务中创建令牌(例如管理任务,不时运行并创建丢失的令牌)
  • 有一个特殊的api端点,它将按需创建令牌,并使用其他用户身份验证方法来授权用户

基本上,这意味着您需要在代码中的某个位置创建Token实例,引用您的用户实例。

Token(user=user).save()

现在,几句评论:

  • 这种令牌的实现相当简陋,例如您没有任何使令牌过期的选项,唯一的方法是重新生成令牌 - 如果您想要过期的会话和/或多个客户端(请记住 - 每个用户一个令牌,而不是浏览器/会话/设备),这可能会有问题。
  • 使用差的随机函数创建令牌
  • 令牌以纯文本格式存储在数据库中
  • 有多个软件包可以提供更好,更安全的令牌实现,最先进的是django-rest-framework-jwtdjango-rest-knox(第二个更简单)

P.S。 python类名应该是单数(Users-> User)