-
Notifications
You must be signed in to change notification settings - Fork 123
/
utilities.js
146 lines (122 loc) · 3.99 KB
/
utilities.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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
140
141
142
143
144
145
146
import appendQuery from 'append-query';
import * as Sentry from '@sentry/browser';
import 'url-search-params-polyfill';
import recordEvent from '../../monitoring/record-event';
import environment from '../../utilities/environment';
import { eauthEnvironmentPrefixes } from '../../utilities/sso/constants';
import { setLoginAttempted } from 'platform/utilities/sso/loginAttempted';
import { loginAppUrlRE } from 'applications/login/utilities/paths';
export const authnSettings = {
RETURN_URL: 'authReturnUrl',
};
export const externalRedirects = {
myvahealth: environment.isProduction()
? 'https://patientportal.myhealth.va.gov/'
: 'https://staging-patientportal.myhealth.va.gov/',
};
export const ssoKeepAliveEndpoint = () => {
const envPrefix = eauthEnvironmentPrefixes[environment.BUILDTYPE];
return `https://${envPrefix}eauth.va.gov/keepalive`;
};
export function sessionTypeUrl({
type = '',
version = 'v1',
queryParams = {},
}) {
// force v1 regardless of version
const base = `${environment.API_URL}/${version}/sessions`.replace(/v0/, 'v1');
const searchParams = new URLSearchParams(queryParams);
const queryString =
searchParams.toString() === '' ? '' : `?${searchParams.toString()}`;
return `${base}/${type}/new${queryString}`;
}
export function setSentryLoginType(loginType) {
Sentry.setTag('loginType', loginType);
}
export function clearSentryLoginType() {
Sentry.setTag('loginType', undefined);
}
function redirectWithGAClientId(redirectUrl) {
try {
// eslint-disable-next-line no-undef
const trackers = ga.getAll();
// Tracking IDs for Staging and Prod
const vagovTrackingIds = ['UA-50123418-16', 'UA-50123418-17'];
const tracker = trackers.find(t => {
const trackingId = t.get('trackingId');
return vagovTrackingIds.includes(trackingId);
});
const clientId = tracker && tracker.get('clientId');
window.location = clientId
? // eslint-disable-next-line camelcase
appendQuery(redirectUrl, { client_id: clientId })
: redirectUrl;
} catch (e) {
window.location = redirectUrl;
}
}
export function standaloneRedirect() {
const searchParams = new URLSearchParams(window.location.search);
const application = searchParams.get('application');
const to = searchParams.get('to');
let url = externalRedirects[application] || null;
if (url && to) {
const pathname = to.startsWith('/') ? to : `/${to}`;
url = url.endsWith('/') ? url.slice(0, -1) : url;
url = `${url}${pathname}`.replace('\r\n', ''); // Prevent CRLF injection.
}
return url;
}
function redirect(redirectUrl, clickedEvent) {
// Keep track of the URL to return to after auth operation.
// If the user is coming via the standalone sign-in, redirect to the home page.
const returnUrl = loginAppUrlRE.test(window.location.pathname)
? standaloneRedirect() || window.location.origin
: window.location;
sessionStorage.setItem(authnSettings.RETURN_URL, returnUrl);
recordEvent({ event: clickedEvent });
if (redirectUrl.includes('idme')) {
redirectWithGAClientId(redirectUrl);
} else {
window.location = redirectUrl;
}
}
export function login(
policy,
version = 'v1',
queryParams = {},
clickedEvent = 'login-link-clicked-modal',
) {
const url = sessionTypeUrl({ type: policy, version, queryParams });
setLoginAttempted();
return redirect(url, clickedEvent);
}
export function mfa(version = 'v1') {
return redirect(
sessionTypeUrl({ type: 'mfa', version }),
'multifactor-link-clicked',
);
}
export function verify(version = 'v1') {
return redirect(
sessionTypeUrl({ type: 'verify', version }),
'verify-link-clicked',
);
}
export function logout(
version = 'v1',
clickedEvent = 'logout-link-clicked',
queryParams = {},
) {
clearSentryLoginType();
return redirect(
sessionTypeUrl({ type: 'slo', version, queryParams }),
clickedEvent,
);
}
export function signup(version = 'v1') {
return redirect(
sessionTypeUrl({ type: 'signup', version }),
'register-link-clicked',
);
}