python - Django Rest 框架 token 认证

标签 python django django-rest-framework

我已阅读 Django Rest 框架指南并完成所有教程。一切似乎都有意义,并且按应有的方式工作。我得到了基本和 session 身份验证的工作。

django rest framework - api guide

但是,我在文档的 token 身份验证部分苦苦挣扎,它有点缺乏或没有像教程那样深入。

django-rest-framework - token authentication

它说我需要为用户创建 token ,但确实说明了 models.py 中的位置?

有人可以为初学者更好地解释一下文档中的 token 身份验证部分吗?

最佳答案

@ian-clelland 已经提供了正确答案。他的帖子中没有提到一些小片段,所以我将记录完整的过程(我使用的是 Django 1.8.5 和 DRF 3.2.4):

  1. 在创建 super 用户之前执行以下操作。否则, super 用户不会创建他/她的 token 。

  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 的表,其中包含以下字段:key(这是 token 值)、created(创建日期时间)、user_id(a引用 auth_user 表的 id 列的外键)

  5. 使用 python manage.py createsuperuser 创建一个 super 用户。现在,使用 select * from authtoken_token; 查看数据库中的 authtoken_token 表,您应该会看到已添加了一个新条目。

  6. 使用 curl 或更简单的替代方法 httpie为了测试对您的 api 的访问,我正在使用 httpie:

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

    就是这样。从现在开始,对于任何 API 访问,您都需要在 HTTP header 中包含以下值(注意空格):

    Authorization: Token your_token_value
    
  7. (可选)如果您提供用户名和密码,DRF 还提供返回用户 token 的功能。您所要做的就是在 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"
    }
    

就是这样!

关于python - Django Rest 框架 token 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14838128/

相关文章:

django - 覆盖 SlugRelatedField 上的 default_error_messages

python - Django Rest Framework 中的空路由

python - python 中的日期时间抛出值错误

python - Django 管理编码错误

django - 在 Django Shell 中获取模型的所有字段

python - 在 Django 中添加多对多

python - DRF 更改自定义操作的默认 View 集的lookup_field

python 验证 Oracle 用户名/密码而不使用 cx_Oracle

python字符串格式化固定宽度

python - 使用 Google App Engine 进行本地 Django 单元测试的 stub