Skip to content

Commit 391b88f

Browse files
committed
refactor!: manually fetch csrf cookie
1 parent bbf71bf commit 391b88f

File tree

5 files changed

+53
-36
lines changed

5 files changed

+53
-36
lines changed

src/httpClient.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
import { HttpMethod } from './drivers/default/enums/httpMethod';
22
import { Orion } from './orion';
3-
import { AuthDriver } from './drivers/default/enums/authDriver';
43
import { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios';
54

65
export class HttpClient {
7-
protected static xsrfTokenFetched: boolean = false;
86
protected baseUrl: string;
97
protected client: AxiosInstance;
108

@@ -19,10 +17,6 @@ export class HttpClient {
1917
params: any = {},
2018
data: any = {}
2119
): Promise<AxiosResponse> {
22-
if (Orion.getAuthDriver() === AuthDriver.Sanctum) {
23-
await this.prefetchXSRFToken();
24-
}
25-
2620
const config: AxiosRequestConfig = Object.assign(Orion.getHttpClientConfig(), {
2721
baseURL: this.baseUrl,
2822
url,
@@ -37,21 +31,6 @@ export class HttpClient {
3731
return this.client.request(config);
3832
}
3933

40-
public async prefetchXSRFToken(): Promise<void> {
41-
if (HttpClient.xsrfTokenFetched) {
42-
return;
43-
}
44-
45-
await this.client
46-
.get(`sanctum/csrf-cookie`, { baseURL: Orion.getHost() })
47-
.then(() => {
48-
HttpClient.xsrfTokenFetched = true;
49-
})
50-
.catch(() => {
51-
HttpClient.xsrfTokenFetched = false;
52-
});
53-
}
54-
5534
public getAxios(): AxiosInstance {
5635
return this.client;
5736
}

src/orion.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,18 @@ export class Orion {
9999
return this;
100100
}
101101

102+
public static async csrf(): Promise<void> {
103+
if (this.authDriver !== AuthDriver.Sanctum) {
104+
throw new Error(
105+
`Current auth driver is set to "${this.authDriver}". Fetching CSRF cookie can only be used with "sanctum" driver.`
106+
);
107+
}
108+
109+
await Orion.makeHttpClient()
110+
.getAxios()
111+
.get(`sanctum/csrf-cookie`, { baseURL: Orion.getHost() });
112+
}
113+
102114
protected static buildHttpClientConfig(): AxiosRequestConfig {
103115
const config: AxiosRequestConfig = {
104116
withCredentials: Orion.getAuthDriver() === AuthDriver.Sanctum,
Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Orion } from '../../src/orion';
22
import makeServer from './drivers/default/server';
33
import { HttpMethod } from '../../src/drivers/default/enums/httpMethod';
4-
import { AuthDriver } from '../../src/drivers/default/enums/authDriver';
54

65
let server: any;
76

@@ -23,18 +22,4 @@ describe('HttpClient tests', () => {
2322
const requests = server.pretender.handledRequests;
2423
expect(requests[0].requestHeaders['Authorization']).toStrictEqual('Bearer test');
2524
});
26-
27-
test('prefetching xsrf token', async () => {
28-
server.schema.posts.create({ title: 'Test Post' });
29-
30-
Orion.setAuthDriver(AuthDriver.Sanctum);
31-
await Orion.makeHttpClient().request('/posts', HttpMethod.GET);
32-
33-
const requests = server.pretender.handledRequests;
34-
expect(requests[0].url).toBe('https://api-mock.test/sanctum/csrf-cookie');
35-
expect(requests[1].url).toBe('https://api-mock.test/api/posts');
36-
37-
await Orion.makeHttpClient().request('/posts', HttpMethod.GET);
38-
expect(requests[2].url).toBe('https://api-mock.test/api/posts');
39-
});
4025
});

tests/integration/orion.test.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
import { Orion } from '../../src/orion';
2+
import { AuthDriver } from '../../src/drivers/default/enums/authDriver';
3+
import makeServer from './drivers/default/server';
4+
5+
let server: any;
6+
7+
beforeEach(() => {
8+
server = makeServer();
9+
});
10+
11+
afterEach(() => {
12+
server.shutdown();
13+
});
14+
15+
describe('Orion tests', () => {
16+
test('fetching csrf cookie', async () => {
17+
Orion.setAuthDriver(AuthDriver.Sanctum);
18+
19+
await Orion.csrf();
20+
21+
const requests = server.pretender.handledRequests;
22+
expect(requests[0].url).toBe('https://api-mock.test/sanctum/csrf-cookie');
23+
});
24+
25+
test('attempting to fetch csrf cookie with invalid driver', async () => {
26+
Orion.setAuthDriver(AuthDriver.Passport);
27+
28+
try {
29+
await Orion.csrf();
30+
expect(false).toBeTruthy();
31+
} catch (error) {
32+
expect(error.message).toBe(
33+
`Current auth driver is set to "${AuthDriver.Passport}". Fetching CSRF cookie can only be used with "sanctum" driver.`
34+
);
35+
}
36+
37+
const requests = server.pretender.handledRequests;
38+
expect(requests).toHaveLength(0);
39+
});
40+
});

tests/unit/orion.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { Orion } from '../../src/orion';
22
import { AuthDriver } from '../../src/drivers/default/enums/authDriver';
33
import axios from 'axios';
4+
import { HttpMethod } from '../../src/drivers/default/enums/httpMethod';
45

56
describe('Orion tests', () => {
67
test('initialization', () => {

0 commit comments

Comments
 (0)