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.
Files changed (29) hide show
  1. package/dist/index.d.ts +27 -23
  2. package/dist/index.esm.js +1 -1
  3. package/dist/index.esm.js.map +1 -1
  4. package/dist/index.js +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/oauth/OAuthRestClient.d.ts +9 -6
  7. package/dist/oauth/OAuthTokenManager.d.ts +11 -11
  8. package/dist/oauth/RestClientWithOAuth.d.ts +4 -4
  9. package/dist/oauth/tokenprovider/OAuthRefreshTokenProvider.d.ts +5 -0
  10. package/dist/oauth/tokenprovider/RefreshTokenProviderDefault.d.ts +14 -0
  11. package/dist/oauth/tokenprovider/RefreshTokenProviderLogin.d.ts +12 -0
  12. package/dist/oauth/tokenprovider/RefreshTokenProviderStorage.d.ts +10 -0
  13. package/dist/oauth/tokenprovider/RefreshTokenProviderUrl.d.ts +12 -0
  14. package/dist/util/NumberUtil.d.ts +2 -2
  15. package/dist/util/ObjectUtil.d.ts +1 -1
  16. package/package.json +1 -1
  17. package/src/oauth/OAuthRestClient.ts +20 -9
  18. package/src/oauth/OAuthTokenManager.ts +29 -29
  19. package/src/oauth/RestClientWithOAuth.ts +11 -11
  20. package/src/oauth/tokenprovider/OAuthRefreshTokenProvider.ts +6 -0
  21. package/src/oauth/tokenprovider/RefreshTokenProviderDefault.ts +52 -0
  22. package/src/oauth/tokenprovider/{IdTokenProviderLogin.ts → RefreshTokenProviderLogin.ts} +3 -3
  23. package/src/oauth/tokenprovider/{IdTokenProviderStorage.ts → RefreshTokenProviderStorage.ts} +9 -9
  24. package/src/oauth/tokenprovider/{IdTokenProviderUrl.ts → RefreshTokenProviderUrl.ts} +7 -7
  25. package/src/util/NumberUtil.ts +5 -1
  26. package/src/util/OAuthUtil.ts +2 -1
  27. package/src/util/ObjectUtil.ts +1 -1
  28. package/src/oauth/tokenprovider/IdTokenProviderDefault.ts +0 -52
  29. 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
- idToken: string;
6
+ refreshToken: string;
7
7
  privilege: string;
8
8
  };
