axios로 Bearer 토큰 보내기


118

내 반응 앱에서 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 오류 응답이 있습니다.

요청에서 토큰을 구문 분석 할 수 없습니다.

백엔드에서.

각 요청과 함께 인증 헤더를 보내는 방법은 무엇입니까? 반응이있는 다른 모듈을 추천 하시겠습니까?


나는 그것이 axios전혀 문제 라고 생각하지 않습니다 . validToken()기능을 확인 하면 서버가 이해하지 못하는 것을 반환합니다.
xiaofan2406

나는 이중 기능을 확인하고 또한 ,, 대신 기능의 여기 여전히 같은 토큰 문자열을 사용
rakibtg을

답변:


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

첫 번째 매개 변수는 URL입니다.
두 번째는 요청과 함께 전송되는 JSON 본문입니다.
세 번째 매개 변수는 (무엇보다도) 헤더입니다. JSON도 마찬가지입니다.


4
전달자와 토큰 사이의 공백을 놓쳤습니다. 그러면 작동합니다.
dec.

의사의 게시물 : "키"값은 "제거해야 견적이 ...하지만 내 일하기 인증셨어요 고정는 반응 네이티브 응용 프로그램.
mediaguru

1
댓글에 대한 @mediaguru Thx. 나는 그것을 고쳤다 (나는 추측한다)! 답을 편집하는 누군가가 인용문을 소개했을 것입니다 ...
Doctor

2
Bearer대문자 B와 함께 사용해야합니다. 그렇지 않습니까?
Alizadeh118

1
@ Alizadeh118 예, HTTP 사양에 따라. 그러나 많은 API는 올바른 대문자를 요구하지 않습니다.
OneHoopyFrood

60

다음은 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 호출에 설정됩니다.


18
Bearer일부 API의 경우 대문자가 필요합니다 (어려운 방법을 발견했습니다).
Jason Norwood-Young


22

구성을 한 번만 만들어 어디서나 사용할 수 있습니다.

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

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

이 예에서 전달 된 토큰의 값은 어디입니까? 내 응용 프로그램의 경우 토큰은 성공적인 로그인 후 헤더 또는 본문에서 API로 다시 전달됩니다.

그 여기headers: {'Authorization': 'Bearer '+token}
M.suleman 칸

그것이 POST 요청의 경우 데이터를 전달하는 방법
M.suleman 칸

토큰의 가치를 어디에서 전달할 수 있는지 궁금하신 분들을 위해 es6 구문이 있습니다.const instance = (token) => axios.create({ baseURL: `${config.API_URL}`, timeout: 1000, headers :{ 'authorization': 'Bearer ' + token } })
Jeet

18

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
axios로 헤더를 구성하기위한 커뮤니티 표준입니까?
5ervant

@ 5ervant 나는이 접근 방식을 사용하여 정말 추한 시간을 보냈습니다. 너무 고통스러워서 추천하지 않습니다.
ankush981

@ ankush981이 접근 방식에 대해 무엇이 그렇게 나쁘고 어떤 것을 권장합니까?
Nenad Kaevik

1
@NenadKaevik 제가 다루려고했던 특정 사용 사례가 있습니다 (응답 차단) : 서버가 응답으로 403이라고 말하면 사용자에게 알립니다. 사람들은 일반적으로 구성 요소로드 중에 토큰 확인 단계를 수행하지만 토큰이 확인 된 후 몇 초 후에 무효화되었다고 가정합니다 (어떤 이유로 든). 이제 그 사람이 버튼을 클릭 할 때 그들이 로그 아웃되었음을 알기를 원합니다. 인터셉터를 사용하여 전역 동작을 추가하는 것은 어렵습니다. 요청 인터셉터가 항상 토큰을 추가하고 응답 인터셉터가 리디렉션하기 때문에 다시로드 루프에 들어갔습니다.
ankush981

@NenadKaevik 그래서, 흐름을 달성하기 어려웠거나 잘못된 접근 방식을 사용하고 있었지만 그 이후로 인터셉터를 싫어하기 시작했습니다.
ankush981

9

이 코드를 시도하도록 헤더에 토큰을 전달한 후 일부 데이터를 원한다면

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

이것은 작동하며 토큰을 한 번만 설정하면됩니다 app.js.

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

그런 다음 헤더를 다시 설정하지 않고 구성 요소에서 요청할 수 있습니다.

"axios": "^0.19.0",


이유는 모르겠지만 이런 식으로 iOS 기기의 Safari에서는 작동하지 않습니다. (
ZecKa

0

axios그 자체로 interceptors요청과 응답 사이의 미들웨어에 불과한 두 가지 유용한 "방법"이 있습니다. 따라서 각 요청에서 토큰을 보내려는 경우. 를 사용합니다 interceptor.request.

나는 당신을 돕는 패키지를 만들었습니다.

$ npm i axios-es6-class

이제 axios를 클래스로 사용할 수 있습니다.

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

나는의 구현을 의미 middleware 귀하에 따라 다르거 나 자신의 axios-es6-class https://medium.com/@enetoOlveda/how-to-use-axios-typescript-like-a-pro-7c882f71e34a 를 만드는 것을 선호하는 경우 매체입니다 출처를 게시하다


-4

이것은 내가 또한 직면 한 것입니다. u가 전달하는 토큰이 올바르지 않습니다.

토큰을 하드 코딩하고 통과하면 올바른 응답을 얻을 수 있습니다. 그러나 토큰이 작은 따옴표 ''로 전달되지 않으면 확실히 실패합니다. 'Authorization'형식이어야합니다. 'Bearer YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ'형식이어야하며, Bearer 뒤에는 작은 따옴표 안에도 하나의 공백이 있어야합니다.

var token = "YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ";

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

IMP : 위의 코드는 작동하지만 다음과 같이 게시하면 :

'Authorization': 'Bearer'+ YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjVlOTQ5YMmQ5ZjMwYjA0YmEzZmZjN2I1MmI4MDJkNQ, 실패합니다

또는 ----- 아래 코드도 실패합니다. 기본 차이점을 이해하기를 바랍니다.

var token = YzE5ZTdiMjVlYzM5NjA2MGJkZTM5NjA0YmEzZmZjN2I1MmI4MDJkNQ;

var headers = {
  Authorization: "Bearer " + token,
  Accept: "application/json, text/plain, */*",
  "Content-Type": "application/json"
};
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.