Gửi mã thông báo mang theo axios


118

Trong ứng dụng phản ứng của tôi, tôi đang sử dụng axios để thực hiện các yêu cầu api REST.

Nhưng nó không thể gửi tiêu đề Ủy quyền cùng với yêu cầu.

Đây là mã của tôi:

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

Ở đây, validToken()phương pháp sẽ chỉ trả lại mã thông báo từ bộ nhớ của trình duyệt.

Tất cả các yêu cầu đều có phản hồi lỗi 500 nói rằng

Không thể phân tích cú pháp mã thông báo từ yêu cầu

từ back-end.

Làm thế nào để gửi tiêu đề ủy quyền với mỗi yêu cầu? Bạn có đề xuất bất kỳ mô-đun nào khác với react không?


Tôi không nghĩ đó là một axiosvấn đề gì cả. kiểm tra validToken()chức năng của bạn , nó trả về thông tin mà máy chủ của bạn không hiểu.
xiaofan2406

Tôi đôi kiểm tra các chức năng và cũng sử dụng các chuỗi dấu hiệu ở đây thay vì chức năng ,, vẫn như nhau
rakibtg

Câu trả lời:


140
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);

Tham số đầu tiên là URL.
Thứ hai là phần thân JSON sẽ được gửi theo yêu cầu của bạn.
Tham số thứ ba là các tiêu đề (trong số những thứ khác). JSON cũng vậy.


4
Bạn đã bỏ lỡ khoảng cách giữa người mang và mã thông báo - sau đó nó sẽ hoạt động.
tháng

Bác sĩ của bài: "chìa khóa: 'giá trị' có một câu rằng cần được loại bỏ ... Nhưng ấn định rằng đã có được auth để làm việc cho tôi phản ứng bản địa ứng dụng.
mediaguru

1
@mediaguru Thx cho nhận xét. Tôi đã sửa nó (tôi cho là vậy)! Trích dẫn chắc đã được giới thiệu bởi một người nào đó đang chỉnh sửa câu trả lời ...
Bác sĩ

2
Bearernên được sử dụng với vốn B, có nên không?
Alizadeh118

1
@ Alizadeh118 Có, theo thông số HTTP. Nhưng nhiều api không nhấn mạnh vào cách viết hoa chính xác.
OneHoopyFrood

60

Đây là một cách độc đáo để đặt Mã thông báo ủy quyền trong axios. Đặt cấu hình cho mọi cuộc gọi axios không phải là một ý tưởng hay và bạn có thể thay đổi mã thông báo Ủy quyền mặc định bằng cách:

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

Chỉnh sửa , Cảm ơn Jason Norwood-Young.

Một số API yêu cầu ghi tên là Bearer, vì vậy bạn có thể làm:

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

Bây giờ bạn không cần thiết lập cấu hình cho mọi lệnh gọi API. Giờ đây, mã thông báo Ủy quyền được đặt thành mọi lệnh gọi axios.


18
Bearercần được viết hoa cho một số API (tôi đã phát hiện ra một cách khó).
Jason Norwood-Young


22

Bạn có thể tạo cấu hình một lần và sử dụng nó ở mọi nơi.

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

instance.get('/path')
.then(response => {
    return response.data;
})

Giá trị của mã thông báo được chuyển từ đâu trong ví dụ này? Đối với ứng dụng của tôi, mã thông báo sẽ được chuyển trở lại api trong tiêu đề hoặc nội dung sau khi đăng nhập thành công.
Ken

của nó ở đâyheaders: {'Authorization': 'Bearer '+token}
M.suleman Khan.

Làm thế nào để truyền dữ liệu nếu nó là một yêu cầu POST
M.suleman Khan

Đối với những người đang tự hỏi giá trị của mã thông báo có thể được chuyển từ đâu, đây là cú pháp es6 -const instance = (token) => axios.create({ baseURL: `${config.API_URL}`, timeout: 1000, headers :{ 'authorization': 'Bearer ' + token } })
Jeet

18

Bằng cách sử dụng bộ đánh chặn 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);
  }
);

1
Đây có phải là tiêu chuẩn cộng đồng để định cấu hình tiêu đề với axios không?
5ervant

@ 5ervant Tôi đã có một thời gian thực sự xấu xí khi sử dụng cách tiếp cận này. Đó là rất nhiều đau đớn và tôi không khuyên bạn nên nó.
ankush981

@ ankush981 điều gì là tệ về cách tiếp cận này và bạn khuyên bạn nên chọn cách nào?
Nenad Kaevik

