-
Notifications
You must be signed in to change notification settings - Fork 6
/
provider.ts
126 lines (106 loc) · 3.76 KB
/
provider.ts
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import { AuthClient, createAuthClient, AuthRequest, ConsoleLogger } from './client';
import { IAuthConfigurator, AuthClientOptions } from './configurator';
// TODO - export from msal
export declare type AccountInfo = {
homeAccountId: string;
environment: string;
tenantId: string;
username: string;
localAccountId: string;
name?: string;
};
export interface IAuthProvider {
readonly defaultClient: AuthClient;
readonly defaultConfig: AuthClientOptions | undefined;
readonly defaultAccount: AccountInfo | undefined;
/**
* Get auth client by registered config name
*/
getClient(name: string): AuthClient;
/**
* Create auth client by registered config name
* @param name name of configured client, default to defaultConfig {@link IAuthConfigurator.configureDefault}
*/
createClient(name?: string): AuthClient;
/**
* Acquire token from default auth client
* @param req Auth request options
*/
acquireToken(req: AuthRequest): ReturnType<AuthClient['acquireToken']>;
/**
* Acquire access token from default auth client
* @param req Auth request options
*/
acquireAccessToken(req: AuthRequest): Promise<string | undefined>;
/**
* Login to default auth client
*/
login(): Promise<void>;
/**
* Handle default client redirect callback
*/
handleRedirect(): ReturnType<AuthClient['handleRedirectPromise']>;
}
const DEFAULT_CLIENT_NAME = 'default';
export class AuthProvider implements IAuthProvider {
protected _clients: Record<string, AuthClient> = {};
get defaultClient(): AuthClient {
return this.getClient(DEFAULT_CLIENT_NAME);
}
get defaultAccount(): AccountInfo | undefined {
return this.defaultClient.account;
}
get defaultConfig(): AuthClientOptions | undefined {
return this._config.defaultConfig;
}
constructor(protected _config: IAuthConfigurator) {}
getClient(name: string): AuthClient {
if (!this._clients[name]) {
this._clients[name] = this.createClient(name);
}
return this._clients[name];
}
createClient(name?: string): AuthClient {
const config = name ? this._config.getClientConfig(name) : this._config.defaultConfig;
if (!config) {
throw Error('Could not find any config');
}
const client = createAuthClient(
config.tenantId,
config.clientId,
config.redirectUri,
config.config,
);
// TODO - fix with log streamer
client.setLogger(new ConsoleLogger(0));
return client;
}
async handleRedirect(): ReturnType<AuthClient['handleRedirectPromise']> {
const { redirectUri } = this.defaultConfig || {};
if (window.location.pathname === redirectUri) {
const client = this.defaultClient;
const logger = client.getLogger();
const { requestOrigin } = client;
await client.handleRedirectPromise();
if (requestOrigin === redirectUri) {
logger.warning(
`detected callback loop from url ${redirectUri}, redirecting to root`,
);
window.location.replace('/');
} else {
window.location.replace(requestOrigin || '/');
}
}
return null;
}
acquireToken(req: AuthRequest): ReturnType<AuthClient['acquireToken']> {
return this.defaultClient.acquireToken(req);
}
async acquireAccessToken(req: AuthRequest): Promise<string | undefined> {
const token = await this.acquireToken(req);
return token ? token.accessToken : undefined;
}
async login(): Promise<void> {
await this.defaultClient.login();
}
}