oidc-spa 6.1.13 → 6.1.15

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.
@@ -2,9 +2,9 @@ import type { UserManager as OidcClientTsUserManager } from "../vendor/frontend/
2
2
  import { Deferred } from "../tools/Deferred";
3
3
  import { id, assert } from "../vendor/frontend/tsafe";
4
4
  import { getStateData, clearStateStore, type StateData } from "./StateData";
5
- import { addQueryParamToUrl } from "../tools/urlQueryParams";
6
5
  import { getDownlinkAndRtt } from "../tools/getDownlinkAndRtt";
7
6
  import { getIsDev } from "../tools/isDev";
7
+ import type { User as OidcClientTsUser } from "../vendor/frontend/oidc-client-ts-and-jwt-decode";
8
8
 
9
9
  export type AuthResponse = {
10
10
  state: string;
@@ -16,27 +16,27 @@ function getIsAuthResponse(data: any): data is AuthResponse {
16
16
  }
17
17
 
18
18
  export function authResponseToUrl(authResponse: AuthResponse): string {
19
- let authResponseUrl = "https://dummy.com";
19
+ const authResponseUrl = new URL("https://dummy.com");
20
20
 
21
21
  for (const [name, value] of Object.entries(authResponse)) {
22
- authResponseUrl = addQueryParamToUrl({
23
- url: authResponseUrl,
24
- name,
25
- value
26
- }).newUrl;
22
+ authResponseUrl.searchParams.set(name, value);
27
23
  }
28
24
 
29
- return authResponseUrl;
25
+ return authResponseUrl.href;
30
26
  }
31
27
 
32
28
  type ResultOfLoginSilent =
33
29
  | {
34
- isSuccess: true;
30
+ outcome: "success iframe";
35
31
  authResponse: AuthResponse;
36
32
  }
37
33
  | {
38
- isSuccess: false;
34
+ outcome: "failure";
39
35
  cause: "timeout" | "can't reach well-known oidc endpoint";
36
+ }
37
+ | {
38
+ outcome: "refresh token used";
39
+ oidcClientTsUser: OidcClientTsUser;
40
40
  };
41
41
 
42
42
  export async function loginSilent(params: {
@@ -73,7 +73,7 @@ export async function loginSilent(params: {
73
73
 
74
74
  const timeout = setTimeout(async () => {
75
75
  dResult.resolve({
76
- isSuccess: false,
76
+ outcome: "failure",
77
77
  cause: "timeout"
78
78
  });
79
79
  }, timeoutDelayMs);
@@ -99,7 +99,7 @@ export async function loginSilent(params: {
99
99
  window.removeEventListener("message", listener);
100
100
 
101
101
  dResult.resolve({
102
- isSuccess: true,
102
+ outcome: "success iframe",
103
103
  authResponse
104
104
  });
105
105
  };
@@ -115,30 +115,42 @@ export async function loginSilent(params: {
115
115
  silentRequestTimeoutInSeconds: timeoutDelayMs / 1000,
116
116
  extraTokenParams: getExtraTokenParams?.()
117
117
  })
118
- .catch((error: Error) => {
119
- if (error.message === "Failed to fetch") {
120
- // NOTE: If we got an error here it means that the fetch to the
121
- // well-known oidc endpoint failed.
122
- // This usually means that the server is down or that the issuerUri
123
- // is not pointing to a valid oidc server.
124
- // It could be a CORS error on the well-known endpoint but it's unlikely.
118
+ .then(
119
+ oidcClientTsUser => {
120
+ assert(oidcClientTsUser !== null);
125
121
 
126
122
  clearTimeout(timeout);
127
123
 
128
124
  dResult.resolve({
129
- isSuccess: false,
130
- cause: "can't reach well-known oidc endpoint"
125
+ outcome: "refresh token used",
126
+ oidcClientTsUser
131
127
  });
132
-
133
- return;
128
+ },
129
+ (error: Error) => {
130
+ if (error.message === "Failed to fetch") {
131
+ // NOTE: If we got an error here it means that the fetch to the
132
+ // well-known oidc endpoint failed.
133
+ // This usually means that the server is down or that the issuerUri
134
+ // is not pointing to a valid oidc server.
135
+ // It could be a CORS error on the well-known endpoint but it's unlikely.
136
+
137
+ clearTimeout(timeout);
138
+
139
+ dResult.resolve({
140
+ outcome: "failure",
141
+ cause: "can't reach well-known oidc endpoint"
142
+ });
143
+
144
+ return;
145
+ }
146
+
147
+ // NOTE: Here, except error on our understanding there can't be any other
148
+ // error than timeout so we fail silently and let the timeout expire.
134
149
  }
135
-
136
- // NOTE: Here, except error on our understanding there can't be any other
137
- // error than timeout so we fail silently and let the timeout expire.
138
- });
150
+ );
139
151
 
140
152
  dResult.pr.then(result => {
141
- if (!result.isSuccess) {
153
+ if (result.outcome === "failure") {
142
154
  clearStateStore({ stateQueryParamValue: stateQueryParamValue_instance });
143
155
  }
144
156
  });
@@ -39,9 +39,11 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
39
39
 
40
40
  const refreshToken = oidcClientTsUser.refresh_token;
41
41
 
42
- assert(refreshToken !== undefined, "No refresh token provided by the oidc server");
43
-
44
42
  const refreshTokenExpirationTime = (() => {
43
+ if (refreshToken === undefined) {
44
+ return Number.POSITIVE_INFINITY;
45
+ }
46
+
45
47
  read_from_jwt: {
46
48
  const expirationTime = readExpirationTimeInJwt(refreshToken);
47
49
 
@@ -71,7 +73,7 @@ export function oidcClientTsUserToTokens<DecodedIdToken extends Record<string, u
71
73
  const tokens: Oidc.Tokens<DecodedIdToken> = {
72
74
  accessToken,
73
75
  accessTokenExpirationTime,
74
- refreshToken,
76
+ refreshToken: refreshToken ?? "",
75
77
  refreshTokenExpirationTime,
76
78
  idToken,
77
79
  decodedIdToken: null as any
@@ -0,0 +1,29 @@
1
+ function getKey(params: { configId: string }) {
2
+ const { configId } = params;
3
+
4
+ return `oidc-spa:is-logged-out:${configId}`;
5
+ }
6
+
7
+ export function persistLogoutState(params: { configId: string }) {
8
+ const { configId } = params;
9
+
10
+ const key = getKey({ configId });
11
+
12
+ localStorage.setItem(key, "true");
13
+ }
14
+
15
+ export function clearPersistedLogoutState(params: { configId: string }) {
16
+ const { configId } = params;
17
+
18
+ const key = getKey({ configId });
19
+
20
+ localStorage.removeItem(key);
21
+ }
22
+
23
+ export function getIsPersistedLogoutState(params: { configId: string }) {
24
+ const { configId } = params;
25
+
26
+ const key = getKey({ configId });
27
+
28
+ return localStorage.getItem(key) === "true";
29
+ }
@@ -1,113 +0,0 @@
1
- export function addQueryParamToUrl(params: { url: string; name: string; value: string }): {
2
- newUrl: string;
3
- } {
4
- const { url, name, value } = params;
5
-
6
- let newUrl = url;
7
-
8
- const result = retrieveQueryParamFromUrl({
9
- url,
10
- name
11
- });
12
-
13
- if (result.wasPresent) {
14
- newUrl = result.newUrl;
15
- }
16
-
17
- newUrl += `${
18
- newUrl.includes("?") ? "&" : newUrl.endsWith("?") ? "" : "?"
19
- }${name}=${encodeURIComponent(value)}`;
20
-
21
- return { newUrl };
22
- }
23
-
24
- export function retrieveAllQueryParamStartingWithPrefixFromUrl<
25
- Prefix extends string,
26
- DoLeave extends boolean
27
- >(params: {
28
- url: string;
29
- prefix: Prefix;
30
- doLeavePrefixInResults: DoLeave;
31
- }): { newUrl: string; values: Record<DoLeave extends true ? `${Prefix}${string}` : string, string> } {
32
- const { url, prefix, doLeavePrefixInResults } = params;
33
-
34
- const { baseUrl, locationSearch } = (() => {
35
- const [baseUrl, ...rest] = url.split("?");
36
-
37
- return {
38
- baseUrl,
39
- locationSearch: rest.join("?").trim()
40
- };
41
- })();
42
-
43
- const values: Record<string, string> = {};
44
-
45
- const { newLocationSearch } = (() => {
46
- let newLocationSearch = locationSearch
47
- .split("&")
48
- .filter(part => part !== "")
49
- .map(part => part.split("=") as [string, string])
50
- .filter(([key, value_i]) =>
51
- !key.startsWith(prefix)
52
- ? true
53
- : ((values[doLeavePrefixInResults ? key : key.substring(prefix.length)] =
54
- decodeURIComponent(value_i)),
55
- false)
56
- )
57
- .map(entry => entry.join("="))
58
- .join("&");
59
- newLocationSearch = newLocationSearch === "" ? "" : `?${newLocationSearch}`;
60
-
61
- return { newLocationSearch };
62
- })();
63
-
64
- return {
65
- newUrl: `${baseUrl}${newLocationSearch}`,
66
- values
67
- };
68
- }
69
-
70
- export function retrieveAllQueryParamFromUrl(params: { url: string }): {
71
- newUrl: string;
72
- values: Record<string, string>;
73
- } {
74
- return retrieveAllQueryParamStartingWithPrefixFromUrl({
75
- url: params.url,
76
- prefix: "",
77
- doLeavePrefixInResults: true
78
- });
79
- }
80
-
81
- export function retrieveQueryParamFromUrl(params: {
82
- url: string;
83
- name: string;
84
- }): { wasPresent: false } | { wasPresent: true; newUrl: string; value: string } {
85
- const { url, name } = params;
86
-
87
- let { newUrl, values } = retrieveAllQueryParamStartingWithPrefixFromUrl({
88
- url,
89
- prefix: name,
90
- doLeavePrefixInResults: true
91
- });
92
-
93
- if (!(name in values)) {
94
- return { wasPresent: false };
95
- }
96
-
97
- const { [name]: value, ...rest } = values;
98
-
99
- Object.entries(rest).forEach(
100
- ([name, value]) =>
101
- (newUrl = addQueryParamToUrl({
102
- name,
103
- url: newUrl,
104
- value
105
- }).newUrl)
106
- );
107
-
108
- return {
109
- wasPresent: true,
110
- newUrl,
111
- value: values[name]
112
- };
113
- }
@@ -1,31 +0,0 @@
1
- export declare function addQueryParamToUrl(params: {
2
- url: string;
3
- name: string;
4
- value: string;
5
- }): {
6
- newUrl: string;
7
- };
8
- export declare function retrieveAllQueryParamStartingWithPrefixFromUrl<Prefix extends string, DoLeave extends boolean>(params: {
9
- url: string;
10
- prefix: Prefix;
11
- doLeavePrefixInResults: DoLeave;
12
- }): {
13
- newUrl: string;
14
- values: Record<DoLeave extends true ? `${Prefix}${string}` : string, string>;
15
- };
16
- export declare function retrieveAllQueryParamFromUrl(params: {
17
- url: string;
18
- }): {
19
- newUrl: string;
20
- values: Record<string, string>;
21
- };
22
- export declare function retrieveQueryParamFromUrl(params: {
23
- url: string;
24
- name: string;
25
- }): {
26
- wasPresent: false;
27
- } | {
28
- wasPresent: true;
29
- newUrl: string;
30
- value: string;
31
- };
@@ -1,112 +0,0 @@
1
- "use strict";
2
- var __rest = (this && this.__rest) || function (s, e) {
3
- var t = {};
4
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
- t[p] = s[p];
6
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
- t[p[i]] = s[p[i]];
10
- }
11
- return t;
12
- };
13
- var __read = (this && this.__read) || function (o, n) {
14
- var m = typeof Symbol === "function" && o[Symbol.iterator];
15
- if (!m) return o;
16
- var i = m.call(o), r, ar = [], e;
17
- try {
18
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
19
- }
20
- catch (error) { e = { error: error }; }
21
- finally {
22
- try {
23
- if (r && !r.done && (m = i["return"])) m.call(i);
24
- }
25
- finally { if (e) throw e.error; }
26
- }
27
- return ar;
28
- };
29
- Object.defineProperty(exports, "__esModule", { value: true });
30
- exports.addQueryParamToUrl = addQueryParamToUrl;
31
- exports.retrieveAllQueryParamStartingWithPrefixFromUrl = retrieveAllQueryParamStartingWithPrefixFromUrl;
32
- exports.retrieveAllQueryParamFromUrl = retrieveAllQueryParamFromUrl;
33
- exports.retrieveQueryParamFromUrl = retrieveQueryParamFromUrl;
34
- function addQueryParamToUrl(params) {
35
- var url = params.url, name = params.name, value = params.value;
36
- var newUrl = url;
37
- var result = retrieveQueryParamFromUrl({
38
- url: url,
39
- name: name
40
- });
41
- if (result.wasPresent) {
42
- newUrl = result.newUrl;
43
- }
44
- newUrl += "".concat(newUrl.includes("?") ? "&" : newUrl.endsWith("?") ? "" : "?").concat(name, "=").concat(encodeURIComponent(value));
45
- return { newUrl: newUrl };
46
- }
47
- function retrieveAllQueryParamStartingWithPrefixFromUrl(params) {
48
- var url = params.url, prefix = params.prefix, doLeavePrefixInResults = params.doLeavePrefixInResults;
49
- var _a = (function () {
50
- var _a = __read(url.split("?")), baseUrl = _a[0], rest = _a.slice(1);
51
- return {
52
- baseUrl: baseUrl,
53
- locationSearch: rest.join("?").trim()
54
- };
55
- })(), baseUrl = _a.baseUrl, locationSearch = _a.locationSearch;
56
- var values = {};
57
- var newLocationSearch = (function () {
58
- var newLocationSearch = locationSearch
59
- .split("&")
60
- .filter(function (part) { return part !== ""; })
61
- .map(function (part) { return part.split("="); })
62
- .filter(function (_a) {
63
- var _b = __read(_a, 2), key = _b[0], value_i = _b[1];
64
- return !key.startsWith(prefix)
65
- ? true
66
- : ((values[doLeavePrefixInResults ? key : key.substring(prefix.length)] =
67
- decodeURIComponent(value_i)),
68
- false);
69
- })
70
- .map(function (entry) { return entry.join("="); })
71
- .join("&");
72
- newLocationSearch = newLocationSearch === "" ? "" : "?".concat(newLocationSearch);
73
- return { newLocationSearch: newLocationSearch };
74
- })().newLocationSearch;
75
- return {
76
- newUrl: "".concat(baseUrl).concat(newLocationSearch),
77
- values: values
78
- };
79
- }
80
- function retrieveAllQueryParamFromUrl(params) {
81
- return retrieveAllQueryParamStartingWithPrefixFromUrl({
82
- url: params.url,
83
- prefix: "",
84
- doLeavePrefixInResults: true
85
- });
86
- }
87
- function retrieveQueryParamFromUrl(params) {
88
- var url = params.url, name = params.name;
89
- var _a = retrieveAllQueryParamStartingWithPrefixFromUrl({
90
- url: url,
91
- prefix: name,
92
- doLeavePrefixInResults: true
93
- }), newUrl = _a.newUrl, values = _a.values;
94
- if (!(name in values)) {
95
- return { wasPresent: false };
96
- }
97
- var _b = values, _c = name, value = _b[_c], rest = __rest(_b, [typeof _c === "symbol" ? _c : _c + ""]);
98
- Object.entries(rest).forEach(function (_a) {
99
- var _b = __read(_a, 2), name = _b[0], value = _b[1];
100
- return (newUrl = addQueryParamToUrl({
101
- name: name,
102
- url: newUrl,
103
- value: value
104
- }).newUrl);
105
- });
106
- return {
107
- wasPresent: true,
108
- newUrl: newUrl,
109
- value: values[name]
110
- };
111
- }
112
- //# sourceMappingURL=urlQueryParams.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"urlQueryParams.js","sourceRoot":"","sources":["../src/tools/urlQueryParams.ts"],"names":[],"mappings":"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"}