Django前后端分离架构下动态获取CSRF Token的方法
本文详解Django在前后端分离场景下如何动态获取CSRF Token。通过自定义视图函数利用get_token接口返回Token,并配置URL路由。针对跨域导致Token失效的问题,建议使用Nginx反向代理统一域名。最后演示如何在Postman中通过Headers正确携带Token以避免403错误。
需求
在常规Django开发中,为防止CSRF攻击,若使用模板渲染页面,Django会自动在请求中注入名为csrftoken的Cookie数据。然而,在前后端分离的项目架构中,由于不依赖Django的模板渲染功能,前端无法直接获取该Cookie,因此需要一种动态获取CSRF Token的机制。
Django 通过 request 请求获取 csfttoken 的方法
from django.middleware.csrf import get_token
def getToken(request):
token=get_token(request)
return HttpResponse(json.dumps({'token':token}), content_type="application/json,charset=utf-8")
利用Django提供的接口可以成功获取csrftoken数据,下文将通过具体示例进行演示。
Django 后端获取 csrftoken 示例
在视图 views.py 设置 getToken 方法
from django.middleware.csrf import get_token
# 获取cstftoken
def getToken(request):
token = get_token(request)
return HttpResponse(json.dumps({'token': token}), content_type="application/json,charset=utf-8")
在 urls.py 配置URL
from django.urls import path, re_path
from . import views
urlpatterns = [
# ex:/assetinfo/getToken
path('getToken', views.getToken, name='getToken'),
...
]
使用 postman 测试接口,获取 csrftoken
上述步骤实现了基本功能,能够动态获取csrftoken。但需注意,若涉及跨域请求,直接获取csrftoken可能会失效。
尝试在Django中配置跨域返回Token的方式并不可行,因为不同域名下使用的csrftoken与原始防止CSRF攻击的设计初衷相悖。
最佳解决方案是使用Nginx作为本机代理,分别对前端和后端服务进行反向代理,并统一提供一个域名。这样即可正常使用csrftoken机制。
在 postman 设置使用 csrftoken
若要在Postman中使用csrftoken,只需将获取到的csrftoken值设置到请求的Headers中,具体配置如下:
{"X-CSRFToken":"K6q7uqt9J8UocELWR04pw2DKd8T2LRNWjf2uQvsFBWm87Q1lJZQV1vj3pR8REzCR"}
若不设置该Header,请求将会被拒绝并返回403错误,具体报错信息如下:
到此这篇关于Django前后端分离csrf token获取方式的文章就介绍到这了,更多相关Django csrf token获取内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









