我想在使用nuxtauth模块的nuxtprojekt中使用axios向外部API发送POST请求。
当用户通过身份验证时,axios似乎会自动添加一个授权头(这很好,通常需要调用我的后端API(。然而,当对外部API进行调用时,头可能不被接受,并导致调用失败。
是否有任何方法可以指定应该为哪些URL添加或排除auth标头?
以下是我的nuxt.config
中auth和axios模块的配置
// Axios module configuration
axios: {
baseURL: '//localhost:5000',
},
// Auth module configuration
auth: {
strategies: {
local: {
endpoints: {
login: { url: '/auth/login', method: 'post', propertyName: 'token' },
logout: { url: '/auth/logout', method: 'delete' },
user: { url: '/auth/user', method: 'get', propertyName: 'user' },
},
},
},
}
更多背景:在我的特定用例中,我想将文件上传到AmazonS3存储桶,所以我创建了一个预先签名的上传请求,然后想将文件直接上传到存储桶中。只要用户没有经过身份验证,这就可以很好地工作。
const { data } = await this.$axios.get('/store/upload-request', {
params: { type: imageFile.type },
})
const { url, fields } = data
const formData = new FormData()
for (const [field, value] of Object.entries(fields)) {
formData.append(field, value)
}
formData.append('file', imageFile)
await this.$axios.post(url, formData)
我试图通过请求配置取消设置Auth标头:
const config = {
transformRequest: (data, headers) => {
delete headers.common.Authorization
}
}
await this.$axios.post(url, formData, config)
这似乎阻止了添加所有与formData相关的标头。此外,通过headers
属性或transformRequest
函数在配置中设置任何头都不起作用,这再次导致对外部API的调用明显失败(请求将在没有这些特定头的情况下发送(。
当我使用nuxt-axios模块时,我不知道如何向这里或这里描述的axios实例添加拦截器。
任何关于在哪里寻求帮助的帮助或提示都将不胜感激:(
尝试以下
在插件文件夹中创建一个新的axios实例:
export default function ({ $axios }, inject) {
// Create a custom axios instance
const api = $axios.create({
headers: {
// headers you need
}
})
// Inject to context as $api
inject('api', api)
}
在nuxt.config.js中声明此插件,然后您可以发送请求:
this.$api.$put(...)
您可以将以下配置传递给nuxt-auth
。注意,那些plugins
与根配置无关,而是与nuxt-auth
包有关。
nuxt.config.js
auth: {
redirect: {
login: '/login',
home: '/',
logout: '/login',
callback: false,
},
strategies: {
...
},
plugins: ['~/plugins/config-file-for-nuxt-auth.js'],
},
然后,创建一个插件文件,作为@nuxt/auth
的配置(当然,您需要安装@nuxt/axios
。PS:在此文件中,以exampleBaseUrlForAxios
为例,在使用@nuxt/auth
时设置axios调用的变量。
config-file-for-nuxt-auth.js
export default ({ $axios, $config: { exampleBaseUrlForAxios } }) => {
$axios.defaults.baseURL = exampleBaseUrlForAxios
// I guess that any usual axios configuration can be done here
}
这是本文中推荐的做事方式。基本上,当您使用它时,您可以将运行时变量传递给您的项目。因此,在这里我们传递一个EXAMPLE_BASE_URL_FOR_AXIOS
变量(位于.env
中(,并将其重命名为我们希望在项目中使用的名称。
nuxt.config.js
export default {
publicRuntimeConfig: {
exampleBaseUrlForAxios: process.env.EXAMPLE_BASE_URL_FOR_AXIOS,
}
}