2013-08-24 264 views
3

我在Django REST框架中的令牌身份验证中遇到了一些问题。从文档我知道它是实现以下事项:Django REST框架身份验证令牌

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? 

任何帮助或导致任何更多的文档/示例将真正帮助我在这里。谢谢!

+0

你得到的错误是什么?它看起来像代码很好。 –

+0

@kroolik本身并不是一个错误。我只是不确定我的理由是什么。 – geekchic

+4

'Token.objects.create(user = <您的用户实例>)为'<您的用户实例>'创建一个标记。你可以在你的视图中插入这个语句,用户请求令牌传递'request.user'来代替'<你的用户instace>'。确保'request.user'是'User'的实例,而不是'AnonymousUser'。 –

回答

1

可以肯定:我们谈论的是由django rest框架提供的令牌认证?

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

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

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

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

  • 创建使用信号处理程序的所有用户令牌(上创建)
  • 在后台创建任务标记(如管理任务,从时间runining时间和创建缺少令牌)
  • 有一个特殊的API端点,将创建令牌点播,与其他用户身份验证方法,授权用户

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

Token(user=user).save() 

现在,谈几点看法:

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

ps python类名应该是单数(用户 - >用户)

+0

使用'urandom'生成令牌确实不安全?我认为一旦产生这些令牌就会保密,这将是一个更大的问题。 我不知道默认的DRF标记是以纯文本形式存储的。如果你使用django-rest-knox并且你的数据库被泄露了,攻击者是否仍然能够通过暴力找到有效的令牌? –

+1

这个实现是加密弱的,这就是为什么从开始ssh使用它自己的实现;理论上甚至现有的django中使用的强大哈希都可能是强制性的,所以是的,这是可能的,质疑需要多少时间才能打破,并且在大多数情况下 - 这一次足以检测,修复和终止所有的令牌 - 肯定这比没有加密更好;我使用jwt令牌(来自许多原因),它非常整洁;仍在等待[HTTP签名](https://datatracker.ietf.org/doc/draft-cavage-http-signatures/)成为TheNewThing – Jerzyk

相关问题