如何以及在何处生成 CSRF 令牌以通​​过 REST API 向 Django 应用程序发出请求?

Posted

技术标签:

【中文标题】如何以及在何处生成 CSRF 令牌以通​​过 REST API 向 Django 应用程序发出请求?【英文标题】:How and where to generate a CSRF token for to make requests to a Django app through a REST API? 【发布时间】:2014-07-09 00:18:48 【问题描述】:

我有一个 Django 视图 login,它允许我使用来自 android 应用程序的 POST 数据为用户获取会话。它可以工作,因为我设置了 @csrf_exempt 装饰器,但后续请求需要 CSRF 令牌。

如何获取 CSRF 令牌?它应该在我的 Android 应用程序或 Django 应用程序上生成吗?那么如何将它添加到我的请求中呢?

from django.contrib import auth
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt
from rest_framework.renderers import JSONRenderer
from rest_framework.parsers import JSONParser


class JSONResponse(HttpResponse):
    """
    An HttpResponse that renders its content into JSON.
    """
    def __init__(self, data, **kwargs):
            content = JSONRenderer().render(data)
            kwargs['content_type'] = 'application/json'
            super(JSONResponse, self).__init__(content, **kwargs)


@csrf_exempt
def login(request, *args, **kwargs):

    # Login
    username = request.POST.get('username')
    password = request.POST.get('password')

    user = auth.authenticate(username=username, password=password)

    if user is not None:
            if user.is_active:
                    auth.login(request, user)
                    return JSONResponse('success': 1, 'user_id': user.id)
            return JSONResponse('success': 0, 'msg': 'User is not active')
    return JSONResponse('success': 0, 'msg': 'Wrong username and/or password')

【问题讨论】:

【参考方案1】:

Django 文档在这里谈到了这一点:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax

另一种方法是使用像http://www.django-rest-framework.org/api-guide/authentication这样的框架

【讨论】:

我看不到他们在哪里谈论我的问题。是否应该在 Android 应用程序中创建?在那种情况下,它是如何完成的?还是在 Django 应用程序中?在那种情况下,它是如何完成的,以及如何在没有 CSRF 令牌的情况下发出第一个请求? 您应该考虑使用该 REST 框架并使用 TokenAuthentication ,例如:django-rest-framework.org/api-guide/… 这样用户可以将他们的用户名/密码传递给您的服务器并获得一个他们可以用于所有请求进行身份验证的令牌。 假设我正在使用我的登录视图。如何在 Android 端生成 CSRF 令牌? 如果您选择使用@stormlifter 回答的Django-rest-framework,您需要在android 上进行登录/密码验证。如果验证通过,Django 将返回一个带有您将使用的 Token 的 http 标头。 我的登录函数没有返回 csrf 令牌。【参考方案2】:

我必须将装饰器 from django.views.decorators.csrf import ensure_csrf_cookie 添加到我的函数中以使其返回 CSRF 令牌。

【讨论】:

以上是关于如何以及在何处生成 CSRF 令牌以通​​过 REST API 向 Django 应用程序发出请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Laravel 中禁用 CSRF 令牌以及为啥我们必须禁用它?

如何生成和验证 csrf 令牌

如何从 Django 在前端获取 CSRF 令牌以及如何在 Postman 中使用它

PHP CSRF 表单令牌 + 验证建议

如何在 Javascript 生成的 HTML 表单中包含 Django 1.2 的 CSRF 令牌?

如何在不使用 @EnableWebMvcSecurity 的情况下在 spring security / thymeleaf 中自动生成 csrf 令牌