【问题标题】:How to use custom token model in Django Rest Framework如何在 Django Rest Framework 中使用自定义令牌模型
【发布时间】:2014-11-20 15:30:10
【问题描述】:

我想使用 Django Rest Framework 身份验证,但我想为一位用户提供多个令牌。为此,我需要实现自己的 Token 模型,我在 Token 身份验证类中找到了这个:

class TokenAuthentication(BaseAuthentication):
    """
    Simple token based authentication.
    ...
    """

    model = Token
    """
    A custom token model may be used, but must have the following properties.

    * key -- The string identifying the token
    * user -- The user to which the token belongs
    """

但我不知道如何指定此模型。我应该继承TokenAuthentication吗?

【问题讨论】:

    标签: python django rest django-rest-framework


    【解决方案1】:

    settings.py中定义你自己的认证方法:

    REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': (
            'my_project.my_app.authentication.MyOwnTokenAuthentication',
         ),
    }
    

    authentication.py:

    from rest_framework.authentication import TokenAuthentication
    from my_project.my_app.models.token import MyOwnToken
    
    class MyOwnTokenAuthentication(TokenAuthentication):
        model = MyOwnToken
    

    models.py:

    import binascii
    import os
    
    from django.db import models
    from django.utils.translation import ugettext_lazy as _
    from my_project.companies.models import Company
    
    
    class MyOwnToken(models.Model):
        """
        The default authorization token model.
        """
        key = models.CharField(_("Key"), max_length=40, primary_key=True)
    
        company = models.OneToOneField(
            Company, related_name='auth_token',
            on_delete=models.CASCADE, verbose_name="Company"
        )
        created = models.DateTimeField(_("Created"), auto_now_add=True)
    
        class Meta:
            verbose_name = _("Token")
            verbose_name_plural = _("Tokens")
    
        def save(self, *args, **kwargs):
            if not self.key:
                self.key = self.generate_key()
            return super(MyOwnToken, self).save(*args, **kwargs)
    
        def generate_key(self):
            return binascii.hexlify(os.urandom(20)).decode()
    
        def __str__(self):
            return self.key
    

    【讨论】:

    • 但是,如何从视图中调用“MyOwnTokenAuthentication”?
    • @RajuSingh 您不需要向视图添加任何内容,在定义 DEFAULT_AUTHENTICATION_CLASSES 之后,您将 MyOwnTokenAuthentication 定义为中间件函数。然后,在您的 APIViews 上,您可以使用 "self.request.user" 访问经过身份验证的用户。您还可以根据视图定义身份验证: authentication_classes = [MyOwnTokenAuthentication]
    • 在尝试使用此方法时获取'MyOwnToken' object has no attribute 'user'。在我看来,它仍然必须与用户连接,对吗?
    【解决方案2】:

    该消息的意思是模型Token 可以与任何其他模型交换,只要它具有属性keyuser。这样,例如,如果您想要一种更复杂的方式来生成令牌密钥,您可以定义自己的模型。

    所以如果你想要一个自定义的 Token 模型,你应该做到以下几点:

    1. rest_framework.authtoken.models 子类化令牌模型。在此处添加您想要的任何自定义行为,但请确保它具有 key 属性和 user 属性。
    2. 将 TokenAuthentication 类从 rest_framework.authentication 子类化。将其 model 属性设置为您的新 Token 模型。
    3. 确保在您想要的任何视图中引用您的新身份验证类。

    【讨论】:

    • 嗨 Jamie,我正在使用 rest_framework.authtoken.models 令牌。我可以看到 3 个字段,它们是 key,created_at 和 user_id。我的问题是如何向该模型添加像 company_id 这样的额外字段?谢谢
    猜你喜欢
    • 2018-07-10
    • 2019-11-29
    • 2019-06-20
    • 2016-10-06
    • 1970-01-01
    • 2021-11-07
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多