Noob 身份验证和 nuxt auth cookie 策略有问题。
我的后端是golang,登录成功后设置cookie
http.SetCookie(w, &http.Cookie{
Name: "session_token",
Value: sessionToken,
Path: "/",
HttpOnly: true,
})
看到 httpOnly 存在问题,但这并没有影响我的问题。
我目前的配置最少。
auth: {
strategies: {
cookie: {
endpoints: {
login: { url: "/api/auth/login", method: "post" },
logout: false, // will be implemented
user: false, // will be implemented
},
},
},
},
我的问题是我设置了会话cookie,这意味着它在浏览器关闭后未设置(至少我是这样理解的)。但似乎 nuxt 不在乎是否有 cookie。
登录工作正常 - 我明白了loggedIn: true
。但是当cookie被删除(浏览器关闭后)我仍然登录。
如果ssr: true
我也收到此错误:
[Vue warn]: The client-side rendered virtual DOM tree is not matching server-rendered content. This is likely caused by incorrect HTML markup, for example nesting block-level elements inside <p>, or missing <tbody>. Bailing hydration and performing full client-side render.
和网站挂起。
当cookie不存在时,有没有办法注销用户?或者我应该重新考虑我的方法?
尝试了其他配置选项,例如token.required:true
等。还使用前缀更改 cookie 令牌名称auth.
。但似乎没有任何帮助。
编辑:这是我的身份验证代码:
<template>
<div class="layout">
<form @submit.prevent="userLogin">
<div>
<label>Email</label>
<input type="email" v-model="login.email" />
</div>
<div>
<label>Password</label>
<input type="password" v-model="login.password" />
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
</div>
</template>
<script>
export default {
data() {
return {
login: {
email: "",
password: "",
},
};
},
methods: {
async userLogin() {
try {
let response = await this.$auth.loginWith("cookie", {
data: this.login,
});
console.log(response);
this.$router.push("secret");
} catch (err) {
console.log(err);
}
},
},
};
</script>
在标题部分我有:
...
<nuxt-link
v-bind:class="{ active: routeName === 'secret' }"
class="link"
to="/secret"
v-if="isAuthenticated"
>Secret</nuxt-link
>
</nav>
<div class="auth">
<div v-if="isAuthenticated">
<a class="link" @click="logout">Logout</a>
</div>
<div v-else>
<nuxt-link
v-bind:class="{ active: routeName === 'register' }"
class="link"
to="/register"
>Register</nuxt-link
>
<nuxt-link class="button" to="/login">Login</nuxt-link>
</div>
</div>
...
<script>
import { mapGetters } from "vuex";
export default {
...
computed: {
...
...mapGetters(["isAuthenticated", "loggedInUser"]),
},
};
</script>
第二次编辑:
更改了我的配置以尝试其他变体,并可能留下会话 cookie。
auth: {
// cookie: false,
strategies: {
local: {
token: {
// property: 'session_token',
// global: true,
required: false,
type: false
},
endpoints: {
login: { url: "/api/auth/login", method: "post" },
logout: false,
user: false,
},
},
},
},
The client-side rendered virtual DOM tree is not matching server-rendered content.
但当我关闭并重新打开浏览器时,我仍然收到。v-if="$auth.loggedIn"
请注意,仅当我有带有or的代码时才会出现这种情况v-if="isAuthenticated"
。难道我做错了什么?如果我用<client-only>
标签包装它,它会解决警告,但看起来像是一个黑客。