9
- export type RequestIdTokenFromPrevTokenPayload = {
10
- idToken: string;
9
+ export type RenewRefreshTokenPayload = {
10
+ refreshToken: string;
11
11
  };
12
- export type RequestIdTokenFromLoginPayload = TokenRequestPayloadBase & {
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
- requestIdTokenFromLogin(request: RequestIdTokenFromLoginPayload): Promise<IdTokenPayload>;
41
- refreshIdToken(request: RequestIdTokenFromPrevTokenPayload): Promise<IdTokenPayload>;
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 { OAuthIdTokenProvider } from "./tokenprovider/OAuthIdTokenProvider";
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 OAuthIdTokenProvider {
6
+ export declare class OAuthTokenManager implements OAuthRefreshTokenProvider {
7
7
  oAuthServer: OAuthRestClient;
8
8
  audience: string;
9
- idToken?: IdTokenPayload;
10
- freshIdTokenProvider: OAuthIdTokenProvider;
9
+ refreshToken?: RefreshTokenPayload;
10
+ initialRefreshTokenProvider: OAuthRefreshTokenProvider;
11
11
  accessTokens: Map<string, AccessTokenPayload>;
12
- constructor(oAuthServerBaseUrl: string, targetAudience: string, freshIdTokenProvider: OAuthIdTokenProvider);
13
- hasValidIdToken(): boolean;
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
- getIdTokenInternal(): Promise<IdTokenPayload>;
19
+ getRefreshTokenInternal(): Promise<RefreshTokenPayload>;
20
20
  /**
21
21
  * Get id token, refresh it if needed
22
22
  */
23
- getIdToken(): Promise<IdTokenPayload>;
24
- getIdTokenRaw(): Promise<string>;
25
- setIdToken(token?: IdTokenPayload): void;
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 { OAuthIdTokenProvider } from "./tokenprovider/OAuthIdTokenProvider";
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 OAuthIdTokenProvider {
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?: OAuthIdTokenProvider, defaultPrivilege?: string);
18
- getIdToken(): Promise<IdTokenPayload>;
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,5 @@
1
+ import { RefreshTokenPayload } from "../OAuthRestClient";
2
+ export interface OAuthRefreshTokenProvider {
3
+ getRefreshToken(): Promise<RefreshTokenPayload>;
4
+ reset(): Promise<any>;
5
+ }
@@ -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
- import { ObjectUtil } from "./ObjectUtil";
2
- export declare class NumberUtil extends ObjectUtil {
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;
@@ -1,6 +1,6 @@
1
1
  export declare class ObjectUtil {
2
2
  static isEmpty(obj: any): obj is null | undefined;
3
- static notEmpty(obj: any): boolean;
3
+ static notEmpty(obj: any): obj is object;
4
4
  static clone<T>(obj: T): T;
5
5
  static getNestedValue(obj: any, path: string): string;
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zavadil-ts-common",
3
- "version": "1.2.78",
3
+ "version": "2.0.0",
4
4
  "description": "Common types and components for Typescript UI apps.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -6,15 +6,15 @@ export type TokenRequestPayloadBase = {
6
6
  }
7
7
 
8
8
  export type RequestAccessTokenPayload = TokenRequestPayloadBase & {
9
- idToken: string;
9
+ refreshToken: string;
10
10
  privilege: string;
11
11
  }
12
12
 
13
- export type RequestIdTokenFromPrevTokenPayload = {
14
- idToken: string;
13
+ export type RenewRefreshTokenPayload = {
14
+ refreshToken: string;
15
15
  }
16
16
 
17
- export type RequestIdTokenFromLoginPayload = TokenRequestPayloadBase & {
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
- requestIdTokenFromLogin(request: RequestIdTokenFromLoginPayload): Promise<IdTokenPayload> {
64
- return this.postJson('id-tokens/from-login', request);
74
+ requestRefreshTokenFromLogin(request: RequestRefreshTokenFromLoginPayload): Promise<RefreshTokenPayload> {
75
+ return this.postJson('refresh-tokens/from-login', request);
65
76
  }
66
77
 
67
- refreshIdToken(request: RequestIdTokenFromPrevTokenPayload): Promise<IdTokenPayload> {
68
- return this.postJson('id-tokens/refresh', request);
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-id-token', request);
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 {OAuthIdTokenProvider} from "./tokenprovider/OAuthIdTokenProvider";
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 OAuthIdTokenProvider {
8
+ export class OAuthTokenManager implements OAuthRefreshTokenProvider {
9
9
 
10
10
  oAuthServer: OAuthRestClient;
11
11
 
12
12
  audience: string;
13
13
 
14
- idToken?: IdTokenPayload;
14
+ refreshToken?: RefreshTokenPayload;
15
15
 
16
- freshIdTokenProvider: OAuthIdTokenProvider;
16
+ initialRefreshTokenProvider: OAuthRefreshTokenProvider;
17
17
 
18
18
  accessTokens: Map<string, AccessTokenPayload>;
19
19
 
20
- constructor(oAuthServerBaseUrl: string, targetAudience: string, freshIdTokenProvider: OAuthIdTokenProvider) {
21
- this.freshIdTokenProvider = freshIdTokenProvider;
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
- hasValidIdToken(): boolean {
28
- return OAuthUtil.isValidToken(this.idToken);
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.idToken = undefined;
36
+ this.refreshToken = undefined;
37
37
  this.accessTokens.clear();
38
- return this.freshIdTokenProvider.reset();
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
- getIdTokenInternal(): Promise<IdTokenPayload> {
45
- if (this.idToken === undefined || !this.hasValidIdToken()) {
46
- return this.freshIdTokenProvider.getIdToken();
44
+ getRefreshTokenInternal(): Promise<RefreshTokenPayload> {
45
+ if (this.hasValidRefreshToken() && this.refreshToken !== undefined) {
46
+ return Promise.resolve(this.refreshToken);
47
47
  }
48
- return Promise.resolve(this.idToken);
48
+ return this.initialRefreshTokenProvider.getRefreshToken();
49
49
  }
50
50
 
51
51
  /**
52
52
  * Get id token, refresh it if needed
53
53
  */
54
- getIdToken(): Promise<IdTokenPayload> {
55
- return this.getIdTokenInternal()
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
- .refreshIdToken({idToken: t.token})
64
+ .renewRefreshToken({refreshToken: t.token})
65
65
  .then(
66
66
  (t) => {
67
- this.setIdToken(t);
67
+ this.setRefreshToken(t);
68
68
  return t;
69
69
  }
70
70
  );
71
71
  }
72
- this.setIdToken(t);
72
+ this.setRefreshToken(t);
73
73
  return Promise.resolve(t);
74
74
  }
75
75
  );
76
76
  }
77
77
 
78
- getIdTokenRaw(): Promise<string> {
79
- return this.getIdToken().then(t => t.token);
78
+ getRefreshTokenRaw(): Promise<string> {
79
+ return this.getRefreshToken().then(t => t.token);
80
80
  }
81
81
 
82
- setIdToken(token?: IdTokenPayload) {
83
- this.idToken = token;
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
- .requestIdTokenFromLogin({login: login, password: password, targetAudience: this.audience})
94
- .then((t) => this.setIdToken(t));
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.getIdTokenRaw()
98
+ return this.getRefreshTokenRaw()
99
99
  .then(
100
- (idToken: string) => this.oAuthServer
101
- .requestAccessToken({idToken: idToken, targetAudience: this.audience, privilege: privilege})
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 {OAuthIdTokenProvider} from "./tokenprovider/OAuthIdTokenProvider";
6
- import {IdTokenProviderDefault} from "./tokenprovider/IdTokenProviderDefault";
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 OAuthIdTokenProvider {
15
+ export class RestClientWithOAuth extends RestClient implements OAuthRefreshTokenProvider {
16
16
 
17
17
  private insecureClient: RestClient;
18
18
 
19
- private freshIdTokenProvider: OAuthIdTokenProvider;
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?: OAuthIdTokenProvider, defaultPrivilege: string = '*') {
27
+ constructor(url: string, freshIdTokenProvider?: OAuthRefreshTokenProvider, defaultPrivilege: string = '*') {
28
28
  super(url);
29
29
 
30
- this.freshIdTokenProvider = freshIdTokenProvider || new IdTokenProviderDefault(this);
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
- getIdToken(): Promise<IdTokenPayload> {
41
- return this.getTokenManager().then(t => t.getIdToken());
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.getIdToken();
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) => new OAuthTokenManager(info.oauthServerUrl, info.targetAudience, this.freshIdTokenProvider));
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.setIdToken(token));
91
+ .then((m) => m.setRefreshToken(token));
92
92
  }
93
93
 
94
94
  getHeaders(endpoint: string): Promise<Headers> {
@@ -0,0 +1,6 @@
1
+ import {IdTokenPayload, RefreshTokenPayload} from "../OAuthRestClient";
2
+
3
+ export interface OAuthRefreshTokenProvider {
4
+ getRefreshToken(): Promise<RefreshTokenPayload>;
5
+ reset(): Promise<any>;
6
+ }
@@ -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 {OAuthIdTokenProvider} from "./OAuthIdTokenProvider";
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 IdTokenProviderLogin extends RedirectionProvider implements OAuthIdTokenProvider {
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
- getIdToken(): Promise<IdTokenPayload> {
32
+ getRefreshToken(): Promise<IdTokenPayload> {
33
33
  return this.redirectToLogin();
34
34
  }
35
35
 
@@ -1,17 +1,17 @@
1
- import {OAuthIdTokenProvider} from "./OAuthIdTokenProvider";
2
- import {IdTokenPayload} from "../OAuthRestClient";
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 IdTokenProviderStorage implements OAuthIdTokenProvider {
6
+ export class RefreshTokenProviderStorage implements OAuthRefreshTokenProvider {
7
7
 
8
8
  key: string;
9
9
 
10
10
  constructor(storageKey?: string) {
11
- this.key = storageKey || 'id-token';
11
+ this.key = storageKey || 'refresh-token';
12
12
  }
13
13
 
14
- saveIdTokenToLocalStorage(token: IdTokenPayload | null) {
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
- getIdTokenFromLocalStorage(): IdTokenPayload | null | undefined {
23
+ getRefreshTokenFromLocalStorage(): RefreshTokenPayload | null | undefined {
24
24
  return JsonUtil.parse(localStorage.getItem(this.key));
25
25
  }
26
26
 
27
- getIdToken(): Promise<IdTokenPayload> {
28
- const token = this.getIdTokenFromLocalStorage();
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.saveIdTokenToLocalStorage(null);
34
+ this.saveRefreshTokenToLocalStorage(null);
35
35
  return Promise.resolve();
36
36
  }
37
37
  }
@@ -1,11 +1,11 @@
1
- import {OAuthIdTokenProvider} from "./OAuthIdTokenProvider";
2
- import {IdTokenPayload} from "../OAuthRestClient";
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 IdTokenProviderUrl extends RedirectionProvider implements OAuthIdTokenProvider {
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
- getIdTokenFromUrl(): string | null {
20
+ getRefreshTokenFromUrl(): string | null {
21
21
  return UrlUtil.extractParamFromUrl(document.location.toString(), this.tokenQueryName);
22
22
  }
23
23
 
24
- getIdToken(): Promise<IdTokenPayload> {
25
- const raw = this.getIdTokenFromUrl();
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.getIdTokenFromUrl();
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);
@@ -1,6 +1,10 @@
1
1
  import { ObjectUtil } from "./ObjectUtil";
2
2
 
3
- export class NumberUtil extends ObjectUtil {
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);