1
@NenadKaevik Có một trường hợp sử dụng cụ thể mà tôi đang cố gắng đề cập (chặn phản hồi): cho người dùng biết khi máy chủ thông báo phản hồi 403. Mọi người thường đặt bước xác minh mã thông báo trong quá trình tải thành phần, nhưng giả sử mã thông báo của bạn đã bị vô hiệu một vài giây sau khi nó được xác minh (vì bất kỳ lý do gì). Bây giờ khi người đó nhấp vào một nút, tôi muốn họ biết rằng họ đã đăng xuất. Thật khó để làm điều này bằng cách sử dụng các thiết bị đánh chặn vì chúng có thêm hành vi toàn cầu. Tôi gặp phải vòng lặp tải lại vì bộ chặn yêu cầu sẽ luôn thêm mã thông báo và bộ đánh chặn phản hồi sẽ chuyển hướng
ankush981

@NenadKaevik Vì vậy, có thể luồng khó đạt được hoặc tôi đã sử dụng cách tiếp cận sai, nhưng kể từ đó tôi bắt đầu ghét các thiết bị đánh chặn.
ankush981

9

Nếu bạn muốn một số dữ liệu sau khi chuyển mã thông báo trong tiêu đề, hãy thử mã này

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)
});

2

Điều này hoạt động và tôi chỉ cần đặt mã thông báo một lần trong app.js:

axios.defaults.headers.common = {
    'Authorization': 'Bearer ' + token
};

Sau đó, tôi có thể thực hiện các yêu cầu trong các thành phần của mình mà không cần đặt lại tiêu đề.

"axios": "^0.19.0",


Tôi không biết tại sao nhưng với cách này, nó không hoạt động trên Safari trên thiết bị iOS :(
ZecKa

0

axiosbản thân nó đi kèm với hai "phương pháp" hữu ích không phải là phương pháp interceptorstrung gian giữa yêu cầu và phản hồi. vì vậy nếu trên mỗi yêu cầu bạn muốn gửi mã thông báo. Sử dụng interceptor.request.

Tôi đã thực hiện dự trữ giúp bạn:

$ npm i axios-es6-class

Bây giờ bạn có thể sử dụng axios làm lớp

export class UserApi extends Api {
    constructor (config) {
        super(config);

        // this middleware is been called right before the http request is made.
        this.interceptors.request.use(param => {
            return {
                ...param,
                defaults: {
                    headers: {
                        ...param.headers,
                        "Authorization": `Bearer ${this.getToken()}`
                    },
                }
            }
        });

      this.login = this.login.bind(this);
      this.getSome = this.getSome.bind(this);
   }

   login (credentials) {
      return this.post("/end-point", {...credentials})
      .then(response => this.setToken(response.data))
      .catch(this.error);
   }


   getSome () {
      return this.get("/end-point")
      .then(this.success)
      .catch(this.error);
   }
}

Ý tôi là việc triển khai middlewaretùy thuộc vào bạn hoặc nếu bạn thích tạo axios-es6-class https://medium.com/@enetoOlveda/how-to-use-axios-typescript-like-a-pro-7c882f71e34a của riêng mình thì đó là phương tiện đăng nó đến từ đâu


-4

Đây là những gì tôi cũng phải đối mặt. Mã thông báo mà bạn đang chuyển không đúng.

Chỉ cần Hardcode mã thông báo và vượt qua, bạn sẽ nhận được phản hồi chính xác. Nhưng nếu mã thông báo không được chuyển trong một dấu ngoặc kép '', thì nó chắc chắn sẽ thất bại. Nó phải ở định dạng 'Ủy quyền': 'Bearer YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ', trong đó sau Bearer, một dấu cách duy nhất phải có, điều này cũng rất quan trọng bên trong.

var token = "YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ";

var headers = {
  Authorization: "Bearer " + token,
  Accept: "application/json, text/plain, */*",
  "Content-Type": "application/json"
};

IMP: Đoạn mã trên sẽ hoạt động Nhưng nếu bạn đăng một cái gì đó như:

'Cấp phép': 'Bearer' + YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ, nó sẽ không thành công

hoặc ----- mã bên dưới cũng sẽ không thành công, tôi hy vọng bạn hiểu được sự khác biệt cơ bản

var token = YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjA0YmEzZmZjN2I1MmI4MDJkNQ;

var headers = {
  Authorization: "Bearer " + token,
  Accept: "application/json, text/plain, */*",
  "Content-Type": "application/json"
};
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.