我应该如何在 axios GET 请求中发送 JWT 令牌? [复制]

Posted

技术标签:

【中文标题】我应该如何在 axios GET 请求中发送 JWT 令牌? [复制]【英文标题】:How should I send JWT token in axios GET request? [duplicate] 【发布时间】:2019-02-16 22:24:17 【问题描述】:

我是 Vue.js 新手,想在组件中向受限 api 发出请求:

  computed: 
    token () 
      return this.$store.getters.getToken; 
    ,
   ...

created () 
         axios
        .get( this.BASE_URL + '/profile/me')
        .then( res => 
                    this.profile = res.data;
                    console.log('profile is:', res.data);

          )
          .catch(error => console.log(error))            
    ,

问题是我不知道如何将令牌包含到请求标头中。所以毫不奇怪,我得到401 错误响应。

当我尝试时

axios.defaults.headers.common['Authorization'] = this.token;

在获取请求之前,我在服务器日志中收到OPTIONS /profile/me 而不是GET /profile/me

我该如何解决?

【问题讨论】:

【参考方案1】:

axios get() 请求接受两个参数。所以,除了url,你也可以把JWT放进去。

axios.get(yourURL, yourConfig)
.then(...)

在您的情况下,yourConfig 可能是这样的

yourConfig = 
   headers: 
      Authorization: "Bearer " + yourJWTToken
   

您还可以在https://github.com/axios/axios 阅读有关可以在配置中添加的内容。 只需搜索“请求配置”

【讨论】:

我在服务日志中得到OPTIONS /profile/me 200。并且没有 GET 请求。浏览器还抱怨“不允许授权”,尽管事实上我有这个:app.use(function(req, res, next) res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Credentials", "true"); res.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT"); ... in express settings。 您可以通过在本地计算机上安装此扩展来伪造域,而不是更改服务器行为。(chrome.google.com/webstore/detail/allow-control-allow-origi/…)。将您的服务器配置为接受来自不同域的请求会导致某种 CSRF 攻击。另外,请记住在开发后关闭该扩展。【参考方案2】:

这对我有用,试试看 -

let JWTToken = 'xxyyzz';
 axios
    .get(this.BASE_URL + '/profile/me',  headers: "Authorization" : `Bearer $JWTToken` )
    .then(res => 
       this.profile = res.data;
       console.log('profile is:', res.data);
      )
      .catch(error => console.log(error)) 

【讨论】:

我收到此错误:Failed to load http://127.0.0.1:3000/profile/me: Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response.。有什么想法吗? 当我们使用自定义请求标头时,我们将获得 CORS 预检。我们需要使用适当的 CORS 标头回复该 CORS 预检以使其正常工作。比如 - ` res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Credentials", "true"); res.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT"); ` 我知道。我已经表达了app.use(function(req, res, next) res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Credentials", "true"); res.setHeader("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT"); res.setHeader("Access-Control-Allow-Headers", "Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"); next(); );,但仍然收到错误消息。任何想法如何解决它? 如果你使用 webpack 和 vue 应用程序,那么试试这个 - github.com/axios/axios/issues/853#issuecomment-374846375 它将通过配置代理来解决问题,以避免 CORS 抱歉,不知道怎么写。 sn-p。我已经使用 vue.cli 创建了该应用程序。在/node_modules/@vue/cli-service 中有一个webpack.config.js,但是当我把"devServer": "proxy": "/": "target": 'http://127.0.0.1:3000', "pathRewrite": '^/': '' , "changeOrigin": true, "secure": false 放在那里时,在vue 服务器重新加载后仍然会出现同样的错误。这里有什么问题?

以上是关于我应该如何在 axios GET 请求中发送 JWT 令牌? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 axios GET 请求发送标头?

是否可以在 Axios 中发送带有 JSON 正文的 get 请求?

如何使用 Express 和 Axios 从我的 get 请求发送响应对象到前端?

axios如何一次性发送多个网络请求?

react中如何通过axios get方法发送参数?

为啥 axios get 方法请求发送两次?