阻止 Nuxt Auth 将授权标头发送到外部 URL

16 浏览
0 Comments

阻止 Nuxt Auth 将授权标头发送到外部 URL

我想在使用nuxt的项目中,通过axios向外部API发送POST请求,在这个项目中我使用了nuxt的auth模块。

当用户经过身份验证后,axios似乎会自动添加授权头部(这对于调用我的后端API来说是可以的,通常是必需的)。然而,当调用外部API时,可能不会接受这个头部,从而导致调用失败。

有没有办法指定哪些URL应该添加或排除授权头部?

下面是我在nuxt.config中的auth和axios模块的配置:

// Axios模块配置

axios: {

baseURL: '//localhost:5000',

},

// Auth模块配置

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' },

},

},

},

}

一些背景信息:

在我特定的用例中,我想将文件上传到Amazon S3存储桶,所以我创建了一个预签名的上传请求,然后想将文件直接上传到存储桶中。只要用户未经过身份验证,这都可以正常工作。

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)

我尝试通过请求配置取消授权头部:

const config = {

transformRequest: (data, headers) => {

delete headers.common.Authorization

}

}

await this.$axios.post(url, formData, config)

这似乎会阻止添加所有与formData相关的头部。而通过headers属性或transformRequest函数在配置中设置任何头部也不起作用,这显然会导致对外部API的调用失败(请求将被发送时不包含任何这些特定的头部)。

由于我使用的是nuxt axios模块,我不确定如何像这里这里所描述的那样向axios实例添加拦截器。

非常感谢任何帮助或提示在哪里寻求帮助 🙂

0
0 Comments

问题的原因是,在使用nuxt auth发送请求到外部URL时,会自动带上授权头部信息,这可能会导致请求失败。解决方法是创建一个新的axios实例,并在该实例中设置不需要的授权头部信息。

首先,在plugins文件夹中创建一个新的axios实例,并设置需要的头部信息。代码如下:

export default function ({ $axios }, inject) {
    // 创建一个自定义的axios实例
    const api = $axios.create({
        headers: {
            // 需要的头部信息
        }
    })
    // 将该实例注入到上下文中,命名为$api
    inject('api', api)
}

然后,在nuxt.config.js中声明该插件,这样就可以发送请求了。代码如下:

plugins: [
    '~/plugins/api.js'
]

最后,在发送请求时,使用新创建的axios实例即可。代码如下:

this.$api.$put(...)

以上是解决问题的方法。其中第一种方法非常有效,而第二种方法无法解决问题。

0
0 Comments

问题的出现原因:在使用nuxt-auth时,希望禁止向外部URL发送授权头,但是配置文件中的plugins配置与根配置无关,而是与nuxt-auth包相关。

解决方法:可以通过在nuxt.config.js中传递以下配置来解决:

auth: {
  redirect: {
    login: '/login',
    home: '/',
    logout: '/login',
    callback: false,
  },
  strategies: {
    ...
  },
  plugins: ['~/plugins/config-file-for-nuxt-auth.js'],
},

然后,创建一个插件文件作为/auth的配置文件(当然需要安装/axios)。

在这个文件中,exampleBaseUrlForAxios是一个示例,用于在使用/auth时设置axios调用的变量。

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文件中),并将其重命名为我们希望在项目中使用的名称。

export default {
  publicRuntimeConfig: {
    exampleBaseUrlForAxios: process.env.EXAMPLE_BASE_URL_FOR_AXIOS,
  }
}

感谢您的回答。不幸的是,我不明白为什么要使用nuxt-axios插件以及它的作用-对我来说,baseUrlIam在这里是undefined。但这可能与您的nuxt-auth.js有关-我没有使用自定义的nuxt-auth插件。这到底是做什么的?为什么要使用它?它如何影响我的nuxt.config.js中的auth配置?

我修改了回答,希望更清楚了。

0