使用 axios 发送承载令牌

IT技术 reactjs rest token axios access-token
2021-04-21 03:05:17

在我的react应用程序中,我使用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()
}

在这里,该validToken()方法将简单地从浏览器存储中返回令牌。

所有请求都有 500 错误响应说

无法从请求中解析令牌

从后端。

如何随每个请求发送授权标头?你会推荐任何其他带有react的module吗?

6个回答
const config = {
    headers: { Authorization: `Bearer ${token}` }
};

const bodyParameters = {
   key: "value"
};

Axios.post( 
  'http://localhost:8000/api/v1/get_token_payloads',
  bodyParameters,
  config
).then(console.log).catch(console.log);

第一个参数是 URL。
第二个是将随您的请求发送的 JSON 正文。
第三个参数是标题(除其他外)。这也是 JSON。

Doctor's post: "key: "value" 有一个应该被删除的引用......但是修复它确实让我的react-native应用程序能够正常工作。
2021-06-04 03:05:17
@Alizadeh118 是的,根据 HTTP 规范。但是许多 api 不坚持正确的大小写。
2021-06-05 03:05:17
你错过了承载和令牌之间的空间 - 那么它就会起作用。
2021-06-06 03:05:17
@mediaguru Thx 发表评论。我修好了(我想)!引用必须是由编辑答案的人引入的......
2021-06-12 03:05:17
Bearer 应该与大写 B 一起使用,不是吗?
2021-06-15 03:05:17

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

import axios from 'axios';
axios.defaults.baseURL = 'http://localhost:1010/'
axios.defaults.headers.common = {'Authorization': `bearer ${token}`}
export default axios;

编辑,感谢 Jason Norwood-Young。

有些API需要将bearer写成Bearer,所以你可以这样做:

axios.defaults.headers.common = {'Authorization': `Bearer ${token}`}

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

@Musculaa 问题不在于不同的服务器😊。
2021-06-03 03:05:17
这应该是可以接受的答案。这是更好的方法。
2021-06-17 03:05:17
@FaizanMubasher 如果您使用不同的服务器,则不会
2021-06-17 03:05:17
为了从函数或本地存储加载令牌,我们需要拦截器
2021-06-18 03:05:17
Bearer 某些 API 需要大写(我发现了困难的方法)。
2021-06-21 03:05:17

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

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

instance.get('/path')
.then(response => {
    return response.data;
})
如果是POST请求,如何传递数据
2021-05-26 03:05:17
对于那些想知道从哪里可以传递 token 值的人,这里是 es6 语法 - const instance = (token) => axios.create({ baseURL: `${config.API_URL}`, timeout: 1000, headers :{ 'authorization': 'Bearer ' + token } })
2021-05-28 03:05:17
这个例子中token的值是从哪里传过来的?对于我的应用程序,成功登录后,令牌将在标头或正文中传递回 api。
2021-06-16 03:05:17
它在这里 headers: {'Authorization': 'Bearer '+token}
2021-06-16 03:05:17

的第二个参数axios.postdata(not config)。config是第三个参数。详情请参阅:https : //github.com/mzabriskie/axios#axiosposturl-data-config

通过使用 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);
  }
);
@ankush981 这种方法有什么不好,你推荐哪一种?
2021-05-26 03:05:17
@NenadKaevik 我试图涵盖一个特定的用例(响应拦截):让用户知道服务器何时响应 403。人们通常在组件加载期间放置令牌验证步骤,但假设您的令牌在验证后几秒钟失效(无论出于何种原因)。现在,当用户单击按钮时,我希望他们知道他们已退出。使用拦截器很难做到这一点,因为它们添加了全局行为。我进入了重新加载循环,因为请求拦截器总是会添加令牌,而响应拦截器会重定向
2021-05-26 03:05:17
@NenadKaevik 所以,也许流程很难实现,或者我使用了错误的方法,但从那以后我开始讨厌拦截器。
2021-06-01 03:05:17
这是使用 axios 配置标头的社区标准吗?
2021-06-20 03:05:17
@5ervant 我在使用这种方法时度过了一段非常难看的时光。这是一个很大的痛苦,我不推荐它。
2021-06-21 03:05:17