使用axios发送持有者令牌

rak*_*btg 68 rest token access-token reactjs axios

在我的反应应用程序中,我使用axios来执行REST api请求.

但它无法使用请求发送Authorization标头.

这是我的代码:

tokenPayload() {
  let config = {
    headers: {
      'Authorization': 'Bearer ' + validToken()
    }
  }
  Axios.post( 
      'http://localhost:8000/api/v1/get_token_payloads',
      config
    )
    .then( ( response ) => {
      console.log( response )
    } )
    .catch()
}
Run Code Online (Sandbox Code Playgroud)

这里的validToken()方法只是从浏览器存储中返回令牌.

所有请求都有500错误回复说

无法从请求中解析令牌

从后端.

如何使用每个请求发送授权标头?你会推荐其他任何反应模块吗?

Doc*_*tor 67

var config = {
    headers: {'Authorization': "bearer " + token}
};

var bodyParameters = {
   key: "value"
}

Axios.post( 
  'http://localhost:8000/api/v1/get_token_payloads',
  bodyParameters,
  config
).then((response) => {
  console.log(response)
}).catch((error) => {
  console.log(error)
});
Run Code Online (Sandbox Code Playgroud)

第一个参数是URL.
第二个是将根据您的请求发送的JSON正文.
第三个参数是标题(以及其他内容).这也是JSON.

  • 你错过了持票人和令牌之间的空间 - 然后就行了. (4认同)
  • `Bearer` 应该与大写 B 一起使用,不是吗? (3认同)

Ily*_*rim 34

以下是在axios中设置授权令牌的独特方法.将配置设置为每个axios调用都不是一个好主意,您可以通过以下方式更改默认授权令牌:

const axios = require('axios');
axios.defaults.baseURL = 'http://localhost:1010/'
axios.defaults.headers.common = {'Authorization': `bearer ${token}`}
export default axios;
Run Code Online (Sandbox Code Playgroud)

现在您不需要为每个API调用设置配置.现在授权令牌被设置为每个axios调用.

  • 对于某些API,“ Bearer”需要大写(我发现了很难的方法)。 (9认同)
  • @FaizanMubasher 如果你使用不同的服务器则不会 (3认同)
  • 这应该被接受的答案。这是更好的方法。 (2认同)

Nic*_*sev 23

第二个参数axios.postdata(不config).config是第三个参数.有关详细信息,请参阅此处:https://github.com/mzabriskie/axios#axiosposturl-data-config


Sar*_*oev 12

您可以创建一次配置并在任何地方使用它.

const instance = axios.create({
  baseURL: 'https://some-domain.com/api/',
  timeout: 1000,
  headers: {'Authorization': 'Bearer '+token}
});

instance.get('/path')
.then(response => {
    return response.data;
})
Run Code Online (Sandbox Code Playgroud)


Has*_*ran 12

以防万一有人遇到同样的问题。

这里的问题是,当传递没有数据的标头时,标头的配置将位于有效负载数据中,因此我需要传递 null 而不是数据,然后设置标头的配置。

const config = {
         headers: {
             "Content-type": "application/json",
              "Authorization": `Bearer ${Cookies.get("jwt")}`,
         },
    };    
axios.get(`${BASE_URL}`, null, config)
Run Code Online (Sandbox Code Playgroud)


小智 11

通过使用Axios拦截器:

const service = axios.create({
  timeout: 20000 // request timeout
});

// request interceptor

service.interceptors.request.use(
  config => {
    // Do something before request is sent

    config.headers["Authorization"] = "bearer " + getToken();
    return config;
  },
  error => {
    Promise.reject(error);
  }
);
Run Code Online (Sandbox Code Playgroud)

  • **这是使用 axios 配置标头的社区标准吗?** (2认同)
  • @5ervant 我在使用这种方法时经历了一段非常糟糕的时光。这是很痛苦的,所以我不推荐它。 (2认同)
  • @NenadKaevik 我试图涵盖一个特定的用例(响应拦截):让用户知道服务器何时响应 403。人们通常将令牌验证步骤放在组件加载期间,但假设您的令牌在验证后几秒钟就失效了(无论出于何种原因)。现在,当用户单击按钮时,我希望他们知道他们已退出。使用拦截器很难做到这一点,因为它们添加了全局行为。我进入了重新加载循环,因为请求拦截器总是会添加令牌,而响应拦截器会重定向 (2认同)

gdf*_*dfg 9

这有效,我只需要在我的中设置一次令牌app.js

axios.defaults.headers.common = {
    'Authorization': 'Bearer ' + token
};
Run Code Online (Sandbox Code Playgroud)

然后我可以在我的组件中发出请求而无需再次设置标头。

"axios": "^0.19.0",


Nee*_*tel 6

如果要在标题中传递令牌后想要一些数据,请尝试以下代码

const api = 'your api'; 
const token = JSON.parse(sessionStorage.getItem('data'));
const token = user.data.id; /*take only token and save in token variable*/
axios.get(api , { headers: {"Authorization" : `Bearer ${token}`} })
.then(res => {
console.log(res.data);
.catch((error) => {
  console.log(error)
});
Run Code Online (Sandbox Code Playgroud)


Din*_*ana 6

我使用一个单独的文件来初始化 axios 实例,同时向其中添加拦截器。然后在每次调用中,拦截器都会为我将令牌添加到请求标头中。

import axios from 'axios';
import { getToken } from '../hooks/useToken';

const axiosInstance = axios.create({
  baseURL: process.env.REACT_APP_BASE_URL,
});

axiosInstance.interceptors.request.use(
  (config) => {
    const token = getToken();
    const auth = token ? `Bearer ${token}` : '';
    config.headers.common['Authorization'] = auth;
    return config;
  },
  (error) => Promise.reject(error),
);

export default axiosInstance;

Run Code Online (Sandbox Code Playgroud)

这是我在服务文件中使用它的方法。

import { CancelToken } from 'axios';
import { ToolResponse } from '../types/Tool';
import axiosInstance from './axios';

export const getTools = (cancelToken: CancelToken): Promise<ToolResponse> => {
  return axiosInstance.get('tool', { cancelToken });
};

Run Code Online (Sandbox Code Playgroud)