Django的REST框架令牌认证(Django Rest Framework Token Auth

2019-07-19 19:13发布

我已阅读Django的REST框架指南和做所有的教程。 一切似乎都有道理,如何它应该只是工作。 我得到了基本和会话认证工作的描述。 http://django-rest-framework.org/api-guide

不过,我与文档的令牌认证部分挣扎,它有点欠缺或不进入尽可能多的深度的教程。
http://django-rest-framework.org/api-guide/authentication/#tokenauthentication

它说,我需要为用户创建令牌,但确实状态,在models.py?

我的问题是:

有人可以解释的文档好一点的第一个计时器的令牌认证的一部分?

Answer 1:

不,不是在你的models.py -对事物的模型方面,所有你需要做的是包括适当应用( rest_framework.authtoken你) INSTALLED_APPS 。 这将提供一个令牌模型这是国外键控到用户。

你需要做的是决定何时以及如何应生成的令牌对象。 在您的应用程序,并每一位用户自动获得一个令牌? 或者只有某些授权用户? 或者,只有当他们特别要求吗?

如果每个用户都应该始终有一个令牌,有你链接到页面上的代码片段展示了如何建立一个信号时,自动创建它们:

@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)

(把这种在一个models.py文件,在任何地方,它会被注册,当一个Django线程启动)

如果令牌只能在特定的时间被创建,然后在您的视图代码,你需要创建并保存令牌在适当的时候:

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

一旦令牌创建(并保存),这将是用于认证使用。



Answer 2:

@伊恩 - clelland已经提供了正确的答案。 有只是没有在他的文章中提到了几小片,所以我要记录下全过程(我使用Django 1.8.5和3.2.4 DRF):

  1. 创建超级用户做以下事情。 否则,超级用户并没有得到他/她的令牌创建的。

  2. 转到settings.py中添加以下内容:

     INSTALLED_APPS = ( 'rest_framework', 'rest_framework.authtoken', 'myapp', ) REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ) } 
  3. 添加在MYAPPmodels.py如下代码:

     from django.db.models.signals import post_save from django.dispatch import receiver from rest_framework.authtoken.models import Token from django.conf import settings # This code is triggered whenever a new user has been created and saved to the database @receiver(post_save, sender=settings.AUTH_USER_MODEL) def create_auth_token(sender, instance=None, created=False, **kwargs): if created: Token.objects.create(user=instance) 

    另外,如果你想更明确,创建一个名为下MyApp项目signals.py文件。 把上面的代码中,然后在__init__.py,import signals

  4. 打开一个终端窗口,浏览到您的项目目录,并输入以下命令:

     python manage.py migrate python manage.py makemigrations 

    拿在你的数据库一看,一台名为authtoken_token应具有以下字段创建:键(这是令牌值),创建(日期时间它被创造),USER_ID(引用AUTH_USER表的id列的外键)

  5. 创建一个具有超级用户python manage.py createsuperuser 。 现在,花与你的数据库看看authtoken_tokenselect * from authtoken_token; ,你应该会看到一个新的条目已被添加。

  6. 使用curl或更简单的替代httpie测试访问您的API,我使用httpie:

     http GET 127.0.0.1:8000/whatever 'Authorization: Token your_token_value' 

    而已。 从现在起,任何API的访问,你需要包含在HTTP标头( 注意空格 )以下值:

     Authorization: Token your_token_value 
  7. (可选)DRF还规定,如果你提供的用户名和密码返回用户的令牌的能力。 所有您需要做的是包括在urls.py如下:

     from rest_framework.authtoken import views urlpatterns = [ ... url(r'^api-token-auth/', views.obtain_auth_token), ] 

    使用httpie验证:

     http POST 127.0.0.1:8000/api-token-auth/ username='admin' password='whatever' 

    在返回的身体,你应该看到这一点:

     { "token": "blah_blah_blah" } 

而已!



Answer 3:

只是我的两分钱添加到这一点,如果你已经得到了处理用户的创建(和激活),您还可以像这样执行此任务自定义用户管理:

from rest_framework.authtoken.models import Token
# Other imports

class UserManager(BaseUserManager):

    def create_user(self, **whatever_else):
        """
        This is your custom method for creating user instances. 
        IMHO, if you're going to do this, you might as well use a signal.

        """
        user = self.model(**whatever_params)
        .... #Method ramblings that somehow gave us a user instance
        Token.objects.create(user=user)

    #You may also choose to handle this upon user activation. 
    #Again, a signal works as well here.

    def activate_user(**activation_ramblings):
        .... #Method ramblings that somehow gave us a user instance
        Token.objects.create(user=user)

如果您已经创建的用户,那么你可能会向下拖放到你的终端蟒蛇壳为你的数据库的所有用户创建令牌。

>>>from *whatever import User
>>>from rest_framework.authtoken.models import Token 
>>>for user in User.objects.all():
>>>...    Token.objects.create(user=user)

这一切,她写的人! 希望可以帮助别人。



Answer 4:

在Django的1.8.2和以下所有上述的REST框架3.3.2是不够的,使基于令牌的认证。

虽然在Django配置文件中指定REST_FRAMEWORK设置,需要基于函数的观点@api_view装饰:

from rest_framework.decorators import api_view

@api_view(['POST','GET'])
def my_view(request):
    if request.user.is_authenticated():
       ...

否则,没有令牌认证全部执行



Answer 5:

有一个更清洁的方式来获取用户令牌。

只需运行manage.py壳

然后

from rest_framework.authtoken.models import Token
from django.contrib.auth.models import User
u = User.objects.get(username='admin')
token = Token.objects.create(user=u)
print token.key

然后记录应表中找到DB_Schema.authtoken_token



Answer 6:

在这里除了出色的答案,我想提一个更好的方法来令牌认证:JSON网络令牌认证。 所提供的实施http://getblimp.github.io/django-rest-framework-jwt/是非常容易使用。

其优点是更详细地解释这个答案 。



文章来源: Django Rest Framework Token Authentication