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

防止nuxt auth将授权头发送到外部url

王成化
2023-03-14

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

当用户通过身份验证时,axios似乎会自动添加授权头(这很好,并且经常需要调用我的后端API)。但是,在调用外部API时,标头可能不被接受,并导致调用失败。

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

以下是mynuxt中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存储桶中,因此我创建了一个预先签名的上传请求,然后想将该文件直接上传到存储桶中。只要用户没有经过身份验证,这种方法就可以很好地工作。

js prettyprint-override">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实例添加拦截器,如这里或这里所述。

非常感谢任何关于在何处寻求帮助的帮助或提示:)

共有2个答案

毋承基
2023-03-14

您可以将以下配置传递给numxt auth。注意,那些插件与根配置无关,而是与numxt auth包有关。

numxt。配置。js

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

然后,创建一个插件文件,作为@nuxt/auth的配置(当然,您需要安装@nuxt/axios)。PS:在这个文件中,使用@nuxt/auth时,exampleBaseUrlForAxios>作为示例来设置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
}

这是本文中介绍的推荐方法。基本上,您可以在使用时将运行时变量传递给项目。因此,这里我们将传递一个示例\u BASE\u URL\u FOR_AXIOS变量(位于.env)并将其重命名为我们希望在项目中使用的名称。

numxt。配置。js

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

韦睿
2023-03-14

试试下面的方法

解决方案1,在插件文件夹中创建一个新的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声明这个插件。配置。js,然后您可以发送您的请求:

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

解决方案2,在plugins/axios中将axios声明为插件。js并根据请求url设置听者:

export default function({ $axios, redirect, app }) {
    const apiS3BaseUrl = // Your s3 base url here
    $axios.onRequest(config => {
        if (config.url.includes(apiS3BaseUrl) {
            setToken(false)
            // Or delete $axios.defaults.headers.common['Authorization']
        } else {
            // Your current axios config here
        }
    });
}

在nuxt.config.js中声明此插件

就我个人而言,我使用第一种解决方案,如果有一天S3URL发生变化,这并不重要。

这是医生

 类似资料:
  • 我尝试使用JQuery Ajax进行基本身份验证。我像这样向ajax请求添加授权标头。 然后在ASP. Net Web服务中,我尝试获取此标头。 当我打印到标题时,我看不到授权标题 缓存控制:无缓存连接:保持活动状态Pragma:无缓存接受:接受编码:gzip,deflate接受语言:tr tr,tr;q=0.9,en-US;q=0.8,en;q=0.7主机:示例。com参考:http://loc

  • 如何通过Axios.js发送带有令牌的身份验证头?我试过几件事都没有成功,比如: 给出以下错误:

  • 在使用morgan中间件记录日志时,我注意到服务器日志中出现了一些频繁且令人担忧的请求。 相关记录器代码 因此,日志的示例如下 不幸的是,我不知道如何重现这样的错误。这是一个潜在的漏洞吗?原木锻造?我在哪里可以找到进一步的信息? 具体来说,这一行的url是“GET”http://example.com/path.php HTTP/1.1”,其中example.com不是我的域,我的服务器也没有设置

  • 我有两个Rest终点。 -身份提供程序,在用户通过用户名/密码的身份验证后,发送JWT令牌作为响应。 -接受上述JWT令牌作为头,对其进行验证,如果令牌有效,则发送用户JSON作为响应。 我已经使用Angular2创建了我的UI null

  • 我已经实现了一个使用基本身份验证(使用Spring Security性)的web服务器。 我在访问URL时禁用了默认身份验证入口点(它只返回401,而不是用www身份验证标头响应401),目的是防止浏览器显示身份验证弹出窗口。 我能够用javascript代码和命令行工具(如curl)连接到服务器,但是当我用浏览器(chrome)测试它时 <代码>curl-v-u用户:密码本地主机:8080/用户

  • 在我们的节奏工作流程中,我们通常需要等待一定时间的外部事件才能继续(即电子邮件阅读、链接点击等)。 我想知道什么是将这些事件通知我们工作流程的最佳方式。信号是正确的方式,还是我们应该创建一个等待事件的活动? 根据我所看到的,我们需要创建一个信号通道,但是上下文在活动中不可用。