-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathauth.ts
More file actions
99 lines (86 loc) · 2.57 KB
/
auth.ts
File metadata and controls
99 lines (86 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { AxiosInstance } from "axios";
import { createClient } from "./client";
import { AccessToken, Config, UserConfig } from "./common";
export type TokenRefresher = () => Promise<string>;
export type Authorizer = (
config: Config,
client?: AxiosInstance
) => Promise<AccessToken>;
interface OAuthCredentials {
accessToken: string;
expires: number;
}
export function createTokenRefresher(
authorize: Authorizer,
config: Config
): TokenRefresher {
let credentials: OAuthCredentials;
return () => {
if (isExpired(credentials)) {
return authorize(config)
.then((accessToken: AccessToken) => {
const { access_token, expires_in }: AccessToken = accessToken;
const expires: number = Date.now() + expires_in * 1000 - 60000;
return {
accessToken: access_token,
expires
};
})
.then(freshCredentials => {
credentials = freshCredentials;
return credentials.accessToken;
});
}
return Promise.resolve(credentials.accessToken);
};
}
export const authorizeCollections: Authorizer = function(
config: Config,
client: AxiosInstance = createClient(config)
): Promise<AccessToken> {
const basicAuthToken: string = createBasicAuthToken(config);
return client
.post<AccessToken>("/collection/token/", null, {
headers: {
Authorization: `Basic ${basicAuthToken}`
}
})
.then(response => response.data);
};
export const authorizeDisbursements: Authorizer = function(
config: Config,
client: AxiosInstance = createClient(config)
): Promise<AccessToken> {
const basicAuthToken: string = createBasicAuthToken(config);
return client
.post<AccessToken>("/disbursement/token/", null, {
headers: {
Authorization: `Basic ${basicAuthToken}`
}
})
.then(response => response.data);
};
export const authorizeRemittances: Authorizer = function(
config: Config,
client: AxiosInstance = createClient(config)
): Promise<AccessToken> {
const basicAuthToken: string = createBasicAuthToken(config);
return client
.post<AccessToken>("/remittance/token/", null, {
headers: {
Authorization: `Basic ${basicAuthToken}`
}
})
.then(response => response.data);
};
export function createBasicAuthToken(config: UserConfig): string {
return Buffer.from(`${config.userId}:${config.userSecret}`).toString(
"base64"
);
}
function isExpired(credentials: OAuthCredentials): boolean {
if (!credentials || !credentials.expires) {
return true;
}
return Date.now() > credentials.expires;
}