Saya memiliki aplikasi react / redux yang mengambil token dari server api. Setelah pengguna mengautentikasi, saya ingin membuat semua permintaan axios memiliki token itu sebagai header Otorisasi tanpa harus melampirkannya secara manual ke setiap permintaan dalam tindakan. Saya cukup baru untuk bereaksi / redux dan tidak yakin dengan pendekatan terbaik dan saya tidak menemukan kualitas apa pun di Google.
Berikut adalah pengaturan redux saya:
// actions.js
import axios from 'axios';
export function loginUser(props) {
const url = `https://api.mydomain.com/login/`;
const { email, password } = props;
const request = axios.post(url, { email, password });
return {
type: LOGIN_USER,
payload: request
};
}
export function fetchPages() {
/* here is where I'd like the header to be attached automatically if the user
has logged in */
const request = axios.get(PAGES_URL);
return {
type: FETCH_PAGES,
payload: request
};
}
// reducers.js
const initialState = {
isAuthenticated: false,
token: null
};
export default (state = initialState, action) => {
switch(action.type) {
case LOGIN_USER:
// here is where I believe I should be attaching the header to all axios requests.
return {
token: action.payload.data.key,
isAuthenticated: true
};
case LOGOUT_USER:
// i would remove the header from all axios requests here.
return initialState;
default:
return state;
}
}
Token saya disimpan di toko redux di bawah state.session.token
.
Saya agak bingung bagaimana melanjutkan. Saya telah mencoba membuat contoh axios dalam file di direktori root saya dan memperbarui / impor itu alih-alih dari node_modules tetapi tidak melampirkan tajuk ketika keadaan berubah. Setiap umpan balik / ide sangat dihargai, terima kasih.
Jawaban:
Ada banyak cara untuk mencapai ini. Di sini, saya telah menjelaskan dua pendekatan yang paling umum.
1. Anda dapat menggunakan interseptor axios untuk mencegat permintaan apa pun dan menambahkan header otorisasi.
2. Dari dokumentasi dari
axios
Anda dapat melihat ada mekanisme yang tersedia yang memungkinkan Anda untuk sundulan set default yang akan dikirim dengan setiap permintaan yang Anda buat.Jadi dalam kasus Anda:
Jika mau, Anda dapat membuat fungsi yang dapat dijalankan sendiri yang akan menyetel header otorisasi itu sendiri saat token ada di toko.
Sekarang Anda tidak perlu lagi melampirkan token secara manual ke setiap permintaan. Anda dapat menempatkan fungsi di atas dalam file yang dijamin akan dijalankan setiap saat ( misal: File yang berisi rute).
Semoga membantu :)
sumber
axios.defaults.header.common[Auth_Token] = token
sesederhana itu.Jika Anda menggunakan versi "axios": "^ 0.17.1", Anda dapat melakukan seperti ini:
Buat contoh aksios:
Kemudian untuk permintaan apa pun, token akan dipilih dari localStorage dan akan ditambahkan ke header permintaan.
Saya menggunakan contoh yang sama di seluruh aplikasi dengan kode ini:
Semoga berhasil.
sumber
Solusi terbaik bagi saya adalah membuat layanan klien yang akan Anda buat dengan token Anda untuk digunakan sebagai pembungkus
axios
.Di klien ini, Anda juga dapat mengambil token dari localStorage / cookie, seperti yang Anda inginkan.
sumber
Demikian pula, kami memiliki fungsi untuk mengatur atau menghapus token dari panggilan seperti ini:
Kami selalu membersihkan token yang ada saat inisialisasi, lalu menetapkan yang diterima.
sumber
Jika Anda ingin memanggil rute api lain di masa mendatang dan menyimpan token Anda di toko, coba gunakan middleware redux .
Middleware dapat mendengarkan tindakan api dan mengirimkan permintaan api melalui axios yang sesuai.
Berikut adalah contoh yang sangat mendasar:
tindakan / api.js
middleware / api.js
sumber
Terkadang Anda mendapatkan kasus di mana beberapa permintaan yang dibuat dengan aksios diarahkan ke titik akhir yang tidak menerima header otorisasi. Dengan demikian, cara alternatif untuk mengatur header otorisasi hanya pada domain yang diizinkan adalah seperti pada contoh di bawah ini. Tempatkan fungsi berikut di file mana pun yang dijalankan setiap kali aplikasi React berjalan seperti di file routes.
sumber
Coba buat contoh baru seperti yang saya lakukan di bawah ini
Bagaimana cara menggunakannya
sumber
Bertemu beberapa masalah ketika mencoba menerapkan sesuatu yang serupa dan berdasarkan jawaban ini, inilah yang saya dapatkan. Masalah yang saya alami adalah:
sumber
Intinya adalah menyetel token pada interseptor untuk setiap permintaan
sumber