首页 > 解决方案 > 无法使用带有 csrf 令牌的改造从 android 成功调用

问题描述

我是 django 的新手,对 csrf 令牌感到震惊。我正在使用改造从 android 向使用 csrf 保护的 django 服务器发出发布请求。我首先通过发出 get 请求获得了 csrf 令牌,然后我从 POST 请求的正文中传递了这个 csrftoken。但是,我的服务器显示“未设置 CSRF cookie”错误。服务器对来自 POSTMAN 的调用响应良好,但是当我从 android 拨打电话时,出现此错误。我认为我缺少一些简单的东西,但我无法弄清楚。

标签: djangoandroid-studio

解决方案


基于会话的授权通常用于网络应用程序。如果是由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 中实现令牌认证/授权的方式。

欲了解更多信息,请单击此处查看官方文档。


推荐阅读