@fusionauth/angular-sdk 1.0.2 → 1.1.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/README.md +5 -0
- package/esm2022/lib/SSRCookieAdapter.mjs +23 -0
- package/esm2022/lib/fusion-auth.module.mjs +4 -5
- package/esm2022/lib/fusion-auth.service.mjs +23 -3
- package/esm2022/lib/injectionToken.mjs +3 -0
- package/esm2022/lib/types.mjs +1 -1
- package/esm2022/sdkcore/CookieHelpers/CookieHelpers.mjs +34 -0
- package/esm2022/sdkcore/CookieHelpers/index.mjs +2 -0
- package/esm2022/sdkcore/RedirectHelper/RedirectHelper.mjs +47 -0
- package/esm2022/sdkcore/RedirectHelper/index.mjs +2 -0
- package/esm2022/sdkcore/SDKConfig/SDKConfig.mjs +2 -0
- package/esm2022/sdkcore/SDKConfig/index.mjs +2 -0
- package/esm2022/sdkcore/SDKContext/SDKContext.mjs +2 -0
- package/esm2022/sdkcore/SDKContext/index.mjs +2 -0
- package/esm2022/sdkcore/SDKCore/SDKCore.mjs +103 -0
- package/esm2022/sdkcore/SDKCore/index.mjs +2 -0
- package/esm2022/sdkcore/UrlHelper/UrlHelper.mjs +64 -0
- package/esm2022/sdkcore/UrlHelper/UrlHelperTypes.mjs +2 -0
- package/esm2022/sdkcore/UrlHelper/index.mjs +3 -0
- package/esm2022/sdkcore/index.mjs +5 -0
- package/esm2022/sdkcore/testUtils/index.mjs +3 -0
- package/esm2022/sdkcore/testUtils/mockLoggedIn.mjs +13 -0
- package/esm2022/sdkcore/testUtils/mockWindowLocation.mjs +10 -0
- package/fesm2022/fusionauth-angular-sdk.mjs +227 -138
- package/fesm2022/fusionauth-angular-sdk.mjs.map +1 -1
- package/lib/SSRCookieAdapter.d.ts +7 -0
- package/lib/fusion-auth.service.d.ts +5 -2
- package/lib/injectionToken.d.ts +3 -0
- package/lib/types.d.ts +4 -0
- package/package.json +3 -3
- package/sdkcore/CookieHelpers/CookieHelpers.d.ts +11 -0
- package/sdkcore/CookieHelpers/index.d.ts +1 -0
- package/sdkcore/RedirectHelper/RedirectHelper.d.ts +10 -0
- package/sdkcore/RedirectHelper/index.d.ts +1 -0
- package/sdkcore/SDKConfig/SDKConfig.d.ts +79 -0
- package/sdkcore/SDKConfig/index.d.ts +1 -0
- package/sdkcore/SDKContext/SDKContext.d.ts +65 -0
- package/sdkcore/SDKContext/index.d.ts +1 -0
- package/sdkcore/SDKCore/SDKCore.d.ts +23 -0
- package/sdkcore/SDKCore/index.d.ts +1 -0
- package/sdkcore/UrlHelper/UrlHelper.d.ts +22 -0
- package/sdkcore/UrlHelper/UrlHelperTypes.d.ts +11 -0
- package/sdkcore/UrlHelper/index.d.ts +2 -0
- package/sdkcore/index.d.ts +5 -0
- package/sdkcore/testUtils/index.d.ts +2 -0
- package/sdkcore/testUtils/mockLoggedIn.d.ts +5 -0
- package/sdkcore/testUtils/mockWindowLocation.d.ts +18 -0
- package/esm2022/lib/core.mjs +0 -217
- package/lib/core.d.ts +0 -35
|
@@ -1,57 +1,45 @@
|
|
|
1
|
-
import { BehaviorSubject, Observable, catchError } from 'rxjs';
|
|
2
1
|
import * as i0 from '@angular/core';
|
|
3
|
-
import { Component, Input, NgModule } from '@angular/core';
|
|
2
|
+
import { InjectionToken, PLATFORM_ID, Injectable, Inject, Component, Input, NgModule } from '@angular/core';
|
|
3
|
+
import { isPlatformBrowser } from '@angular/common';
|
|
4
|
+
import { BehaviorSubject, Observable, catchError } from 'rxjs';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
i(this, 'loginPath');
|
|
19
|
-
i(this, 'registerPath');
|
|
20
|
-
i(this, 'logoutPath');
|
|
21
|
-
i(this, 'tokenRefreshPath');
|
|
22
|
-
(this.serverUrl = e.serverUrl),
|
|
23
|
-
(this.clientId = e.clientId),
|
|
24
|
-
(this.redirectUri = e.redirectUri),
|
|
25
|
-
(this.scope = e.scope),
|
|
26
|
-
(this.mePath = e.mePath ?? '/app/me'),
|
|
27
|
-
(this.loginPath = e.loginPath ?? '/app/login'),
|
|
28
|
-
(this.registerPath = e.registerPath ?? '/app/register'),
|
|
29
|
-
(this.logoutPath = e.logoutPath ?? '/app/logout'),
|
|
30
|
-
(this.tokenRefreshPath = e.tokenRefreshPath ?? '/app/refresh');
|
|
6
|
+
/** A class responsible for generating URLs that FusionAuth SDKs interact with. */
|
|
7
|
+
class UrlHelper {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.serverUrl = config.serverUrl;
|
|
10
|
+
this.clientId = config.clientId;
|
|
11
|
+
this.redirectUri = config.redirectUri;
|
|
12
|
+
this.scope = config.scope;
|
|
13
|
+
this.postLogoutRedirectUri = config.postLogoutRedirectUri;
|
|
14
|
+
this.mePath = config.mePath ?? '/app/me';
|
|
15
|
+
this.loginPath = config.loginPath ?? '/app/login';
|
|
16
|
+
this.registerPath = config.registerPath ?? '/app/register';
|
|
17
|
+
this.logoutPath = config.logoutPath ?? '/app/logout';
|
|
18
|
+
this.tokenRefreshPath = config.tokenRefreshPath ?? '/app/refresh';
|
|
31
19
|
}
|
|
32
20
|
getMeUrl() {
|
|
33
21
|
return this.generateUrl(this.mePath);
|
|
34
22
|
}
|
|
35
|
-
getLoginUrl(
|
|
23
|
+
getLoginUrl(state) {
|
|
36
24
|
return this.generateUrl(this.loginPath, {
|
|
37
25
|
client_id: this.clientId,
|
|
38
26
|
redirect_uri: this.redirectUri,
|
|
39
27
|
scope: this.scope,
|
|
40
|
-
state
|
|
28
|
+
state,
|
|
41
29
|
});
|
|
42
30
|
}
|
|
43
|
-
getRegisterUrl(
|
|
31
|
+
getRegisterUrl(state) {
|
|
44
32
|
return this.generateUrl(this.registerPath, {
|
|
45
33
|
client_id: this.clientId,
|
|
46
34
|
redirect_uri: this.redirectUri,
|
|
47
35
|
scope: this.scope,
|
|
48
|
-
state
|
|
36
|
+
state,
|
|
49
37
|
});
|
|
50
38
|
}
|
|
51
39
|
getLogoutUrl() {
|
|
52
40
|
return this.generateUrl(this.logoutPath, {
|
|
53
41
|
client_id: this.clientId,
|
|
54
|
-
post_logout_redirect_uri: this.redirectUri,
|
|
42
|
+
post_logout_redirect_uri: this.postLogoutRedirectUri || this.redirectUri,
|
|
55
43
|
});
|
|
56
44
|
}
|
|
57
45
|
getTokenRefreshUrl() {
|
|
@@ -59,175 +47,264 @@ class g {
|
|
|
59
47
|
client_id: this.clientId,
|
|
60
48
|
});
|
|
61
49
|
}
|
|
62
|
-
generateUrl(
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
50
|
+
generateUrl(path, params) {
|
|
51
|
+
const url = new URL(this.serverUrl);
|
|
52
|
+
url.pathname = path;
|
|
53
|
+
if (params) {
|
|
54
|
+
const urlSearchParams = this.generateURLSearchParams(params);
|
|
55
|
+
url.search = urlSearchParams.toString();
|
|
67
56
|
}
|
|
68
|
-
return
|
|
57
|
+
return url;
|
|
69
58
|
}
|
|
70
|
-
generateURLSearchParams(
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
59
|
+
generateURLSearchParams(params) {
|
|
60
|
+
const urlSearchParams = new URLSearchParams();
|
|
61
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
62
|
+
if (value) {
|
|
63
|
+
urlSearchParams.append(key, value);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return urlSearchParams;
|
|
76
67
|
}
|
|
77
68
|
}
|
|
78
|
-
|
|
69
|
+
|
|
70
|
+
/** A class responsible for storing a redirect value in localStorage and cleanup afterward. */
|
|
71
|
+
class RedirectHelper {
|
|
79
72
|
constructor() {
|
|
80
|
-
|
|
73
|
+
this.REDIRECT_VALUE = 'fa-sdk-redirect-value';
|
|
81
74
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
75
|
+
get storage() {
|
|
76
|
+
try {
|
|
77
|
+
return localStorage;
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// fallback for non-browser environments where localStorage is not defined.
|
|
81
|
+
return {
|
|
82
|
+
/* eslint-disable */
|
|
83
|
+
setItem(_key, _value) { },
|
|
84
|
+
getItem(_key) { },
|
|
85
|
+
removeItem(_key) { },
|
|
86
|
+
/* eslint-enable */
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
handlePreRedirect(state) {
|
|
91
|
+
const valueForStorage = `${this.generateRandomString()}:${state ?? ''}`;
|
|
92
|
+
this.storage.setItem(this.REDIRECT_VALUE, valueForStorage);
|
|
85
93
|
}
|
|
86
|
-
handlePostRedirect(
|
|
87
|
-
const
|
|
88
|
-
|
|
94
|
+
handlePostRedirect(callback) {
|
|
95
|
+
const stateValue = this.stateValue ?? undefined;
|
|
96
|
+
callback?.(stateValue);
|
|
97
|
+
this.storage.removeItem(this.REDIRECT_VALUE);
|
|
89
98
|
}
|
|
90
99
|
get didRedirect() {
|
|
91
|
-
return
|
|
100
|
+
return Boolean(this.storage.getItem(this.REDIRECT_VALUE));
|
|
92
101
|
}
|
|
93
102
|
get stateValue() {
|
|
94
|
-
const
|
|
95
|
-
if (!
|
|
103
|
+
const redirectValue = this.storage.getItem(this.REDIRECT_VALUE);
|
|
104
|
+
if (!redirectValue) {
|
|
96
105
|
return null;
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
}
|
|
107
|
+
const [, ...stateValue] = redirectValue.split(':');
|
|
108
|
+
return stateValue.join(':');
|
|
99
109
|
}
|
|
100
110
|
generateRandomString() {
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
111
|
+
const array = new Uint32Array(56 / 2);
|
|
112
|
+
window.crypto.getRandomValues(array);
|
|
113
|
+
return Array.from(array, (n) => ('0' + n.toString(16)).substring(-2)).join('');
|
|
104
114
|
}
|
|
105
115
|
}
|
|
106
|
-
|
|
107
|
-
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Gets the `app.at_exp` cookie and converts it to milliseconds since epoch.
|
|
119
|
+
* Returns -1 if the cookie is not present.
|
|
120
|
+
* @param cookieName - defaults to `app.at_exp`.
|
|
121
|
+
* @param adapter - SSR frameworks like Nuxt, Next, and angular/ssr will pass in an adapter.
|
|
122
|
+
*/
|
|
123
|
+
function getAccessTokenExpirationMoment(cookieName = 'app.at_exp', adapter) {
|
|
124
|
+
if (adapter) {
|
|
125
|
+
return toMilliseconds(adapter.at_exp(cookieName));
|
|
126
|
+
}
|
|
127
|
+
let cookie;
|
|
128
|
+
try {
|
|
129
|
+
// `document` throws a ReferenceError if this runs in a
|
|
130
|
+
// non-browser environment such as an SSR framework like Nuxt or Next.
|
|
131
|
+
cookie = document.cookie;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
console.error('Error accessing cookies in fusionauth. If you are using SSR you must configure the SDK with a cookie adapter');
|
|
135
|
+
return -1;
|
|
136
|
+
}
|
|
137
|
+
const expCookie = cookie
|
|
108
138
|
.split('; ')
|
|
109
|
-
.map(
|
|
110
|
-
.find(([
|
|
111
|
-
|
|
139
|
+
.map(c => c.split('='))
|
|
140
|
+
.find(([name]) => name === cookieName);
|
|
141
|
+
const cookieValue = expCookie?.[1];
|
|
142
|
+
return toMilliseconds(cookieValue);
|
|
112
143
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
144
|
+
function toMilliseconds(seconds) {
|
|
145
|
+
if (!seconds)
|
|
146
|
+
return -1;
|
|
147
|
+
else
|
|
148
|
+
return Number(seconds) * 1000;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/** A class containing framework-agnostic SDK methods */
|
|
152
|
+
class SDKCore {
|
|
153
|
+
constructor(config) {
|
|
154
|
+
this.redirectHelper = new RedirectHelper();
|
|
155
|
+
this.config = config;
|
|
156
|
+
this.urlHelper = new UrlHelper({
|
|
157
|
+
serverUrl: config.serverUrl,
|
|
158
|
+
clientId: config.clientId,
|
|
159
|
+
redirectUri: config.redirectUri,
|
|
160
|
+
scope: config.scope,
|
|
161
|
+
mePath: config.mePath,
|
|
162
|
+
loginPath: config.loginPath,
|
|
163
|
+
registerPath: config.registerPath,
|
|
164
|
+
logoutPath: config.logoutPath,
|
|
165
|
+
tokenRefreshPath: config.tokenRefreshPath,
|
|
166
|
+
postLogoutRedirectUri: config.postLogoutRedirectUri,
|
|
167
|
+
});
|
|
168
|
+
this.scheduleTokenExpiration();
|
|
169
|
+
}
|
|
170
|
+
startLogin(state) {
|
|
171
|
+
this.redirectHelper.handlePreRedirect(state);
|
|
172
|
+
window.location.assign(this.urlHelper.getLoginUrl(state));
|
|
173
|
+
}
|
|
174
|
+
startRegister(state) {
|
|
175
|
+
this.redirectHelper.handlePreRedirect(state);
|
|
176
|
+
window.location.assign(this.urlHelper.getRegisterUrl(state));
|
|
140
177
|
}
|
|
141
178
|
startLogout() {
|
|
142
179
|
window.location.assign(this.urlHelper.getLogoutUrl());
|
|
143
180
|
}
|
|
144
181
|
async fetchUserInfo() {
|
|
145
|
-
const
|
|
182
|
+
const userInfoResponse = await fetch(this.urlHelper.getMeUrl(), {
|
|
146
183
|
credentials: 'include',
|
|
147
184
|
});
|
|
148
|
-
if (!
|
|
149
|
-
throw new Error(`Unable to fetch userInfo in fusionauth. Request failed with status code ${
|
|
150
|
-
|
|
185
|
+
if (!userInfoResponse.ok) {
|
|
186
|
+
throw new Error(`Unable to fetch userInfo in fusionauth. Request failed with status code ${userInfoResponse?.status}`);
|
|
187
|
+
}
|
|
188
|
+
const userInfo = await userInfoResponse.json();
|
|
189
|
+
return userInfo;
|
|
151
190
|
}
|
|
152
191
|
async refreshToken() {
|
|
153
|
-
const
|
|
192
|
+
const response = await fetch(this.urlHelper.getTokenRefreshUrl(), {
|
|
154
193
|
method: 'POST',
|
|
155
194
|
credentials: 'include',
|
|
156
195
|
headers: {
|
|
157
196
|
'Content-Type': 'text/plain',
|
|
158
197
|
},
|
|
159
198
|
});
|
|
160
|
-
if (!(
|
|
161
|
-
const
|
|
199
|
+
if (!(response.status >= 200 && response.status < 300)) {
|
|
200
|
+
const message = (await response?.text()) ||
|
|
162
201
|
'Error refreshing access token in fusionauth';
|
|
163
|
-
throw new Error(
|
|
202
|
+
throw new Error(message);
|
|
164
203
|
}
|
|
165
|
-
|
|
204
|
+
// a successful request means that app_exp was bumped into the future.
|
|
205
|
+
// reschedule the access token expiration event.
|
|
206
|
+
this.scheduleTokenExpiration();
|
|
207
|
+
return response;
|
|
166
208
|
}
|
|
167
209
|
initAutoRefresh() {
|
|
168
|
-
|
|
169
|
-
if (!e)
|
|
210
|
+
if (!this.isLoggedIn) {
|
|
170
211
|
return;
|
|
171
|
-
|
|
212
|
+
}
|
|
213
|
+
const secondsBeforeRefresh = this.config.autoRefreshSecondsBeforeExpiry ?? 10;
|
|
214
|
+
const millisecondsBeforeRefresh = secondsBeforeRefresh * 1000;
|
|
215
|
+
const now = new Date().getTime();
|
|
216
|
+
const refreshTime = this.at_exp - millisecondsBeforeRefresh;
|
|
217
|
+
const timeTillRefresh = Math.max(refreshTime - now, 0);
|
|
172
218
|
return setTimeout(async () => {
|
|
173
|
-
let n, a;
|
|
174
219
|
try {
|
|
175
|
-
await this.refreshToken()
|
|
220
|
+
await this.refreshToken();
|
|
221
|
+
this.initAutoRefresh();
|
|
176
222
|
}
|
|
177
|
-
catch (
|
|
178
|
-
|
|
223
|
+
catch (error) {
|
|
224
|
+
this.config.onAutoRefreshFailure?.(error);
|
|
179
225
|
}
|
|
180
|
-
},
|
|
226
|
+
}, timeTillRefresh);
|
|
181
227
|
}
|
|
182
|
-
handlePostRedirect(
|
|
183
|
-
this.isLoggedIn &&
|
|
184
|
-
this.redirectHelper.
|
|
185
|
-
|
|
228
|
+
handlePostRedirect(callback) {
|
|
229
|
+
if (this.isLoggedIn && this.redirectHelper.didRedirect) {
|
|
230
|
+
this.redirectHelper.handlePostRedirect(callback);
|
|
231
|
+
}
|
|
186
232
|
}
|
|
187
233
|
get isLoggedIn() {
|
|
188
|
-
return this.at_exp
|
|
189
|
-
? this.at_exp > /* @__PURE__ */ new Date().getTime()
|
|
190
|
-
: !1;
|
|
234
|
+
return this.at_exp > new Date().getTime();
|
|
191
235
|
}
|
|
192
236
|
/** The moment of access token expiration in milliseconds since epoch. */
|
|
193
237
|
get at_exp() {
|
|
194
|
-
return
|
|
238
|
+
return getAccessTokenExpirationMoment(this.config.accessTokenExpireCookieName, this.config.cookieAdapter);
|
|
195
239
|
}
|
|
196
240
|
/** Schedules `onTokenExpiration` at moment of access token expiration. */
|
|
197
241
|
scheduleTokenExpiration() {
|
|
198
242
|
clearTimeout(this.tokenExpirationTimeout);
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
243
|
+
const now = new Date().getTime();
|
|
244
|
+
const millisecondsTillExpiration = this.at_exp - now;
|
|
245
|
+
if (millisecondsTillExpiration > 0) {
|
|
246
|
+
this.tokenExpirationTimeout = setTimeout(this.config.onTokenExpiration, millisecondsTillExpiration);
|
|
247
|
+
}
|
|
202
248
|
}
|
|
203
249
|
}
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const
|
|
208
|
-
|
|
250
|
+
|
|
251
|
+
/** Sets `app.at_exp` moment cookie so the user will be logged in for 1 hour. */
|
|
252
|
+
function mockIsLoggedIn() {
|
|
253
|
+
const expirationMoment = new Date();
|
|
254
|
+
expirationMoment.setHours(expirationMoment.getHours() + 1);
|
|
255
|
+
const oneHourInTheFutureInMilliseconds = expirationMoment.getTime() / 1000;
|
|
256
|
+
document.cookie = `app.at_exp=${oneHourInTheFutureInMilliseconds}`;
|
|
209
257
|
}
|
|
210
|
-
|
|
211
|
-
|
|
258
|
+
/** Removes the `app.at_exp` cookie. */
|
|
259
|
+
function removeAt_expCookie() {
|
|
260
|
+
document.cookie = 'app.at_exp' + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT';
|
|
212
261
|
}
|
|
213
|
-
|
|
214
|
-
|
|
262
|
+
|
|
263
|
+
function mockWindowLocation(vi) {
|
|
264
|
+
const mockedLocation = {
|
|
215
265
|
...window.location,
|
|
216
|
-
assign:
|
|
266
|
+
assign: vi.fn(),
|
|
217
267
|
};
|
|
218
|
-
|
|
268
|
+
vi.spyOn(window, 'location', 'get').mockReturnValue(mockedLocation);
|
|
269
|
+
return mockedLocation;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/** An adapter class that supports accessing cookies with SSR */
|
|
273
|
+
class SSRCookieAdapter {
|
|
274
|
+
constructor(isBrowser) {
|
|
275
|
+
this.isBrowser = isBrowser;
|
|
276
|
+
}
|
|
277
|
+
at_exp(cookieName = 'app.at_exp') {
|
|
278
|
+
if (!this.isBrowser) {
|
|
279
|
+
return;
|
|
280
|
+
}
|
|
281
|
+
try {
|
|
282
|
+
const expCookie = document.cookie
|
|
283
|
+
.split('; ')
|
|
284
|
+
.map(c => c.split('='))
|
|
285
|
+
.find(([name]) => name === cookieName);
|
|
286
|
+
return expCookie?.[1];
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
console.error('Error within the SSRCookieAdapter: ', error);
|
|
290
|
+
return -1;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
219
293
|
}
|
|
220
294
|
|
|
295
|
+
const FUSIONAUTH_SERVICE_CONFIG = new InjectionToken('FUSIONAUTH_SERVICE_CONFIG');
|
|
296
|
+
|
|
221
297
|
/**
|
|
222
298
|
* Service class to use with FusionAuth backend endpoints.
|
|
223
299
|
*/
|
|
224
300
|
class FusionAuthService {
|
|
225
|
-
constructor(config) {
|
|
226
|
-
this.core = new
|
|
301
|
+
constructor(config, platformId) {
|
|
302
|
+
this.core = new SDKCore({
|
|
227
303
|
...config,
|
|
228
304
|
onTokenExpiration: () => {
|
|
229
305
|
this.isLoggedInSubject.next(false);
|
|
230
306
|
},
|
|
307
|
+
cookieAdapter: new SSRCookieAdapter(isPlatformBrowser(platformId)),
|
|
231
308
|
});
|
|
232
309
|
this.isLoggedInSubject = new BehaviorSubject(this.core.isLoggedIn);
|
|
233
310
|
this.isLoggedIn$ = this.isLoggedInSubject.asObservable();
|
|
@@ -305,7 +382,21 @@ class FusionAuthService {
|
|
|
305
382
|
logout() {
|
|
306
383
|
this.core.startLogout();
|
|
307
384
|
}
|
|
385
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthService, deps: [{ token: FUSIONAUTH_SERVICE_CONFIG }, { token: PLATFORM_ID }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
386
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthService, providedIn: 'root' }); }
|
|
308
387
|
}
|
|
388
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: FusionAuthService, decorators: [{
|
|
389
|
+
type: Injectable,
|
|
390
|
+
args: [{
|
|
391
|
+
providedIn: 'root',
|
|
392
|
+
}]
|
|
393
|
+
}], ctorParameters: () => [{ type: undefined, decorators: [{
|
|
394
|
+
type: Inject,
|
|
395
|
+
args: [FUSIONAUTH_SERVICE_CONFIG]
|
|
396
|
+
}] }, { type: Object, decorators: [{
|
|
397
|
+
type: Inject,
|
|
398
|
+
args: [PLATFORM_ID]
|
|
399
|
+
}] }] });
|
|
309
400
|
|
|
310
401
|
class FusionAuthLoginButtonComponent {
|
|
311
402
|
constructor(fusionAuth) {
|
|
@@ -361,10 +452,8 @@ class FusionAuthModule {
|
|
|
361
452
|
return {
|
|
362
453
|
ngModule: FusionAuthModule,
|
|
363
454
|
providers: [
|
|
364
|
-
{
|
|
365
|
-
|
|
366
|
-
useValue: new FusionAuthService(fusionAuthConfig),
|
|
367
|
-
},
|
|
455
|
+
{ provide: FUSIONAUTH_SERVICE_CONFIG, useValue: fusionAuthConfig },
|
|
456
|
+
FusionAuthService,
|
|
368
457
|
],
|
|
369
458
|
};
|
|
370
459
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fusionauth-angular-sdk.mjs","sources":["../../../projects/fusionauth-angular-sdk/src/lib/core.ts","../../../projects/fusionauth-angular-sdk/src/lib/fusion-auth.service.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-login.button/fusion-auth-login-button.component.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-login.button/fusion-auth-login-button.component.html","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.html","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-register.button/fusion-auth-register-button.component.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-register.button/fusion-auth-register-button.component.html","../../../projects/fusionauth-angular-sdk/src/lib/fusion-auth.module.ts","../../../projects/fusionauth-angular-sdk/src/public-api.ts","../../../projects/fusionauth-angular-sdk/src/fusionauth-angular-sdk.ts"],"sourcesContent":["// @ts-nocheck\nconst u = Object.defineProperty;\nconst d = (r, e, t) =>\n e in r\n ? u(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t })\n : (r[e] = t);\nconst i = (r, e, t) => (d(r, typeof e != 'symbol' ? e + '' : e, t), t);\nclass g {\n constructor(e) {\n i(this, 'serverUrl');\n i(this, 'clientId');\n i(this, 'redirectUri');\n i(this, 'scope');\n i(this, 'mePath');\n i(this, 'loginPath');\n i(this, 'registerPath');\n i(this, 'logoutPath');\n i(this, 'tokenRefreshPath');\n (this.serverUrl = e.serverUrl),\n (this.clientId = e.clientId),\n (this.redirectUri = e.redirectUri),\n (this.scope = e.scope),\n (this.mePath = e.mePath ?? '/app/me'),\n (this.loginPath = e.loginPath ?? '/app/login'),\n (this.registerPath = e.registerPath ?? '/app/register'),\n (this.logoutPath = e.logoutPath ?? '/app/logout'),\n (this.tokenRefreshPath = e.tokenRefreshPath ?? '/app/refresh');\n }\n getMeUrl() {\n return this.generateUrl(this.mePath);\n }\n getLoginUrl(e) {\n return this.generateUrl(this.loginPath, {\n client_id: this.clientId,\n redirect_uri: this.redirectUri,\n scope: this.scope,\n state: e,\n });\n }\n getRegisterUrl(e) {\n return this.generateUrl(this.registerPath, {\n client_id: this.clientId,\n redirect_uri: this.redirectUri,\n scope: this.scope,\n state: e,\n });\n }\n getLogoutUrl() {\n return this.generateUrl(this.logoutPath, {\n client_id: this.clientId,\n post_logout_redirect_uri: this.redirectUri,\n });\n }\n getTokenRefreshUrl() {\n return this.generateUrl(this.tokenRefreshPath, {\n client_id: this.clientId,\n });\n }\n generateUrl(e, t) {\n const s = new URL(this.serverUrl);\n if (((s.pathname = e), t)) {\n const o = this.generateURLSearchParams(t);\n s.search = o.toString();\n }\n return s;\n }\n generateURLSearchParams(e) {\n const t = new URLSearchParams();\n return (\n Object.entries(e).forEach(([s, o]) => {\n o && t.append(s, o);\n }),\n t\n );\n }\n}\nclass p {\n constructor() {\n i(this, 'REDIRECT_VALUE', 'fa-sdk-redirect-value');\n }\n handlePreRedirect(e) {\n const t = `${this.generateRandomString()}:${e ?? ''}`;\n localStorage.setItem(this.REDIRECT_VALUE, t);\n }\n handlePostRedirect(e) {\n const t = this.stateValue ?? void 0;\n e == null || e(t), localStorage.removeItem(this.REDIRECT_VALUE);\n }\n get didRedirect() {\n return !!localStorage.getItem(this.REDIRECT_VALUE);\n }\n get stateValue() {\n const e = localStorage.getItem(this.REDIRECT_VALUE);\n if (!e) return null;\n const [, ...t] = e.split(':');\n return t.join(':');\n }\n generateRandomString() {\n const e = new Uint32Array(28);\n return (\n window.crypto.getRandomValues(e),\n Array.from(e, t => ('0' + t.toString(16)).substring(-2)).join('')\n );\n }\n}\nfunction m(r = 'app.at_exp') {\n const e = document.cookie\n .split('; ')\n .map(s => s.split('='))\n .find(([s]) => s === r),\n t = e == null ? void 0 : e[1];\n return t ? parseInt(t) * 1e3 : null;\n}\nclass U {\n constructor(e) {\n i(this, 'config');\n i(this, 'urlHelper');\n i(this, 'redirectHelper', new p());\n i(this, 'tokenExpirationTimeout');\n (this.config = e),\n (this.urlHelper = new g({\n serverUrl: e.serverUrl,\n clientId: e.clientId,\n redirectUri: e.redirectUri,\n scope: e.scope,\n mePath: e.mePath,\n loginPath: e.loginPath,\n registerPath: e.registerPath,\n logoutPath: e.logoutPath,\n tokenRefreshPath: e.tokenRefreshPath,\n })),\n this.scheduleTokenExpiration();\n }\n startLogin(e) {\n this.redirectHelper.handlePreRedirect(e),\n window.location.assign(this.urlHelper.getLoginUrl(e));\n }\n startRegister(e) {\n this.redirectHelper.handlePreRedirect(e),\n window.location.assign(this.urlHelper.getRegisterUrl(e));\n }\n startLogout() {\n window.location.assign(this.urlHelper.getLogoutUrl());\n }\n async fetchUserInfo() {\n const e = await fetch(this.urlHelper.getMeUrl(), {\n credentials: 'include',\n });\n if (!e.ok)\n throw new Error(\n `Unable to fetch userInfo in fusionauth. Request failed with status code ${e == null ? void 0 : e.status}`,\n );\n return await e.json();\n }\n async refreshToken() {\n const e = await fetch(this.urlHelper.getTokenRefreshUrl(), {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'text/plain',\n },\n });\n if (!(e.status >= 200 && e.status < 300)) {\n const t =\n (await (e == null ? void 0 : e.text())) ||\n 'Error refreshing access token in fusionauth';\n throw new Error(t);\n }\n return this.scheduleTokenExpiration(), e;\n }\n initAutoRefresh() {\n const e = this.at_exp,\n t = this.config.autoRefreshSecondsBeforeExpiry ?? 10;\n if (!e) return;\n const s = t * 1e3,\n o = /* @__PURE__ */ new Date().getTime(),\n h = e - s,\n l = Math.max(h - o, 0);\n return setTimeout(async () => {\n let n, a;\n try {\n await this.refreshToken(), this.initAutoRefresh();\n } catch (c) {\n (a = (n = this.config).onAutoRefreshFailure) == null || a.call(n, c);\n }\n }, l);\n }\n handlePostRedirect(e) {\n this.isLoggedIn &&\n this.redirectHelper.didRedirect &&\n this.redirectHelper.handlePostRedirect(e);\n }\n get isLoggedIn() {\n return this.at_exp\n ? this.at_exp > /* @__PURE__ */ new Date().getTime()\n : !1;\n }\n /** The moment of access token expiration in milliseconds since epoch. */\n get at_exp() {\n return m(this.config.accessTokenExpireCookieName);\n }\n /** Schedules `onTokenExpiration` at moment of access token expiration. */\n scheduleTokenExpiration() {\n clearTimeout(this.tokenExpirationTimeout);\n const e = this.at_exp ?? -1,\n t = /* @__PURE__ */ new Date().getTime(),\n s = e - t;\n s > 0 &&\n (this.tokenExpirationTimeout = setTimeout(\n this.config.onTokenExpiration,\n s,\n ));\n }\n}\nfunction P() {\n const r = /* @__PURE__ */ new Date();\n r.setHours(r.getHours() + 1);\n const e = r.getTime() / 1e3;\n document.cookie = `app.at_exp=${e}`;\n}\nfunction f() {\n document.cookie = 'app.at_exp=;expires=Thu, 01 Jan 1970 00:00:00 GMT';\n}\nfunction w(r) {\n const e = {\n ...window.location,\n assign: r.fn(),\n };\n return r.spyOn(window, 'location', 'get').mockReturnValue(e), e;\n}\nexport {\n U as SDKCore,\n P as mockIsLoggedIn,\n w as mockWindowLocation,\n f as removeAt_expCookie,\n};\n","import { SDKCore } from './core';\nimport { FusionAuthConfig, UserInfo } from './types';\nimport { Observable, catchError, BehaviorSubject } from 'rxjs';\n\n/**\n * Service class to use with FusionAuth backend endpoints.\n */\nexport class FusionAuthService {\n private core: SDKCore;\n private autoRefreshTimer?: NodeJS.Timeout;\n private isLoggedInSubject: BehaviorSubject<boolean>;\n\n constructor(config: FusionAuthConfig) {\n this.core = new SDKCore({\n ...config,\n onTokenExpiration: () => {\n this.isLoggedInSubject.next(false);\n },\n });\n\n this.isLoggedInSubject = new BehaviorSubject(this.core.isLoggedIn);\n this.isLoggedIn$ = this.isLoggedInSubject.asObservable();\n\n this.core.handlePostRedirect(config.onRedirect);\n\n if (config.shouldAutoRefresh && this.core.isLoggedIn) {\n this.initAutoRefresh();\n }\n }\n\n /** An observable representing whether the user is logged in. */\n isLoggedIn$: Observable<boolean>;\n\n /** A function that returns whether the user is logged in. This returned value is non-observable. */\n isLoggedIn() {\n return this.core.isLoggedIn;\n }\n\n /**\n * Refreshes the access token a single time.\n * Automatic token refreshing can be enabled if the SDK is configured with `shouldAutoRefresh`.\n */\n async refreshToken(): Promise<Response> {\n return await this.core.refreshToken();\n }\n\n /**\n * Initializes automatic access token refreshing.\n * This is handled automatically if the SDK is configured with `shouldAutoRefresh`.\n */\n initAutoRefresh(): void {\n if (this.autoRefreshTimer) {\n clearTimeout(this.autoRefreshTimer);\n }\n\n this.autoRefreshTimer = this.core.initAutoRefresh();\n }\n\n /**\n * Returns an observable request that fetches userInfo, and catches error.\n */\n getUserInfoObservable(callbacks?: {\n onBegin?: () => void;\n onDone?: () => void;\n }): Observable<UserInfo> {\n callbacks?.onBegin?.();\n return new Observable<UserInfo>(observer => {\n this.core\n .fetchUserInfo()\n .then(userInfo => {\n observer.next(userInfo);\n })\n .catch(error => {\n observer.error(error);\n })\n .finally(() => {\n callbacks?.onDone?.();\n });\n }).pipe(\n catchError(error => {\n throw error;\n }),\n );\n }\n\n /**\n * Fetches userInfo from the 'me' endpoint.\n * @throws {Error} - if an error occurred while fetching.\n */\n async getUserInfo(): Promise<UserInfo> {\n return await this.core.fetchUserInfo();\n }\n\n /**\n * Initiates login flow.\n * @param {string} [state] - Optional value to be echoed back to the SDK upon redirect.\n */\n startLogin(state?: string): void {\n this.core.startLogin(state);\n }\n\n /**\n * Initiates register flow.\n * @param {string} [state] - Optional value to be echoed back to the SDK upon redirect.\n */\n startRegistration(state?: string): void {\n this.core.startRegister(state);\n }\n\n /**\n * Initiates logout flow.\n */\n logout(): void {\n this.core.startLogout();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { FusionAuthService } from '../../fusion-auth.service';\n\n@Component({\n selector: 'fa-login',\n templateUrl: './fusion-auth-login-button.component.html',\n styleUrls: ['./fusion-auth-login-button.component.scss'],\n})\nexport class FusionAuthLoginButtonComponent {\n @Input() state: string | undefined;\n\n constructor(private fusionAuth: FusionAuthService) {}\n\n login() {\n this.fusionAuth.startLogin(this.state);\n }\n}\n","<button class=\"fa-button\" (click)=\"login()\">\n <span>Login</span>\n</button>\n","import { Component } from '@angular/core';\nimport { FusionAuthService } from '../../fusion-auth.service';\n\n@Component({\n selector: 'fa-logout',\n templateUrl: './fusion-auth-logout-button.component.html',\n styleUrls: ['./fusion-auth-logout-button.component.scss'],\n})\nexport class FusionAuthLogoutButtonComponent {\n constructor(private fusionAuth: FusionAuthService) {}\n\n logout() {\n this.fusionAuth.logout();\n }\n}\n","<button class=\"fa-logout-button\" (click)=\"logout()\">\n <span>logout</span>\n</button>\n","import { Component, Input } from '@angular/core';\nimport { FusionAuthService } from '../../fusion-auth.service';\n\n@Component({\n selector: 'fa-register',\n templateUrl: './fusion-auth-register-button.component.html',\n styleUrls: ['./fusion-auth-register-button.component.scss'],\n})\nexport class FusionAuthRegisterButtonComponent {\n @Input() state: string | undefined;\n\n constructor(private fusionAuth: FusionAuthService) {}\n\n register() {\n this.fusionAuth.startRegistration(this.state);\n }\n}\n","<button class=\"fa-button\" (click)=\"register()\">\n <span>Register Now</span>\n</button>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FusionAuthConfig } from './types';\nimport { FusionAuthService } from './fusion-auth.service';\nimport { FusionAuthLoginButtonComponent } from './components/fusionauth-login.button/fusion-auth-login-button.component';\nimport { FusionAuthLogoutButtonComponent } from './components/fusionauth-logout.button/fusion-auth-logout-button.component';\nimport { FusionAuthRegisterButtonComponent } from './components/fusionauth-register.button/fusion-auth-register-button.component';\n\n@NgModule({\n declarations: [\n FusionAuthLoginButtonComponent,\n FusionAuthLogoutButtonComponent,\n FusionAuthRegisterButtonComponent,\n ],\n imports: [],\n exports: [\n FusionAuthLoginButtonComponent,\n FusionAuthLogoutButtonComponent,\n FusionAuthRegisterButtonComponent,\n ],\n})\nexport class FusionAuthModule {\n static forRoot(\n fusionAuthConfig: FusionAuthConfig,\n ): ModuleWithProviders<FusionAuthModule> {\n return {\n ngModule: FusionAuthModule,\n providers: [\n {\n provide: FusionAuthService,\n useValue: new FusionAuthService(fusionAuthConfig),\n },\n ],\n };\n }\n}\n","/*\n * Public API Surface of fusionauth-angular-sdk\n */\n\nexport * from './lib/fusion-auth.service';\nexport * from './lib/components/fusionauth-login.button/fusion-auth-login-button.component';\nexport * from './lib/components/fusionauth-logout.button/fusion-auth-logout-button.component';\nexport * from './lib/components/fusionauth-register.button/fusion-auth-register-button.component';\nexport * from './lib/fusion-auth.module';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["SDKCore","i1.FusionAuthService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fusionauth-angular-sdk.mjs","sources":["../../../projects/fusionauth-angular-sdk/src/sdkcore/UrlHelper/UrlHelper.ts","../../../projects/fusionauth-angular-sdk/src/sdkcore/RedirectHelper/RedirectHelper.ts","../../../projects/fusionauth-angular-sdk/src/sdkcore/CookieHelpers/CookieHelpers.ts","../../../projects/fusionauth-angular-sdk/src/sdkcore/SDKCore/SDKCore.ts","../../../projects/fusionauth-angular-sdk/src/sdkcore/testUtils/mockLoggedIn.ts","../../../projects/fusionauth-angular-sdk/src/sdkcore/testUtils/mockWindowLocation.ts","../../../projects/fusionauth-angular-sdk/src/lib/SSRCookieAdapter.ts","../../../projects/fusionauth-angular-sdk/src/lib/injectionToken.ts","../../../projects/fusionauth-angular-sdk/src/lib/fusion-auth.service.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-login.button/fusion-auth-login-button.component.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-login.button/fusion-auth-login-button.component.html","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-logout.button/fusion-auth-logout-button.component.html","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-register.button/fusion-auth-register-button.component.ts","../../../projects/fusionauth-angular-sdk/src/lib/components/fusionauth-register.button/fusion-auth-register-button.component.html","../../../projects/fusionauth-angular-sdk/src/lib/fusion-auth.module.ts","../../../projects/fusionauth-angular-sdk/src/public-api.ts","../../../projects/fusionauth-angular-sdk/src/fusionauth-angular-sdk.ts"],"sourcesContent":["import { UrlHelperConfig, UrlHelperQueryParams } from './UrlHelperTypes';\n\n/** A class responsible for generating URLs that FusionAuth SDKs interact with. */\nexport class UrlHelper {\n serverUrl: string;\n clientId: string;\n redirectUri: string;\n scope?: string;\n\n mePath: string;\n loginPath: string;\n registerPath: string;\n logoutPath: string;\n tokenRefreshPath: string;\n postLogoutRedirectUri?: string;\n\n constructor(config: UrlHelperConfig) {\n this.serverUrl = config.serverUrl;\n this.clientId = config.clientId;\n this.redirectUri = config.redirectUri;\n this.scope = config.scope;\n this.postLogoutRedirectUri = config.postLogoutRedirectUri;\n\n this.mePath = config.mePath ?? '/app/me';\n this.loginPath = config.loginPath ?? '/app/login';\n this.registerPath = config.registerPath ?? '/app/register';\n this.logoutPath = config.logoutPath ?? '/app/logout';\n this.tokenRefreshPath = config.tokenRefreshPath ?? '/app/refresh';\n }\n\n getMeUrl(): URL {\n return this.generateUrl(this.mePath);\n }\n\n getLoginUrl(state?: string): URL {\n return this.generateUrl(this.loginPath, {\n client_id: this.clientId,\n redirect_uri: this.redirectUri,\n scope: this.scope,\n state,\n });\n }\n\n getRegisterUrl(state?: string): URL {\n return this.generateUrl(this.registerPath, {\n client_id: this.clientId,\n redirect_uri: this.redirectUri,\n scope: this.scope,\n state,\n });\n }\n\n getLogoutUrl(): URL {\n return this.generateUrl(this.logoutPath, {\n client_id: this.clientId,\n post_logout_redirect_uri: this.postLogoutRedirectUri || this.redirectUri,\n });\n }\n\n getTokenRefreshUrl(): URL {\n return this.generateUrl(this.tokenRefreshPath, {\n client_id: this.clientId,\n });\n }\n\n private generateUrl(path: string, params?: UrlHelperQueryParams): URL {\n const url = new URL(this.serverUrl);\n url.pathname = path;\n\n if (params) {\n const urlSearchParams = this.generateURLSearchParams(params);\n url.search = urlSearchParams.toString();\n }\n\n return url;\n }\n\n private generateURLSearchParams(\n params: UrlHelperQueryParams,\n ): URLSearchParams {\n const urlSearchParams = new URLSearchParams();\n\n Object.entries(params).forEach(([key, value]) => {\n if (value) {\n urlSearchParams.append(key, value);\n }\n });\n\n return urlSearchParams;\n }\n}\n","/** A class responsible for storing a redirect value in localStorage and cleanup afterward. */\nexport class RedirectHelper {\n private readonly REDIRECT_VALUE = 'fa-sdk-redirect-value';\n private get storage(): Storage {\n try {\n return localStorage;\n } catch {\n // fallback for non-browser environments where localStorage is not defined.\n return {\n /* eslint-disable */\n setItem(_key: string, _value: string) {},\n getItem(_key: string) {},\n removeItem(_key: string) {},\n /* eslint-enable */\n } as Storage;\n }\n }\n\n handlePreRedirect(state?: string) {\n const valueForStorage = `${this.generateRandomString()}:${state ?? ''}`;\n this.storage.setItem(this.REDIRECT_VALUE, valueForStorage);\n }\n\n handlePostRedirect(callback?: (state?: string) => void) {\n const stateValue = this.stateValue ?? undefined;\n callback?.(stateValue);\n this.storage.removeItem(this.REDIRECT_VALUE);\n }\n\n get didRedirect() {\n return Boolean(this.storage.getItem(this.REDIRECT_VALUE));\n }\n\n private get stateValue() {\n const redirectValue = this.storage.getItem(this.REDIRECT_VALUE);\n\n if (!redirectValue) {\n return null;\n }\n\n const [, ...stateValue] = redirectValue.split(':');\n return stateValue.join(':');\n }\n\n private generateRandomString() {\n const array = new Uint32Array(56 / 2);\n window.crypto.getRandomValues(array);\n return Array.from(array, (n: number) =>\n ('0' + n.toString(16)).substring(-2),\n ).join('');\n }\n}\n","/**\n * Gets the `app.at_exp` cookie and converts it to milliseconds since epoch.\n * Returns -1 if the cookie is not present.\n * @param cookieName - defaults to `app.at_exp`.\n * @param adapter - SSR frameworks like Nuxt, Next, and angular/ssr will pass in an adapter.\n */\nexport function getAccessTokenExpirationMoment(\n cookieName: string = 'app.at_exp',\n adapter?: CookieAdapter,\n): number | -1 {\n if (adapter) {\n return toMilliseconds(adapter.at_exp(cookieName));\n }\n\n let cookie;\n\n try {\n // `document` throws a ReferenceError if this runs in a\n // non-browser environment such as an SSR framework like Nuxt or Next.\n cookie = document.cookie;\n } catch {\n console.error(\n 'Error accessing cookies in fusionauth. If you are using SSR you must configure the SDK with a cookie adapter',\n );\n return -1;\n }\n\n const expCookie = cookie\n .split('; ')\n .map(c => c.split('='))\n .find(([name]) => name === cookieName);\n const cookieValue = expCookie?.[1];\n\n return toMilliseconds(cookieValue);\n}\n\nexport interface CookieAdapter {\n /** returns the `app.at_exp` cookie without manipulating the value. */\n at_exp: (cookieName?: string) => number | string | undefined;\n}\n\nfunction toMilliseconds(seconds?: number | string): number {\n if (!seconds) return -1;\n else return Number(seconds) * 1000;\n}\n","import { UrlHelper } from '../UrlHelper';\nimport { SDKConfig } from '../SDKConfig';\nimport { UserInfo } from '../SDKContext';\nimport { RedirectHelper } from '../RedirectHelper';\nimport { getAccessTokenExpirationMoment } from '../CookieHelpers';\n\n/** A class containing framework-agnostic SDK methods */\nexport class SDKCore {\n private config: SDKConfig;\n private urlHelper: UrlHelper;\n private redirectHelper: RedirectHelper = new RedirectHelper();\n private tokenExpirationTimeout?: NodeJS.Timeout;\n\n constructor(config: SDKConfig) {\n this.config = config;\n this.urlHelper = new UrlHelper({\n serverUrl: config.serverUrl,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n scope: config.scope,\n mePath: config.mePath,\n loginPath: config.loginPath,\n registerPath: config.registerPath,\n logoutPath: config.logoutPath,\n tokenRefreshPath: config.tokenRefreshPath,\n postLogoutRedirectUri: config.postLogoutRedirectUri,\n });\n this.scheduleTokenExpiration();\n }\n\n startLogin(state?: string) {\n this.redirectHelper.handlePreRedirect(state);\n window.location.assign(this.urlHelper.getLoginUrl(state));\n }\n\n startRegister(state?: string) {\n this.redirectHelper.handlePreRedirect(state);\n window.location.assign(this.urlHelper.getRegisterUrl(state));\n }\n\n startLogout() {\n window.location.assign(this.urlHelper.getLogoutUrl());\n }\n\n async fetchUserInfo() {\n const userInfoResponse = await fetch(this.urlHelper.getMeUrl(), {\n credentials: 'include',\n });\n\n if (!userInfoResponse.ok) {\n throw new Error(\n `Unable to fetch userInfo in fusionauth. Request failed with status code ${userInfoResponse?.status}`,\n );\n }\n\n const userInfo: UserInfo = await userInfoResponse.json();\n return userInfo;\n }\n\n async refreshToken(): Promise<Response> {\n const response = await fetch(this.urlHelper.getTokenRefreshUrl(), {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'text/plain',\n },\n });\n\n if (!(response.status >= 200 && response.status < 300)) {\n const message =\n (await response?.text()) ||\n 'Error refreshing access token in fusionauth';\n throw new Error(message);\n }\n\n // a successful request means that app_exp was bumped into the future.\n // reschedule the access token expiration event.\n this.scheduleTokenExpiration();\n\n return response;\n }\n\n initAutoRefresh(): NodeJS.Timeout | undefined {\n if (!this.isLoggedIn) {\n return;\n }\n\n const secondsBeforeRefresh =\n this.config.autoRefreshSecondsBeforeExpiry ?? 10;\n\n const millisecondsBeforeRefresh = secondsBeforeRefresh * 1000;\n\n const now = new Date().getTime();\n const refreshTime = this.at_exp - millisecondsBeforeRefresh;\n const timeTillRefresh = Math.max(refreshTime - now, 0);\n\n return setTimeout(async () => {\n try {\n await this.refreshToken();\n this.initAutoRefresh();\n } catch (error) {\n this.config.onAutoRefreshFailure?.(error as Error);\n }\n }, timeTillRefresh);\n }\n\n handlePostRedirect(callback?: (state?: string) => void) {\n if (this.isLoggedIn && this.redirectHelper.didRedirect) {\n this.redirectHelper.handlePostRedirect(callback);\n }\n }\n\n get isLoggedIn() {\n return this.at_exp > new Date().getTime();\n }\n\n /** The moment of access token expiration in milliseconds since epoch. */\n private get at_exp(): number | -1 {\n return getAccessTokenExpirationMoment(\n this.config.accessTokenExpireCookieName,\n this.config.cookieAdapter,\n );\n }\n\n /** Schedules `onTokenExpiration` at moment of access token expiration. */\n private scheduleTokenExpiration(): void {\n clearTimeout(this.tokenExpirationTimeout);\n\n const now = new Date().getTime();\n const millisecondsTillExpiration = this.at_exp - now;\n\n if (millisecondsTillExpiration > 0) {\n this.tokenExpirationTimeout = setTimeout(\n this.config.onTokenExpiration,\n millisecondsTillExpiration,\n );\n }\n }\n}\n","/** Sets `app.at_exp` moment cookie so the user will be logged in for 1 hour. */\nfunction mockIsLoggedIn() {\n const expirationMoment = new Date();\n expirationMoment.setHours(expirationMoment.getHours() + 1);\n const oneHourInTheFutureInMilliseconds = expirationMoment.getTime() / 1000;\n document.cookie = `app.at_exp=${oneHourInTheFutureInMilliseconds}`;\n}\n\n/** Removes the `app.at_exp` cookie. */\nfunction removeAt_expCookie() {\n document.cookie = 'app.at_exp' + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT';\n}\n\nexport { mockIsLoggedIn, removeAt_expCookie };\n","import { VitestUtils } from 'vitest';\n\nfunction mockWindowLocation(vi: VitestUtils) {\n const mockedLocation = {\n ...window.location,\n assign: vi.fn(),\n };\n vi.spyOn(window, 'location', 'get').mockReturnValue(mockedLocation);\n return mockedLocation;\n}\n\nexport { mockWindowLocation };\n","import { CookieAdapter } from '../sdkcore';\n\n/** An adapter class that supports accessing cookies with SSR */\nexport class SSRCookieAdapter implements CookieAdapter {\n constructor(private isBrowser: boolean) {}\n\n at_exp(cookieName: string = 'app.at_exp') {\n if (!this.isBrowser) {\n return;\n }\n\n try {\n const expCookie = document.cookie\n .split('; ')\n .map(c => c.split('='))\n .find(([name]) => name === cookieName);\n return expCookie?.[1];\n } catch (error) {\n console.error('Error within the SSRCookieAdapter: ', error);\n return -1;\n }\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { FusionAuthConfig } from './types';\n\nexport const FUSIONAUTH_SERVICE_CONFIG = new InjectionToken<FusionAuthConfig>(\n 'FUSIONAUTH_SERVICE_CONFIG',\n);\n","import { Injectable, Inject, PLATFORM_ID } from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { Observable, catchError, BehaviorSubject } from 'rxjs';\n\nimport { SDKCore } from '../sdkcore';\nimport { SSRCookieAdapter } from './SSRCookieAdapter';\nimport { FusionAuthConfig, UserInfo } from './types';\nimport { FUSIONAUTH_SERVICE_CONFIG } from './injectionToken';\n\n/**\n * Service class to use with FusionAuth backend endpoints.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FusionAuthService {\n private core: SDKCore;\n private autoRefreshTimer?: NodeJS.Timeout;\n private isLoggedInSubject: BehaviorSubject<boolean>;\n\n constructor(\n @Inject(FUSIONAUTH_SERVICE_CONFIG) config: FusionAuthConfig,\n @Inject(PLATFORM_ID) platformId: Object,\n ) {\n this.core = new SDKCore({\n ...config,\n onTokenExpiration: () => {\n this.isLoggedInSubject.next(false);\n },\n cookieAdapter: new SSRCookieAdapter(isPlatformBrowser(platformId)),\n });\n\n this.isLoggedInSubject = new BehaviorSubject(this.core.isLoggedIn);\n this.isLoggedIn$ = this.isLoggedInSubject.asObservable();\n\n this.core.handlePostRedirect(config.onRedirect);\n\n if (config.shouldAutoRefresh && this.core.isLoggedIn) {\n this.initAutoRefresh();\n }\n }\n\n /** An observable representing whether the user is logged in. */\n isLoggedIn$: Observable<boolean>;\n\n /** A function that returns whether the user is logged in. This returned value is non-observable. */\n isLoggedIn() {\n return this.core.isLoggedIn;\n }\n\n /**\n * Refreshes the access token a single time.\n * Automatic token refreshing can be enabled if the SDK is configured with `shouldAutoRefresh`.\n */\n async refreshToken(): Promise<Response> {\n return await this.core.refreshToken();\n }\n\n /**\n * Initializes automatic access token refreshing.\n * This is handled automatically if the SDK is configured with `shouldAutoRefresh`.\n */\n initAutoRefresh(): void {\n if (this.autoRefreshTimer) {\n clearTimeout(this.autoRefreshTimer);\n }\n\n this.autoRefreshTimer = this.core.initAutoRefresh();\n }\n\n /**\n * Returns an observable request that fetches userInfo, and catches error.\n */\n getUserInfoObservable(callbacks?: {\n onBegin?: () => void;\n onDone?: () => void;\n }): Observable<UserInfo> {\n callbacks?.onBegin?.();\n return new Observable<UserInfo>(observer => {\n this.core\n .fetchUserInfo()\n .then(userInfo => {\n observer.next(userInfo);\n })\n .catch(error => {\n observer.error(error);\n })\n .finally(() => {\n callbacks?.onDone?.();\n });\n }).pipe(\n catchError(error => {\n throw error;\n }),\n );\n }\n\n /**\n * Fetches userInfo from the 'me' endpoint.\n * @throws {Error} - if an error occurred while fetching.\n */\n async getUserInfo(): Promise<UserInfo> {\n return await this.core.fetchUserInfo();\n }\n\n /**\n * Initiates login flow.\n * @param {string} [state] - Optional value to be echoed back to the SDK upon redirect.\n */\n startLogin(state?: string): void {\n this.core.startLogin(state);\n }\n\n /**\n * Initiates register flow.\n * @param {string} [state] - Optional value to be echoed back to the SDK upon redirect.\n */\n startRegistration(state?: string): void {\n this.core.startRegister(state);\n }\n\n /**\n * Initiates logout flow.\n */\n logout(): void {\n this.core.startLogout();\n }\n}\n","import { Component, Input } from '@angular/core';\nimport { FusionAuthService } from '../../fusion-auth.service';\n\n@Component({\n selector: 'fa-login',\n templateUrl: './fusion-auth-login-button.component.html',\n styleUrls: ['./fusion-auth-login-button.component.scss'],\n})\nexport class FusionAuthLoginButtonComponent {\n @Input() state: string | undefined;\n\n constructor(private fusionAuth: FusionAuthService) {}\n\n login() {\n this.fusionAuth.startLogin(this.state);\n }\n}\n","<button class=\"fa-button\" (click)=\"login()\">\n <span>Login</span>\n</button>\n","import { Component } from '@angular/core';\nimport { FusionAuthService } from '../../fusion-auth.service';\n\n@Component({\n selector: 'fa-logout',\n templateUrl: './fusion-auth-logout-button.component.html',\n styleUrls: ['./fusion-auth-logout-button.component.scss'],\n})\nexport class FusionAuthLogoutButtonComponent {\n constructor(private fusionAuth: FusionAuthService) {}\n\n logout() {\n this.fusionAuth.logout();\n }\n}\n","<button class=\"fa-logout-button\" (click)=\"logout()\">\n <span>logout</span>\n</button>\n","import { Component, Input } from '@angular/core';\nimport { FusionAuthService } from '../../fusion-auth.service';\n\n@Component({\n selector: 'fa-register',\n templateUrl: './fusion-auth-register-button.component.html',\n styleUrls: ['./fusion-auth-register-button.component.scss'],\n})\nexport class FusionAuthRegisterButtonComponent {\n @Input() state: string | undefined;\n\n constructor(private fusionAuth: FusionAuthService) {}\n\n register() {\n this.fusionAuth.startRegistration(this.state);\n }\n}\n","<button class=\"fa-button\" (click)=\"register()\">\n <span>Register Now</span>\n</button>\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FusionAuthConfig } from './types';\nimport { FusionAuthService } from './fusion-auth.service';\nimport { FUSIONAUTH_SERVICE_CONFIG } from './injectionToken';\nimport { FusionAuthLoginButtonComponent } from './components/fusionauth-login.button/fusion-auth-login-button.component';\nimport { FusionAuthLogoutButtonComponent } from './components/fusionauth-logout.button/fusion-auth-logout-button.component';\nimport { FusionAuthRegisterButtonComponent } from './components/fusionauth-register.button/fusion-auth-register-button.component';\n\n@NgModule({\n declarations: [\n FusionAuthLoginButtonComponent,\n FusionAuthLogoutButtonComponent,\n FusionAuthRegisterButtonComponent,\n ],\n imports: [],\n exports: [\n FusionAuthLoginButtonComponent,\n FusionAuthLogoutButtonComponent,\n FusionAuthRegisterButtonComponent,\n ],\n})\nexport class FusionAuthModule {\n static forRoot(\n fusionAuthConfig: FusionAuthConfig,\n ): ModuleWithProviders<FusionAuthModule> {\n return {\n ngModule: FusionAuthModule,\n providers: [\n { provide: FUSIONAUTH_SERVICE_CONFIG, useValue: fusionAuthConfig },\n FusionAuthService,\n ],\n };\n }\n}\n","/*\n * Public API Surface of fusionauth-angular-sdk\n */\n\nexport * from './lib/fusion-auth.service';\nexport * from './lib/components/fusionauth-login.button/fusion-auth-login-button.component';\nexport * from './lib/components/fusionauth-logout.button/fusion-auth-logout-button.component';\nexport * from './lib/components/fusionauth-register.button/fusion-auth-register-button.component';\nexport * from './lib/fusion-auth.module';\nexport * from './lib/types';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.FusionAuthService"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { CookieAdapter } from '../sdkcore';
|
|
2
|
+
/** An adapter class that supports accessing cookies with SSR */
|
|
3
|
+
export declare class SSRCookieAdapter implements CookieAdapter {
|
|
4
|
+
private isBrowser;
|
|
5
|
+
constructor(isBrowser: boolean);
|
|
6
|
+
at_exp(cookieName?: string): string | -1 | undefined;
|
|
7
|
+
}
|