zavadil-ts-common 1.1.47 → 1.1.48

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zavadil-ts-common",
3
- "version": "1.1.47",
3
+ "version": "1.1.48",
4
4
  "description": "Common types and components for Typescript UI apps.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.esm.js",
@@ -1,4 +1,4 @@
1
- import {RestClient} from "../client/RestClient";
1
+ import {RestClient} from "../client";
2
2
  import {StringUtil} from "../util";
3
3
 
4
4
  export type TokenRequestPayloadBase = {
@@ -45,7 +45,7 @@ export type JwksPayload = {
45
45
 
46
46
  /**
47
47
  * This implements rest client for OAuth server - https://github.com/lotcz/oauth-server
48
- * Provide basic url, /api/oauth prefix will be added automatically
48
+ * Provide basic url, /api/oauth path prefix will be added automatically
49
49
  */
50
50
  export class OAuthRestClient extends RestClient {
51
51
 
@@ -57,6 +57,10 @@ export class OAuthRestClient extends RestClient {
57
57
  return this.getJson('jwks.json');
58
58
  }
59
59
 
60
+ verifyIdToken(idToken: string): Promise<IdTokenPayload> {
61
+ return this.getJson(`id-tokens/verify/${idToken}`);
62
+ }
63
+
60
64
  requestIdTokenFromLogin(request: RequestIdTokenFromLoginPayload): Promise<IdTokenPayload> {
61
65
  return this.postJson('id-tokens/from-login', request);
62
66
  }
@@ -1,10 +1,13 @@
1
1
  import {AccessTokenPayload, IdTokenPayload, OAuthRestClient, RequestIdTokenFromLoginPayload} from "./OAuthRestClient";
2
+ import {EventManager} from "../component";
2
3
 
3
4
  /**
4
5
  * Manages refresh of id and access tokens.
5
6
  */
6
7
  export class OAuthTokenManager {
7
8
 
9
+ private eventManager: EventManager = new EventManager();
10
+
8
11
  oAuthServer: OAuthRestClient;
9
12
 
10
13
  audience: string;
@@ -18,6 +21,10 @@ export class OAuthTokenManager {
18
21
  this.oAuthServer = new OAuthRestClient(oAuthServerBaseUrl);
19
22
  }
20
23
 
24
+ addIdTokenChangedHandler(handler: () => any) {
25
+ this.eventManager.addEventListener('id-token-changed', handler);
26
+ }
27
+
21
28
  isTokenExpired(expires?: Date | null): boolean {
22
29
  if (expires === undefined || expires === null) return false;
23
30
  const now = Date.now();
@@ -49,7 +56,7 @@ export class OAuthTokenManager {
49
56
  }
50
57
 
51
58
  reset() {
52
- this.idToken = undefined;
59
+ this.setIdToken(undefined);
53
60
  this.accessToken = undefined;
54
61
  }
55
62
 
@@ -62,10 +69,7 @@ export class OAuthTokenManager {
62
69
  .refreshIdToken({idToken: this.idToken.idToken})
63
70
  .then(
64
71
  (t) => {
65
- if (!this.isValidIdToken(t)) {
66
- return Promise.reject("Received ID token is not valid!");
67
- }
68
- this.idToken = t;
72
+ this.setIdToken(t);
69
73
  return t.idToken;
70
74
  }
71
75
  )
@@ -73,11 +77,18 @@ export class OAuthTokenManager {
73
77
  return Promise.resolve(this.idToken.idToken);
74
78
  }
75
79
 
76
- setIdToken(token: IdTokenPayload) {
80
+ setIdToken(token?: IdTokenPayload) {
77
81
  if (!this.isValidIdToken(token)) {
78
82
  throw new Error("Received ID token is not valid!");
79
83
  }
80
84
  this.idToken = token;
85
+ this.eventManager.triggerEvent('id-token-changed');
86
+ }
87
+
88
+ verifyIdToken(token: string): Promise<boolean> {
89
+ return this.oAuthServer.verifyIdToken(token)
90
+ .then((t) => this.setIdToken(t))
91
+ .then(() => true)
81
92
  }
82
93
 
83
94
  login(login: string, password: string): Promise<boolean> {
@@ -23,6 +23,10 @@ export class RestClientWithOAuth extends RestClient {
23
23
  this.insecureClient = new RestClient(url);
24
24
  }
25
25
 
26
+ addIdTokenChangedHandler(handler: () => any) {
27
+ this.getTokenManager().then((m) => m.addIdTokenChangedHandler(handler));
28
+ }
29
+
26
30
  getServerInfo(): Promise<ServerOAuthInfoPayload> {
27
31
  if (this.serverInfo !== undefined) {
28
32
  return Promise.resolve(this.serverInfo);
@@ -52,6 +56,11 @@ export class RestClientWithOAuth extends RestClient {
52
56
  .then(() => true)
53
57
  }
54
58
 
59
+ setIdTokenRaw(token: string): Promise<boolean> {
60
+ return this.getTokenManager()
61
+ .then(m => m.verifyIdToken(token))
62
+ }
63
+
55
64
  getHeaders(): Promise<RestClientHeaders> {
56
65
  return this.getTokenManager()
57
66
  .then(sm => sm.getAccessToken())