zavadil-ts-common 1.2.78 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +27 -23
- package/dist/index.esm.js +1 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/oauth/OAuthRestClient.d.ts +9 -6
- package/dist/oauth/OAuthTokenManager.d.ts +11 -11
- package/dist/oauth/RestClientWithOAuth.d.ts +4 -4
- package/dist/oauth/tokenprovider/OAuthRefreshTokenProvider.d.ts +5 -0
- package/dist/oauth/tokenprovider/RefreshTokenProviderDefault.d.ts +14 -0
- package/dist/oauth/tokenprovider/RefreshTokenProviderLogin.d.ts +12 -0
- package/dist/oauth/tokenprovider/RefreshTokenProviderStorage.d.ts +10 -0
- package/dist/oauth/tokenprovider/RefreshTokenProviderUrl.d.ts +12 -0
- package/dist/util/NumberUtil.d.ts +2 -2
- package/dist/util/ObjectUtil.d.ts +1 -1
- package/package.json +1 -1
- package/src/oauth/OAuthRestClient.ts +20 -9
- package/src/oauth/OAuthTokenManager.ts +29 -29
- package/src/oauth/RestClientWithOAuth.ts +11 -11
- package/src/oauth/tokenprovider/OAuthRefreshTokenProvider.ts +6 -0
- package/src/oauth/tokenprovider/RefreshTokenProviderDefault.ts +52 -0
- package/src/oauth/tokenprovider/{IdTokenProviderLogin.ts → RefreshTokenProviderLogin.ts} +3 -3
- package/src/oauth/tokenprovider/{IdTokenProviderStorage.ts → RefreshTokenProviderStorage.ts} +9 -9
- package/src/oauth/tokenprovider/{IdTokenProviderUrl.ts → RefreshTokenProviderUrl.ts} +7 -7
- package/src/util/NumberUtil.ts +5 -1
- package/src/util/OAuthUtil.ts +2 -1
- package/src/util/ObjectUtil.ts +1 -1
- package/src/oauth/tokenprovider/IdTokenProviderDefault.ts +0 -52
- package/src/oauth/tokenprovider/OAuthIdTokenProvider.ts +0 -6
|
@@ -3,13 +3,13 @@ export type TokenRequestPayloadBase = {
|
|
|
3
3
|
targetAudience: string;
|
|
4
4
|
};
|
|
5
5
|
export type RequestAccessTokenPayload = TokenRequestPayloadBase & {
|
|
6
|
-
|
|
6
|
+
refreshToken: string;
|
|
7
7
|
privilege: string;
|
|
8
8
|
};
|
|
9
|
-
export type
|
|
10
|
-
|
|
9
|
+
export type RenewRefreshTokenPayload = {
|
|
10
|
+
refreshToken: string;
|
|
11
11
|
};
|
|
12
|
-
export type
|
|
12
|
+
export type RequestRefreshTokenFromLoginPayload = TokenRequestPayloadBase & {
|
|
13
13
|
login: string;
|
|
14
14
|
password: string;
|
|
15
15
|
};
|
|
@@ -20,6 +20,7 @@ export type TokenResponsePayloadBase = {
|
|
|
20
20
|
};
|
|
21
21
|
export type IdTokenPayload = TokenResponsePayloadBase & {};
|
|
22
22
|
export type AccessTokenPayload = TokenResponsePayloadBase & {};
|
|
23
|
+
export type RefreshTokenPayload = TokenResponsePayloadBase & {};
|
|
23
24
|
export type JwKeyPayload = {
|
|
24
25
|
kty: string;
|
|
25
26
|
kid: string;
|
|
@@ -36,8 +37,10 @@ export type JwksPayload = {
|
|
|
36
37
|
export declare class OAuthRestClient extends RestClient {
|
|
37
38
|
constructor(oauthUrl: string);
|
|
38
39
|
jwks(): Promise<JwksPayload>;
|
|
40
|
+
verifyRefreshToken(refreshToken: string): Promise<RefreshTokenPayload>;
|
|
41
|
+
verifyAccessToken(accessToken: string): Promise<AccessTokenPayload>;
|
|
39
42
|
verifyIdToken(idToken: string): Promise<IdTokenPayload>;
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
requestRefreshTokenFromLogin(request: RequestRefreshTokenFromLoginPayload): Promise<RefreshTokenPayload>;
|
|
44
|
+
renewRefreshToken(request: RenewRefreshTokenPayload): Promise<RefreshTokenPayload>;
|
|
42
45
|
requestAccessToken(request: RequestAccessTokenPayload): Promise<AccessTokenPayload>;
|
|
43
46
|
}
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
import { AccessTokenPayload, IdTokenPayload, OAuthRestClient } from "./OAuthRestClient";
|
|
2
|
-
import {
|
|
1
|
+
import { AccessTokenPayload, IdTokenPayload, OAuthRestClient, RefreshTokenPayload } from "./OAuthRestClient";
|
|
2
|
+
import { OAuthRefreshTokenProvider } from "./tokenprovider/OAuthRefreshTokenProvider";
|
|
3
3
|
/**
|
|
4
4
|
* Manages refresh of id and access tokens.
|
|
5
5
|
*/
|
|
6
|
-
export declare class OAuthTokenManager implements
|
|
6
|
+
export declare class OAuthTokenManager implements OAuthRefreshTokenProvider {
|
|
7
7
|
oAuthServer: OAuthRestClient;
|
|
8
8
|
audience: string;
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
refreshToken?: RefreshTokenPayload;
|
|
10
|
+
initialRefreshTokenProvider: OAuthRefreshTokenProvider;
|
|
11
11
|
accessTokens: Map<string, AccessTokenPayload>;
|
|
12
|
-
constructor(oAuthServerBaseUrl: string, targetAudience: string,
|
|
13
|
-
|
|
12
|
+
constructor(oAuthServerBaseUrl: string, targetAudience: string, initialRefreshTokenProvider: OAuthRefreshTokenProvider);
|
|
13
|
+
hasValidRefreshToken(): boolean;
|
|
14
14
|
hasValidAccessToken(privilege: string): boolean;
|
|
15
15
|
reset(): Promise<any>;
|
|
16
16
|
/**
|
|
17
17
|
* Get stored id token or ask the provider, this will trigger redirect to login screen in case of the default provider
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
getRefreshTokenInternal(): Promise<RefreshTokenPayload>;
|
|
20
20
|
/**
|
|
21
21
|
* Get id token, refresh it if needed
|
|
22
22
|
*/
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
getRefreshToken(): Promise<IdTokenPayload>;
|
|
24
|
+
getRefreshTokenRaw(): Promise<string>;
|
|
25
|
+
setRefreshToken(token?: IdTokenPayload): void;
|
|
26
26
|
verifyIdToken(token: string): Promise<IdTokenPayload>;
|
|
27
27
|
login(login: string, password: string): Promise<any>;
|
|
28
28
|
private getAccessTokenInternal;
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { OAuthTokenManager } from "./OAuthTokenManager";
|
|
2
2
|
import { RestClient } from "../client";
|
|
3
3
|
import { IdTokenPayload } from "./OAuthRestClient";
|
|
4
|
-
import {
|
|
4
|
+
import { OAuthRefreshTokenProvider } from "./tokenprovider/OAuthRefreshTokenProvider";
|
|
5
5
|
export type ServerOAuthInfoPayload = {
|
|
6
6
|
debugMode?: boolean;
|
|
7
7
|
targetAudience: string;
|
|
8
8
|
oauthServerUrl: string;
|
|
9
9
|
version: string;
|
|
10
10
|
};
|
|
11
|
-
export declare class RestClientWithOAuth extends RestClient implements
|
|
11
|
+
export declare class RestClientWithOAuth extends RestClient implements OAuthRefreshTokenProvider {
|
|
12
12
|
private insecureClient;
|
|
13
13
|
private freshIdTokenProvider;
|
|
14
14
|
private tokenManager;
|
|
15
15
|
private serverInfo;
|
|
16
16
|
private defaultPrivilege;
|
|
17
|
-
constructor(url: string, freshIdTokenProvider?:
|
|
18
|
-
|
|
17
|
+
constructor(url: string, freshIdTokenProvider?: OAuthRefreshTokenProvider, defaultPrivilege?: string);
|
|
18
|
+
getRefreshToken(): Promise<IdTokenPayload>;
|
|
19
19
|
/**
|
|
20
20
|
* Attempt to get ID token from token manager
|
|
21
21
|
*/
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { OAuthRefreshTokenProvider } from "./OAuthRefreshTokenProvider";
|
|
2
|
+
import { IdTokenPayload } from "../OAuthRestClient";
|
|
3
|
+
import { RefreshTokenProviderLogin } from "./RefreshTokenProviderLogin";
|
|
4
|
+
import { RestClientWithOAuth } from "../RestClientWithOAuth";
|
|
5
|
+
import { RefreshTokenProviderUrl } from "./RefreshTokenProviderUrl";
|
|
6
|
+
import { RefreshTokenProviderStorage } from "./RefreshTokenProviderStorage";
|
|
7
|
+
export declare class RefreshTokenProviderDefault implements OAuthRefreshTokenProvider {
|
|
8
|
+
login: RefreshTokenProviderLogin;
|
|
9
|
+
url: RefreshTokenProviderUrl;
|
|
10
|
+
storage: RefreshTokenProviderStorage;
|
|
11
|
+
constructor(client: RestClientWithOAuth, tokenStorageKey?: string, tokenUrlName?: string);
|
|
12
|
+
getRefreshToken(): Promise<IdTokenPayload>;
|
|
13
|
+
reset(): Promise<any>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { OAuthRefreshTokenProvider } from "./OAuthRefreshTokenProvider";
|
|
2
|
+
import { IdTokenPayload } from "../OAuthRestClient";
|
|
3
|
+
import { RedirectionProvider } from "./RedirectionProvider";
|
|
4
|
+
import { RestClientWithOAuth } from "../RestClientWithOAuth";
|
|
5
|
+
export declare class RefreshTokenProviderLogin extends RedirectionProvider implements OAuthRefreshTokenProvider {
|
|
6
|
+
client: RestClientWithOAuth;
|
|
7
|
+
tokenQueryName: string;
|
|
8
|
+
constructor(client: RestClientWithOAuth, tokenQueryName?: string);
|
|
9
|
+
redirectToLogin(): Promise<any>;
|
|
10
|
+
getRefreshToken(): Promise<IdTokenPayload>;
|
|
11
|
+
reset(): Promise<any>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { OAuthRefreshTokenProvider } from "./OAuthRefreshTokenProvider";
|
|
2
|
+
import { RefreshTokenPayload } from "../OAuthRestClient";
|
|
3
|
+
export declare class RefreshTokenProviderStorage implements OAuthRefreshTokenProvider {
|
|
4
|
+
key: string;
|
|
5
|
+
constructor(storageKey?: string);
|
|
6
|
+
saveRefreshTokenToLocalStorage(token: RefreshTokenPayload | null): void;
|
|
7
|
+
getRefreshTokenFromLocalStorage(): RefreshTokenPayload | null | undefined;
|
|
8
|
+
getRefreshToken(): Promise<RefreshTokenPayload>;
|
|
9
|
+
reset(): Promise<any>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { OAuthRefreshTokenProvider } from "./OAuthRefreshTokenProvider";
|
|
2
|
+
import { RefreshTokenPayload } from "../OAuthRestClient";
|
|
3
|
+
import { RestClientWithOAuth } from "../RestClientWithOAuth";
|
|
4
|
+
import { RedirectionProvider } from "./RedirectionProvider";
|
|
5
|
+
export declare class RefreshTokenProviderUrl extends RedirectionProvider implements OAuthRefreshTokenProvider {
|
|
6
|
+
client: RestClientWithOAuth;
|
|
7
|
+
tokenQueryName: string;
|
|
8
|
+
constructor(client: RestClientWithOAuth, tokenQueryName?: string);
|
|
9
|
+
getRefreshTokenFromUrl(): string | null;
|
|
10
|
+
getRefreshToken(): Promise<RefreshTokenPayload>;
|
|
11
|
+
reset(): Promise<any>;
|
|
12
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
export declare class NumberUtil {
|
|
2
|
+
static isEmpty(n: any): n is null | undefined;
|
|
3
3
|
static notEmpty(n?: number | null): n is number;
|
|
4
4
|
static parseNumber(str: string | null | undefined): number | null;
|
|
5
5
|
static round(n: number, d?: number): number;
|
package/package.json
CHANGED
|
@@ -6,15 +6,15 @@ export type TokenRequestPayloadBase = {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
export type RequestAccessTokenPayload = TokenRequestPayloadBase & {
|
|
9
|
-
|
|
9
|
+
refreshToken: string;
|
|
10
10
|
privilege: string;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
export type
|
|
14
|
-
|
|
13
|
+
export type RenewRefreshTokenPayload = {
|
|
14
|
+
refreshToken: string;
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
export type
|
|
17
|
+
export type RequestRefreshTokenFromLoginPayload = TokenRequestPayloadBase & {
|
|
18
18
|
login: string;
|
|
19
19
|
password: string;
|
|
20
20
|
}
|
|
@@ -31,6 +31,9 @@ export type IdTokenPayload = TokenResponsePayloadBase & {
|
|
|
31
31
|
export type AccessTokenPayload = TokenResponsePayloadBase & {
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
export type RefreshTokenPayload = TokenResponsePayloadBase & {
|
|
35
|
+
}
|
|
36
|
+
|
|
34
37
|
export type JwKeyPayload = {
|
|
35
38
|
kty: string;
|
|
36
39
|
kid: string;
|
|
@@ -56,20 +59,28 @@ export class OAuthRestClient extends RestClient {
|
|
|
56
59
|
return this.getJson('jwks.json');
|
|
57
60
|
}
|
|
58
61
|
|
|
62
|
+
verifyRefreshToken(refreshToken: string): Promise<RefreshTokenPayload> {
|
|
63
|
+
return this.getJson(`refresh-tokens/verify/${refreshToken}`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
verifyAccessToken(accessToken: string): Promise<AccessTokenPayload> {
|
|
67
|
+
return this.getJson(`access-tokens/verify/${accessToken}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
59
70
|
verifyIdToken(idToken: string): Promise<IdTokenPayload> {
|
|
60
71
|
return this.getJson(`id-tokens/verify/${idToken}`);
|
|
61
72
|
}
|
|
62
73
|
|
|
63
|
-
|
|
64
|
-
return this.postJson('
|
|
74
|
+
requestRefreshTokenFromLogin(request: RequestRefreshTokenFromLoginPayload): Promise<RefreshTokenPayload> {
|
|
75
|
+
return this.postJson('refresh-tokens/from-login', request);
|
|
65
76
|
}
|
|
66
77
|
|
|
67
|
-
|
|
68
|
-
return this.postJson('
|
|
78
|
+
renewRefreshToken(request: RenewRefreshTokenPayload): Promise<RefreshTokenPayload> {
|
|
79
|
+
return this.postJson('refresh-tokens/renew', request);
|
|
69
80
|
}
|
|
70
81
|
|
|
71
82
|
requestAccessToken(request: RequestAccessTokenPayload): Promise<AccessTokenPayload> {
|
|
72
|
-
return this.postJson('access-tokens/from-
|
|
83
|
+
return this.postJson('access-tokens/from-refresh-token', request);
|
|
73
84
|
}
|
|
74
85
|
|
|
75
86
|
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import {AccessTokenPayload, IdTokenPayload, OAuthRestClient} from "./OAuthRestClient";
|
|
2
|
-
import {
|
|
1
|
+
import {AccessTokenPayload, IdTokenPayload, OAuthRestClient, RefreshTokenPayload} from "./OAuthRestClient";
|
|
2
|
+
import {OAuthRefreshTokenProvider} from "./tokenprovider/OAuthRefreshTokenProvider";
|
|
3
3
|
import {OAuthUtil} from "../util/OAuthUtil";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Manages refresh of id and access tokens.
|
|
7
7
|
*/
|
|
8
|
-
export class OAuthTokenManager implements
|
|
8
|
+
export class OAuthTokenManager implements OAuthRefreshTokenProvider {
|
|
9
9
|
|
|
10
10
|
oAuthServer: OAuthRestClient;
|
|
11
11
|
|
|
12
12
|
audience: string;
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
refreshToken?: RefreshTokenPayload;
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
initialRefreshTokenProvider: OAuthRefreshTokenProvider;
|
|
17
17
|
|
|
18
18
|
accessTokens: Map<string, AccessTokenPayload>;
|
|
19
19
|
|
|
20
|
-
constructor(oAuthServerBaseUrl: string, targetAudience: string,
|
|
21
|
-
this.
|
|
20
|
+
constructor(oAuthServerBaseUrl: string, targetAudience: string, initialRefreshTokenProvider: OAuthRefreshTokenProvider) {
|
|
21
|
+
this.initialRefreshTokenProvider = initialRefreshTokenProvider;
|
|
22
22
|
this.audience = targetAudience;
|
|
23
23
|
this.oAuthServer = new OAuthRestClient(oAuthServerBaseUrl);
|
|
24
24
|
this.accessTokens = new Map<string, AccessTokenPayload>();
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
return OAuthUtil.isValidToken(this.
|
|
27
|
+
hasValidRefreshToken(): boolean {
|
|
28
|
+
return OAuthUtil.isValidToken(this.refreshToken);
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
hasValidAccessToken(privilege: string): boolean {
|
|
@@ -33,26 +33,26 @@ export class OAuthTokenManager implements OAuthIdTokenProvider {
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
reset(): Promise<any> {
|
|
36
|
-
this.
|
|
36
|
+
this.refreshToken = undefined;
|
|
37
37
|
this.accessTokens.clear();
|
|
38
|
-
return this.
|
|
38
|
+
return this.initialRefreshTokenProvider.reset();
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
/**
|
|
42
42
|
* Get stored id token or ask the provider, this will trigger redirect to login screen in case of the default provider
|
|
43
43
|
*/
|
|
44
|
-
|
|
45
|
-
if (this.
|
|
46
|
-
return this.
|
|
44
|
+
getRefreshTokenInternal(): Promise<RefreshTokenPayload> {
|
|
45
|
+
if (this.hasValidRefreshToken() && this.refreshToken !== undefined) {
|
|
46
|
+
return Promise.resolve(this.refreshToken);
|
|
47
47
|
}
|
|
48
|
-
return
|
|
48
|
+
return this.initialRefreshTokenProvider.getRefreshToken();
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
52
|
* Get id token, refresh it if needed
|
|
53
53
|
*/
|
|
54
|
-
|
|
55
|
-
return this.
|
|
54
|
+
getRefreshToken(): Promise<IdTokenPayload> {
|
|
55
|
+
return this.getRefreshTokenInternal()
|
|
56
56
|
.then(
|
|
57
57
|
(t: IdTokenPayload) => {
|
|
58
58
|
if (!OAuthUtil.isValidToken(t)) {
|
|
@@ -61,26 +61,26 @@ export class OAuthTokenManager implements OAuthIdTokenProvider {
|
|
|
61
61
|
}
|
|
62
62
|
if (OAuthUtil.isTokenReadyForRefresh(t)) {
|
|
63
63
|
return this.oAuthServer
|
|
64
|
-
.
|
|
64
|
+
.renewRefreshToken({refreshToken: t.token})
|
|
65
65
|
.then(
|
|
66
66
|
(t) => {
|
|
67
|
-
this.
|
|
67
|
+
this.setRefreshToken(t);
|
|
68
68
|
return t;
|
|
69
69
|
}
|
|
70
70
|
);
|
|
71
71
|
}
|
|
72
|
-
this.
|
|
72
|
+
this.setRefreshToken(t);
|
|
73
73
|
return Promise.resolve(t);
|
|
74
74
|
}
|
|
75
75
|
);
|
|
76
76
|
}
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
return this.
|
|
78
|
+
getRefreshTokenRaw(): Promise<string> {
|
|
79
|
+
return this.getRefreshToken().then(t => t.token);
|
|
80
80
|
}
|
|
81
81
|
|
|
82
|
-
|
|
83
|
-
this.
|
|
82
|
+
setRefreshToken(token?: IdTokenPayload) {
|
|
83
|
+
this.refreshToken = token;
|
|
84
84
|
}
|
|
85
85
|
|
|
86
86
|
verifyIdToken(token: string): Promise<IdTokenPayload> {
|
|
@@ -90,15 +90,15 @@ export class OAuthTokenManager implements OAuthIdTokenProvider {
|
|
|
90
90
|
login(login: string, password: string): Promise<any> {
|
|
91
91
|
this.reset();
|
|
92
92
|
return this.oAuthServer
|
|
93
|
-
.
|
|
94
|
-
.then((t) => this.
|
|
93
|
+
.requestRefreshTokenFromLogin({login: login, password: password, targetAudience: this.audience})
|
|
94
|
+
.then((t) => this.setRefreshToken(t));
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
private getAccessTokenInternal(privilege: string): Promise<AccessTokenPayload> {
|
|
98
|
-
return this.
|
|
98
|
+
return this.getRefreshTokenRaw()
|
|
99
99
|
.then(
|
|
100
|
-
(
|
|
101
|
-
.requestAccessToken({
|
|
100
|
+
(refreshToken: string) => this.oAuthServer
|
|
101
|
+
.requestAccessToken({refreshToken: refreshToken, targetAudience: this.audience, privilege: privilege})
|
|
102
102
|
.then((act: AccessTokenPayload) => {
|
|
103
103
|
if (!OAuthUtil.isValidToken(act)) {
|
|
104
104
|
return Promise.reject("Received access token is not valid!");
|
|
@@ -2,8 +2,8 @@ import {OAuthTokenManager} from "./OAuthTokenManager";
|
|
|
2
2
|
import {RestClient} from "../client";
|
|
3
3
|
import {IdTokenPayload, TokenResponsePayloadBase} from "./OAuthRestClient";
|
|
4
4
|
import {LazyAsync} from "../cache";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import {OAuthRefreshTokenProvider} from "./tokenprovider/OAuthRefreshTokenProvider";
|
|
6
|
+
import {RefreshTokenProviderDefault} from "./tokenprovider/RefreshTokenProviderDefault";
|
|
7
7
|
|
|
8
8
|
export type ServerOAuthInfoPayload = {
|
|
9
9
|
debugMode?: boolean;
|
|
@@ -12,11 +12,11 @@ export type ServerOAuthInfoPayload = {
|
|
|
12
12
|
version: string;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
export class RestClientWithOAuth extends RestClient implements
|
|
15
|
+
export class RestClientWithOAuth extends RestClient implements OAuthRefreshTokenProvider {
|
|
16
16
|
|
|
17
17
|
private insecureClient: RestClient;
|
|
18
18
|
|
|
19
|
-
private freshIdTokenProvider:
|
|
19
|
+
private freshIdTokenProvider: OAuthRefreshTokenProvider;
|
|
20
20
|
|
|
21
21
|
private tokenManager: LazyAsync<OAuthTokenManager>;
|
|
22
22
|
|
|
@@ -24,10 +24,10 @@ export class RestClientWithOAuth extends RestClient implements OAuthIdTokenProvi
|
|
|
24
24
|
|
|
25
25
|
private defaultPrivilege: string;
|
|
26
26
|
|
|
27
|
-
constructor(url: string, freshIdTokenProvider?:
|
|
27
|
+
constructor(url: string, freshIdTokenProvider?: OAuthRefreshTokenProvider, defaultPrivilege: string = '*') {
|
|
28
28
|
super(url);
|
|
29
29
|
|
|
30
|
-
this.freshIdTokenProvider = freshIdTokenProvider || new
|
|
30
|
+
this.freshIdTokenProvider = freshIdTokenProvider || new RefreshTokenProviderDefault(this);
|
|
31
31
|
this.defaultPrivilege = defaultPrivilege;
|
|
32
32
|
|
|
33
33
|
// rest client without OAuth headers
|
|
@@ -37,15 +37,15 @@ export class RestClientWithOAuth extends RestClient implements OAuthIdTokenProvi
|
|
|
37
37
|
this.tokenManager = new LazyAsync<OAuthTokenManager>(() => this.getTokenManagerInternal());
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
return this.getTokenManager().then(t => t.
|
|
40
|
+
getRefreshToken(): Promise<IdTokenPayload> {
|
|
41
|
+
return this.getTokenManager().then(t => t.getRefreshToken());
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* Attempt to get ID token from token manager
|
|
46
46
|
*/
|
|
47
47
|
initialize(): Promise<any> {
|
|
48
|
-
return this.
|
|
48
|
+
return this.getRefreshToken();
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
logout(): Promise<any> {
|
|
@@ -75,7 +75,7 @@ export class RestClientWithOAuth extends RestClient implements OAuthIdTokenProvi
|
|
|
75
75
|
protected getTokenManagerInternal(): Promise<OAuthTokenManager> {
|
|
76
76
|
return this
|
|
77
77
|
.getServerInfo()
|
|
78
|
-
.then((info) =>
|
|
78
|
+
.then((info) => new OAuthTokenManager(info.oauthServerUrl, info.targetAudience, this.freshIdTokenProvider));
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
getTokenManager(): Promise<OAuthTokenManager> {
|
|
@@ -88,7 +88,7 @@ export class RestClientWithOAuth extends RestClient implements OAuthIdTokenProvi
|
|
|
88
88
|
|
|
89
89
|
setIdToken(token: IdTokenPayload): Promise<any> {
|
|
90
90
|
return this.getTokenManager()
|
|
91
|
-
.then((m) => m.
|
|
91
|
+
.then((m) => m.setRefreshToken(token));
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
getHeaders(endpoint: string): Promise<Headers> {
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import {OAuthRefreshTokenProvider} from "./OAuthRefreshTokenProvider";
|
|
2
|
+
import {IdTokenPayload} from "../OAuthRestClient";
|
|
3
|
+
import {RefreshTokenProviderLogin} from "./RefreshTokenProviderLogin";
|
|
4
|
+
import {RestClientWithOAuth} from "../RestClientWithOAuth";
|
|
5
|
+
import {RefreshTokenProviderUrl} from "./RefreshTokenProviderUrl";
|
|
6
|
+
import {RefreshTokenProviderStorage} from "./RefreshTokenProviderStorage";
|
|
7
|
+
|
|
8
|
+
export class RefreshTokenProviderDefault implements OAuthRefreshTokenProvider {
|
|
9
|
+
|
|
10
|
+
login: RefreshTokenProviderLogin;
|
|
11
|
+
|
|
12
|
+
url: RefreshTokenProviderUrl;
|
|
13
|
+
|
|
14
|
+
storage: RefreshTokenProviderStorage;
|
|
15
|
+
|
|
16
|
+
constructor(client: RestClientWithOAuth, tokenStorageKey?: string, tokenUrlName?: string) {
|
|
17
|
+
this.login = new RefreshTokenProviderLogin(client, tokenUrlName);
|
|
18
|
+
this.url = new RefreshTokenProviderUrl(client, tokenUrlName);
|
|
19
|
+
this.storage = new RefreshTokenProviderStorage(tokenStorageKey);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getRefreshToken(): Promise<IdTokenPayload> {
|
|
23
|
+
return this.url
|
|
24
|
+
.getRefreshToken()
|
|
25
|
+
.catch(
|
|
26
|
+
(err) => {
|
|
27
|
+
console.log("No token in url, loading from storage:", err);
|
|
28
|
+
return this.storage
|
|
29
|
+
.getRefreshToken()
|
|
30
|
+
.catch(
|
|
31
|
+
(err) => {
|
|
32
|
+
console.log("No token in storage, redirecting to login page:", err);
|
|
33
|
+
return this.login.getRefreshToken();
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
)
|
|
38
|
+
.then(
|
|
39
|
+
(t) => {
|
|
40
|
+
console.log("Token found, saving to storage...");
|
|
41
|
+
this.storage.saveRefreshTokenToLocalStorage(t);
|
|
42
|
+
// redirect if token is in url
|
|
43
|
+
return this.url.reset().then(() => t);
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
reset(): Promise<any> {
|
|
49
|
+
return this.storage.reset().then(() => this.url.reset());
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {OAuthRefreshTokenProvider} from "./OAuthRefreshTokenProvider";
|
|
2
2
|
import {IdTokenPayload} from "../OAuthRestClient";
|
|
3
3
|
import {RedirectionProvider} from "./RedirectionProvider";
|
|
4
4
|
import {RestClientWithOAuth} from "../RestClientWithOAuth";
|
|
5
5
|
import {UrlUtil} from "../../util";
|
|
6
6
|
|
|
7
|
-
export class
|
|
7
|
+
export class RefreshTokenProviderLogin extends RedirectionProvider implements OAuthRefreshTokenProvider {
|
|
8
8
|
|
|
9
9
|
client: RestClientWithOAuth;
|
|
10
10
|
|
|
@@ -29,7 +29,7 @@ export class IdTokenProviderLogin extends RedirectionProvider implements OAuthId
|
|
|
29
29
|
});
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
getRefreshToken(): Promise<IdTokenPayload> {
|
|
33
33
|
return this.redirectToLogin();
|
|
34
34
|
}
|
|
35
35
|
|
package/src/oauth/tokenprovider/{IdTokenProviderStorage.ts → RefreshTokenProviderStorage.ts}
RENAMED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import {OAuthRefreshTokenProvider} from "./OAuthRefreshTokenProvider";
|
|
2
|
+
import {RefreshTokenPayload} from "../OAuthRestClient";
|
|
3
3
|
import {JsonUtil} from "../../util";
|
|
4
4
|
import {OAuthUtil} from "../../util/OAuthUtil";
|
|
5
5
|
|
|
6
|
-
export class
|
|
6
|
+
export class RefreshTokenProviderStorage implements OAuthRefreshTokenProvider {
|
|
7
7
|
|
|
8
8
|
key: string;
|
|
9
9
|
|
|
10
10
|
constructor(storageKey?: string) {
|
|
11
|
-
this.key = storageKey || '
|
|
11
|
+
this.key = storageKey || 'refresh-token';
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
saveRefreshTokenToLocalStorage(token: RefreshTokenPayload | null) {
|
|
15
15
|
const raw = token ? JSON.stringify(token) : null;
|
|
16
16
|
if (raw === null) {
|
|
17
17
|
localStorage.removeItem(this.key);
|
|
@@ -20,18 +20,18 @@ export class IdTokenProviderStorage implements OAuthIdTokenProvider {
|
|
|
20
20
|
localStorage.setItem(this.key, raw);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
getRefreshTokenFromLocalStorage(): RefreshTokenPayload | null | undefined {
|
|
24
24
|
return JsonUtil.parse(localStorage.getItem(this.key));
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
const token = this.
|
|
27
|
+
getRefreshToken(): Promise<RefreshTokenPayload> {
|
|
28
|
+
const token = this.getRefreshTokenFromLocalStorage();
|
|
29
29
|
if (token && OAuthUtil.isValidToken(token)) return Promise.resolve(token);
|
|
30
30
|
return Promise.reject("No valid token found in storage!");
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
reset(): Promise<any> {
|
|
34
|
-
this.
|
|
34
|
+
this.saveRefreshTokenToLocalStorage(null);
|
|
35
35
|
return Promise.resolve();
|
|
36
36
|
}
|
|
37
37
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import {OAuthRefreshTokenProvider} from "./OAuthRefreshTokenProvider";
|
|
2
|
+
import {RefreshTokenPayload} from "../OAuthRestClient";
|
|
3
3
|
import {RestClientWithOAuth} from "../RestClientWithOAuth";
|
|
4
4
|
import {StringUtil} from "../../util";
|
|
5
5
|
import {UrlUtil} from "../../util";
|
|
6
6
|
import {RedirectionProvider} from "./RedirectionProvider";
|
|
7
7
|
|
|
8
|
-
export class
|
|
8
|
+
export class RefreshTokenProviderUrl extends RedirectionProvider implements OAuthRefreshTokenProvider {
|
|
9
9
|
|
|
10
10
|
client: RestClientWithOAuth;
|
|
11
11
|
|
|
@@ -17,12 +17,12 @@ export class IdTokenProviderUrl extends RedirectionProvider implements OAuthIdTo
|
|
|
17
17
|
this.tokenQueryName = tokenQueryName || 'token';
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
getRefreshTokenFromUrl(): string | null {
|
|
21
21
|
return UrlUtil.extractParamFromUrl(document.location.toString(), this.tokenQueryName);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
|
|
25
|
-
const raw = this.
|
|
24
|
+
getRefreshToken(): Promise<RefreshTokenPayload> {
|
|
25
|
+
const raw = this.getRefreshTokenFromUrl();
|
|
26
26
|
if (raw === null || StringUtil.isBlank(raw)) return Promise.reject("No token in URL!");
|
|
27
27
|
return this.client
|
|
28
28
|
.getTokenManager()
|
|
@@ -30,7 +30,7 @@ export class IdTokenProviderUrl extends RedirectionProvider implements OAuthIdTo
|
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
reset(): Promise<any> {
|
|
33
|
-
const raw = this.
|
|
33
|
+
const raw = this.getRefreshTokenFromUrl();
|
|
34
34
|
if (raw === null || StringUtil.isBlank(raw)) return Promise.resolve();
|
|
35
35
|
console.log("Token in URL, redirecting...");
|
|
36
36
|
const thisUrl = UrlUtil.deleteParamFromUrl(document.location.toString(), this.tokenQueryName);
|
package/src/util/NumberUtil.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { ObjectUtil } from "./ObjectUtil";
|
|
2
2
|
|
|
3
|
-
export class NumberUtil
|
|
3
|
+
export class NumberUtil {
|
|
4
|
+
|
|
5
|
+
static isEmpty(n: any): n is null | undefined {
|
|
6
|
+
return n === undefined || n === null || Number.isNaN(n);
|
|
7
|
+
}
|
|
4
8
|
|
|
5
9
|
static notEmpty(n?: number | null): n is number {
|
|
6
10
|
return !ObjectUtil.isEmpty(n);
|