django - 无法使用带有 csrf 令牌的改造从 android 成功调用
问题描述
我是 django 的新手,对 csrf 令牌感到震惊。我正在使用改造从 android 向使用 csrf 保护的 django 服务器发出发布请求。我首先通过发出 get 请求获得了 csrf 令牌,然后我从 POST 请求的正文中传递了这个 csrftoken。但是,我的服务器显示“未设置 CSRF cookie”错误。服务器对来自 POSTMAN 的调用响应良好,但是当我从 android 拨打电话时,出现此错误。我认为我缺少一些简单的东西,但我无法弄清楚。
解决方案
基于会话的授权通常用于网络应用程序。如果是由API支持的 android 应用程序。因此,您可以在Django中使用rest_framework进行基于令牌的授权。在你的 settings.py
INSTALLED_APPS = [
...
'rest_framework',
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication', # <-- And here
],
}
现在将迁移迁移到数据库。
python manage.py 迁移
运行此命令为特定用户生成令牌。
python manage.py drf_create_token <username>
现在将此行添加到urls.py。
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
#Some other urls.
path('api-token-auth/', obtain_auth_token, name='api_token_auth'),
]
使用它,您可以通过使用其用户名和密码来获取任何用户的令牌,只需将它们传递给request body。所以这将是我们受保护的 api。在你的views.py中添加这个基于类的视图
from rest_framework.permissions import IsAuthenticated,AllowAny # <-- Here
from rest_framework.views import APIView
from rest_framework.response import Response
class DemoData(APIView):
permission_classes = (IsAuthenticated,)
def post(self, request):
content = {'data': 'Hello, World!'}
return Response(content)
现在传递一个标头,其 api 名称为“授权”& 值类似于“令牌 5a2b846d267f68be68185944935d1367c885f360 ”
这就是我们在 Django 中实现令牌认证/授权的方式。
推荐阅读
- python - 将 {serve} 元图添加到现有的 TensorFlow 模型
- winapi - 透明窗口上的常用控件?
- reactjs - 使用 axios 无法成功发帖
- appium - 如何在 Android 上找到带有 Appium 的 NativeScript TextField?
- azure - Azure CosmosDB COUNT 消耗大量 RU/s (MongoDB)
- matlab - 具有对数 bin 和归一化的直方图
- java - 如何修复无法创建java虚拟机?
- laravel - laravel 一对多关系模型请使用 Laravel 表单构建器示例
- c# - Xamarin Forms listview 项目显示不正确
- swift - 在我点击单元格后,它通过了我 2 个视图,我该如何解决?