当前位置: 首页 > 知识库问答 >
问题:

nuxt3 请求 token 要怎么传?

卢勇
2023-12-01

以前一直用 vue3,现在在学习用 nuxt3,遇到一个传 token 的问题,研究半天没明白,nuxt3 这个 token 要怎么请求的时候传过去?

我先讲下我的 vue3 是怎么用的
用户第一次访问网站,检查 localStorage.getItem('token') 是否为空,如果为空或token过时,直接跳到登录页面,登录后获取 token 存放到 localStorage.setItem('token', token) 里面,之后每次页面的所有请求都在 headers.Authorization 里面带上,如下:

import axios from 'axios';axios.post('/api/users', {        headers: {            Authorization: 'Bearer ' + localStorage.getItem('token')        }    }).then(response => {        console.log(response.data);    })    .catch(error => {        console.error(error);    });

nuxt3 获取的 token 放在哪,怎么在下面请求中带上?

const { data } = await useFetch('/api/users');

xxx.vue 文件中,更本就不能使用 localStorage,该怎么做?

网上都说用用 useState

// states.tsexport const useToken = () => useState<string>('token', () => '');

登录后获取 token,存到 useToken().value = token 里面,那我刷新页面不就没了

共有2个答案

陆昕
2023-12-01

这里主要涉及一个思路的转换。

在 Vue,或者说传统 SPA 里,所有请求都是 请求,即完成网页加载、JS 执行完毕后,再发起请求。这些请求,可以认为完全由开发者控制,即你知道什么时候该请求,然后发起请求。一般来说,所有的请求都是 数据交互类

在 Nuxt 里,因为 SSR 的存在,所以请求至少可以分成两类:页面渲染类,数据交互类。前者会影响到 HTML 的内容。在网络环境里,存在大量缓存节点,假如跟用户相关的敏感数据渲染成 HTML,缓存到 CDN 当中,会是非常大的安全问题。所以 Nuxt 在 SSR 及其内部发起请求时,不会携带 cookie;在用户主动发起的请求里,才会携带 cookie。

回到你的问题。

  1. localStorage 存在用户本地,无法在网络请求中携带,所以必须在网页准备就绪后才能使用
  2. 所以要用 localStorage 的请求就不能放在 useAsyncDatauseFetch 里,因为它们都是 SSR 的关键函数,它们第一次起作用的时候,运行环境是线上的 node.js
  3. 如果你想在 SSR 阶段使用用户身份,可以用 cookie,并且需要手动将其放入请求中,参考 官方文档 useRequestHeaders
  4. 否则的话,在 onMounted() 里使用 $fetch 请求,用传统 SPA 的形式就可以了。
羊舌勇
2023-12-01

在 Nuxt3 中,可以使用 ibm/q哲提出的qiniu-js存储库中的 cookies API 来存储和获取 token。具体操作如下:

首先,需要安装 qiniu-js 存储库,可以使用 npm 或 yarn 进行安装:

npm install qiniu-js

yarn add qiniu-js

然后,在需要使用 token 的地方,使用 cookies API 获取和存储 token。示例代码如下:

import { Cookies } from 'qiniu-js';// 在登录成功后获取 token,并使用 Cookies 存储async function login() {  const response = await fetch('/api/login');  const token = await response.json();  Cookies.set('token', token);}// 在需要使用 token 的请求中获取async function fetchData() {  const token = Cookies.get('token');  const response = await fetch('/api/users', {    headers: {      Authorization: 'Bearer ' + token,    },  });  const data = await response.json();  console.log(data);}

这样,在登录成功后,token 会被存储在用户的浏览器中,后续请求时会自动带上。同时,由于使用了 Cookies 存储 token,因此即使刷新页面,token 也不会丢失。

 类似资料:
  • 问题内容: 有谁知道如何使“ Google ReCAPTCHA(v2)”成为“必填项” ? 我的意思是直到填写Recaptcha才提交表单? 我在表单中使用ParsleyJs,但没有找到使其与s 一起使用的方法。 问题答案: 您必须使用reCaptcha验证响应回调。像这样:

  • Symfony中的默认CSRF预防是基于表单的(如果使用提供的表单生成器,则会自动发生)。然而,对于AJAX请求,手动将CSRF令牌附加到每个HTTP请求,然后手动检查每个请求,这是非常繁琐的。 一个好的方法是将令牌嵌入为HTTP标头,如本问题的注释中建议的那样。jQuery然后可以被配置为在每个请求中包含这个标头,如这里所述。 我的问题是如何在Symfony内最好地处理这个问题?我可以使用Twi

  • vue3项目中个别请求需要使用到另外一个token怎么处理呢 vue3项目中个别请求需要使用到另外一个token怎么处理呢

  • 本文向大家介绍axios同时请求多个接口,如果当token过期时,怎么取消后面的请求?相关面试题,主要包含被问及axios同时请求多个接口,如果当token过期时,怎么取消后面的请求?时的应答技巧和注意事项,需要的朋友参考一下 axios的话可以使用cancelToken来实现。如果是原生的XMLhttprequest的话,需要使用abort()方法实现。 https://juejin.im/po

  • 本文向大家介绍请求时token过期自动刷新token操作,包括了请求时token过期自动刷新token操作的使用技巧和注意事项,需要的朋友参考一下 1.在开发过程中,我们都会接触到token,token的作用是什么呢?主要的作用就是为了安全,用户登陆时,服务器会随机生成一个有时效性的token,用户的每一次请求都需要携带上token,证明其请求的合法性,服务器会验证token,只有通过验证才会返回

  • nuxt3项目,打开网页后,通过F12查看网络,发现打开每一页,在网络的"其它"请求项中,都有大量重复的请求 比如打开A页面,有a、b、c的图片,d、e、f的js文件,打开B页面,也是有a、b、c的图片,d、e、f的js文件,C页面也是如此,但是A、B、C页面并没有使用到这些资源,求解