การส่งโทเค็นผู้ถือด้วย axios


119

ในแอปตอบกลับของฉันฉันใช้axiosเพื่อดำเนินการร้องขอ REST api

แต่ไม่สามารถส่งส่วนหัวการให้สิทธิ์พร้อมคำขอได้

นี่คือรหัสของฉัน:

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

คำตอบ:


141
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
คุณพลาดช่องว่างระหว่างผู้ถือและโทเค็น - จากนั้นจะใช้งานได้
ธ.ค.

โพสต์ของคุณหมอ: "คีย์:" ค่า "มีใบเสนอราคาที่ควรลบออก ... แต่การแก้ไขนี้ทำให้การตรวจสอบสิทธิ์ใช้งานได้กับแอปพลิเคชัน react-native ของฉัน
mediaguru

1
@mediaguru ขอบคุณสำหรับความคิดเห็น ฉันแก้ไขแล้ว (ฉันคิดว่า)! คำพูดต้องได้รับการแนะนำโดยผู้ที่แก้ไขคำตอบ ...
หมอ

2
Bearerจะใช้กับทุน B ไม่ควร?
Alizadeh118

1
@ Alizadeh118 ใช่ตามข้อมูลจำเพาะของ HTTP แต่ api จำนวนมากไม่ยืนยันการใช้อักษรตัวพิมพ์ใหญ่ที่ถูกต้อง
OneHoopyFrood

61

นี่คือวิธีเฉพาะในการตั้งค่าโทเค็นการอนุญาตในแกน การตั้งค่าการกำหนดค่าให้กับการเรียก 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 ดังนั้นคุณสามารถทำได้:

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

ตอนนี้คุณไม่จำเป็นต้องตั้งค่าการเรียกใช้ API ทุกครั้ง ขณะนี้โทเค็นการอนุญาตถูกตั้งค่าเป็นทุกการเรียก axios


18
Bearerต้องใช้ตัวพิมพ์ใหญ่สำหรับ API บางตัว (ฉันค้นพบวิธีที่ยาก)
Jason Norwood-Young


23

คุณสามารถสร้าง config เพียงครั้งเดียวและใช้งานได้ทุกที่

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 ไม่ว่าจะในส่วนหัวหรือเนื้อหาหลังจากล็อกอินสำเร็จ
Ken

ที่นี่headers: {'Authorization': 'Bearer '+token}
M.suleman Khan

วิธีการส่งข้อมูลหากเป็นคำขอ POST
M.suleman Khan

สำหรับผู้ที่สงสัยว่าค่าโทเค็นสามารถส่งผ่านได้จากที่ไหนนี่คือไวยากรณ์ es6 -const instance = (token) => axios.create({ baseURL: `${config.API_URL}`, timeout: 1000, headers :{ 'authorization': 'Bearer ' + token } })
Jeet

18

โดยใช้ Axios interceptor:

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
นี่เป็นมาตรฐานชุมชนสำหรับการกำหนดค่าส่วนหัวด้วยแกนหรือไม่
5 ผู้ใช้

@ 5 ผู้ใช้ฉันมีช่วงเวลาที่น่าเกลียดจริงๆโดยใช้วิธีนี้ มันปวดมากเลยไม่แนะนำ
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",


ฉันไม่รู้ว่าทำไม แต่ด้วยวิธีนี้มันไม่ทำงานบน Safari บนอุปกรณ์ iOS :(
ZecKa

0

axiosโดยตัวมันเองมาพร้อมกับ "วิธีการ" ที่มีประโยชน์สองวิธีinterceptorsที่ไม่มีเลยนอกจากตัวกลางระหว่างคำขอและการตอบกลับ ดังนั้นหากคุณต้องการส่งโทเค็นในแต่ละคำขอ ใช้interceptor.request .

ฉันทำ apackage ที่ช่วยคุณได้:

$ 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

นี่คือสิ่งที่ฉันเผชิญเช่นกัน โทเค็นที่คุณกำลังส่งไม่ถูกต้อง

เพียงแค่ Hardcode โทเค็นและส่งคุณจะได้รับคำตอบที่ถูกต้อง แต่ถ้าโทเค็นไม่ถูกส่งผ่านในเครื่องหมายคำพูดเดียว '' ก็จะล้มเหลวอย่างแน่นอน ต้องอยู่ในรูปแบบ '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.