gpt4 book ai didi

django - 带有 DRF 的带有 cookie 的 Nuxt 身份验证

转载 作者:行者123 更新时间:2023-12-05 04:53:24 26 4
gpt4 key购买 nike

我正在尝试使用 cookie 而不是本地存储在我的前端(用 NuxtJS 编写)上实现身份验证。

我正在使用 nuxt-auth 包,配置如下:-

auth: {
strategies: {
cookie: {
token: {
required: false,
type: false,
},
user: {
property: false,
},
endpoints: {
login: {
url: '/auth/token/login/',
},
user: {
url: '/auth/users/me/',
method: 'get',
},
logout: {
url: '/auth/token/logout',
},
},
},
local: false,
},
}

我的后端是带有 rest 框架的 django 和带有以下配置的 djoser:-

DJOSER = {
'CREATE_SESSION_ON_LOGIN': True
}

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.SessionAuthentication'
),
}

当我在前端调用 auth 登录方法时,如下所示:-

this.$auth.loginWith('cookie', {
data: this.login,
})

一切都按预期工作。

  1. 前端调用/auth/token/login。
  2. 后端对用户进行身份验证并在浏览器中设置 cookie。
  3. 前端调用/auth/users/me 返回用户数据,前端将 loggedIn 设置为 true。

但是当用户尝试在前端注销时,POST 请求失败,因为未设置 CSRF token 。

HTTP 403: CSRF Failed: CSRF token missing or incorrect.

我已经尝试了各种其他方法来设置这些东西,但似乎都没有更好的效果:-

  1. 使用本地存储。

    • 这不是很安全,不应使用
  2. 使用 TokenAuthentication 而不是 SessionAuthentication

    • nuxt.config.js 看起来像这样:-

    授权:{策略:{曲奇饼: { token :{属性:'auth_token',类型:' token ',},用户:{属性:假的,},端点:{登录: {url: '/auth/token/login/',},用户:{网址:'/auth/users/me/',方法:'获取',},登出: {url: '/auth/token/logout',},},},本地:假的,},

    但是后端正在使用 auth_token 寻找授权的 header 值,并且这不会在请求中发送。

我的处理方式是否正确,或者我还需要做些什么吗?我对这里的前端内容还很陌生,所以无法让它正常工作让我很生气,我真的很感激能得到一些帮助。

最佳答案

对于遇到同样问题的任何人,我已经找到了解决方案。

问题是 axios 中 xsrfHeaderName 的默认值与 django 后端正在寻找的值不匹配。因此,cookie 中的 csrftoken 不会在 HTTP header 中发送。

要修复它,您需要创建一个如下所示的插件:-

export default function ({ $axios }) {
$axios.defaults.xsrfHeaderName = 'X-CSRFTOKEN'
$axios.defaults.xsrfCookieName = 'csrftoken'
}

并将其添加到 nuxt.config.js 的插件部分:-

'~/plugins/axios',

关于django - 带有 DRF 的带有 cookie 的 Nuxt 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66102428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com