45 lines
1.3 KiB
TypeScript
Executable File
45 lines
1.3 KiB
TypeScript
Executable File
import axios from 'axios';
|
|
|
|
// Set CSRF token for all requests
|
|
axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
|
|
axios.defaults.withCredentials = true;
|
|
|
|
// Intercept requests to add fresh CSRF token
|
|
axios.interceptors.request.use((config) => {
|
|
let csrfToken = null;
|
|
|
|
// Try to get CSRF token from meta tag first (most reliable)
|
|
const metaToken = document.head.querySelector('meta[name="csrf-token"]');
|
|
if (metaToken) {
|
|
csrfToken = (metaToken as HTMLMetaElement).content;
|
|
}
|
|
|
|
// Override with Inertia token if available (fresher after login)
|
|
try {
|
|
if (typeof window !== 'undefined' && (window as any).page?.props?.csrf_token) {
|
|
csrfToken = (window as any).page.props.csrf_token;
|
|
}
|
|
} catch (e) {
|
|
// Ignore errors
|
|
}
|
|
|
|
// Last resort: try to get from the XSRF-TOKEN cookie if it exists
|
|
if (!csrfToken) {
|
|
const name = 'XSRF-TOKEN=';
|
|
const decodedCookie = decodeURIComponent(document.cookie);
|
|
const ca = decodedCookie.split(';');
|
|
for (let i = 0; i < ca.length; i++) {
|
|
let c = ca[i];
|
|
while (c.charAt(0) === ' ') c = c.substring(1);
|
|
if (c.indexOf(name) === 0) csrfToken = c.substring(name.length, c.length);
|
|
}
|
|
}
|
|
|
|
if (csrfToken) {
|
|
config.headers['X-CSRF-TOKEN'] = csrfToken;
|
|
}
|
|
|
|
return config;
|
|
});
|
|
|
|
export default axios; |