通过 ngrok 连接时未设置 Cookie

Posted

技术标签:

【中文标题】通过 ngrok 连接时未设置 Cookie【英文标题】:Cookies not set when connected through ngrok 【发布时间】:2020-03-14 17:50:54 【问题描述】:

我正在尝试对我的 django 应用程序使用会话身份验证。当我使用 localhost 地址将前端应用程序连接到本地运行的后端服务器时,浏览器会设置在 Set-Cookie 标头中发送的 cookie(包括 session_id 和 csrf_token ),并且用户能够进行身份验证.但是,当我使用指向同一服务器的 ngrok URL 时,浏览器不会设置 session_id 和 csrf_token cookie,并且用户是 Forbidden ( 403 http response ) 无法访问受保护的端点。

更多上下文:我在前端使用 axios。以及后端带有 DRF 的 django。我正在尝试使用 DRF 的 SessionAuthentication 进行身份验证

Django 设置文件

AUTHENTICATION_BACKENDS = [
    'django.contrib.auth.backends.ModelBackend',
]

REST_FRAMEWORK = 
    'DEFAULT_AUTHENTICATION_CLASSES' : [
        'rest_framework.authentication.SessionAuthentication',
        'knox.auth.TokenAuthentication',
    ]

验证端点

class ProfileAPI(views.APIView):
    serializer_class = ProfileSerializer
    permission_classes = [IsAuthenticated & UserorAdminAccessOnly]

    def get(self, request):
        user = getCorrespondingUser(request)
        profile = Profile.objects.get(user=user)
        serializer = EmergencyFundSerializer(profile)
        self.check_object_permissions(self.request, profile)
        return Response(serializer.data)

【问题讨论】:

【参考方案1】:

修复方法是更改​​ django 发送的默认 SameSite cookie 值,方法是将其添加到设置文件中:

SESSION_COOKIE_SAMESITE = None
CSRF_COOKIE_SAMESITE = None

对于无法识别这些设置的 django 版本,请安装 django-rest-swagger 并重试。

【讨论】:

以上是关于通过 ngrok 连接时未设置 Cookie的主要内容,如果未能解决你的问题,请参考以下文章

来自单击的链接时未加载 PHP Cookie

由于连接被强制终止,使用 ngrok 测试 gRPC 失败

当 webhook 调用通过 MacOS 上的 ngrok 到达时如何让 Xdebug 连接

直接访问登录表单时未设置会话 cookie,导致 CSRF 令牌无效

JWT:未直接访问服务器(localhost:3001/login)时未设置 Cookie(MERN)

使用 React Axios POST 请求时未设置 Express Session Cookie