@jbrowse/plugin-authentication 2.2.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 (130) hide show
  1. package/LICENSE +201 -0
  2. package/dist/DropboxOAuthModel/configSchema.d.ts +5 -0
  3. package/dist/DropboxOAuthModel/configSchema.js +69 -0
  4. package/dist/DropboxOAuthModel/configSchema.js.map +1 -0
  5. package/dist/DropboxOAuthModel/index.d.ts +2 -0
  6. package/dist/DropboxOAuthModel/index.js +11 -0
  7. package/dist/DropboxOAuthModel/index.js.map +1 -0
  8. package/dist/DropboxOAuthModel/model.d.ts +98 -0
  9. package/dist/DropboxOAuthModel/model.js +103 -0
  10. package/dist/DropboxOAuthModel/model.js.map +1 -0
  11. package/dist/ExternalTokenModel/ExternalTokenEntryForm.d.ts +5 -0
  12. package/dist/ExternalTokenModel/ExternalTokenEntryForm.js +59 -0
  13. package/dist/ExternalTokenModel/ExternalTokenEntryForm.js.map +1 -0
  14. package/dist/ExternalTokenModel/configSchema.d.ts +5 -0
  15. package/dist/ExternalTokenModel/configSchema.js +26 -0
  16. package/dist/ExternalTokenModel/configSchema.js.map +1 -0
  17. package/dist/ExternalTokenModel/index.d.ts +2 -0
  18. package/dist/ExternalTokenModel/index.js +11 -0
  19. package/dist/ExternalTokenModel/index.js.map +1 -0
  20. package/dist/ExternalTokenModel/model.d.ts +67 -0
  21. package/dist/ExternalTokenModel/model.js +59 -0
  22. package/dist/ExternalTokenModel/model.js.map +1 -0
  23. package/dist/GoogleDriveOAuthModel/configSchema.d.ts +5 -0
  24. package/dist/GoogleDriveOAuthModel/configSchema.js +53 -0
  25. package/dist/GoogleDriveOAuthModel/configSchema.js.map +1 -0
  26. package/dist/GoogleDriveOAuthModel/index.d.ts +2 -0
  27. package/dist/GoogleDriveOAuthModel/index.js +11 -0
  28. package/dist/GoogleDriveOAuthModel/index.js.map +1 -0
  29. package/dist/GoogleDriveOAuthModel/model.d.ts +111 -0
  30. package/dist/GoogleDriveOAuthModel/model.js +115 -0
  31. package/dist/GoogleDriveOAuthModel/model.js.map +1 -0
  32. package/dist/HTTPBasicModel/HTTPBasicLoginForm.d.ts +5 -0
  33. package/dist/HTTPBasicModel/HTTPBasicLoginForm.js +55 -0
  34. package/dist/HTTPBasicModel/HTTPBasicLoginForm.js.map +1 -0
  35. package/dist/HTTPBasicModel/configSchema.d.ts +5 -0
  36. package/dist/HTTPBasicModel/configSchema.js +34 -0
  37. package/dist/HTTPBasicModel/configSchema.js.map +1 -0
  38. package/dist/HTTPBasicModel/index.d.ts +2 -0
  39. package/dist/HTTPBasicModel/index.js +11 -0
  40. package/dist/HTTPBasicModel/index.js.map +1 -0
  41. package/dist/HTTPBasicModel/model.d.ts +67 -0
  42. package/dist/HTTPBasicModel/model.js +59 -0
  43. package/dist/HTTPBasicModel/model.js.map +1 -0
  44. package/dist/OAuthModel/configSchema.d.ts +5 -0
  45. package/dist/OAuthModel/configSchema.js +90 -0
  46. package/dist/OAuthModel/configSchema.js.map +1 -0
  47. package/dist/OAuthModel/index.d.ts +2 -0
  48. package/dist/OAuthModel/index.js +11 -0
  49. package/dist/OAuthModel/index.js.map +1 -0
  50. package/dist/OAuthModel/model.d.ts +91 -0
  51. package/dist/OAuthModel/model.js +317 -0
  52. package/dist/OAuthModel/model.js.map +1 -0
  53. package/dist/index.d.ts +399 -0
  54. package/dist/index.js +80 -0
  55. package/dist/index.js.map +1 -0
  56. package/esm/DropboxOAuthModel/configSchema.d.ts +5 -0
  57. package/esm/DropboxOAuthModel/configSchema.js +64 -0
  58. package/esm/DropboxOAuthModel/configSchema.js.map +1 -0
  59. package/esm/DropboxOAuthModel/index.d.ts +2 -0
  60. package/esm/DropboxOAuthModel/index.js +3 -0
  61. package/esm/DropboxOAuthModel/index.js.map +1 -0
  62. package/esm/DropboxOAuthModel/model.d.ts +98 -0
  63. package/esm/DropboxOAuthModel/model.js +96 -0
  64. package/esm/DropboxOAuthModel/model.js.map +1 -0
  65. package/esm/ExternalTokenModel/ExternalTokenEntryForm.d.ts +5 -0
  66. package/esm/ExternalTokenModel/ExternalTokenEntryForm.js +29 -0
  67. package/esm/ExternalTokenModel/ExternalTokenEntryForm.js.map +1 -0
  68. package/esm/ExternalTokenModel/configSchema.d.ts +5 -0
  69. package/esm/ExternalTokenModel/configSchema.js +24 -0
  70. package/esm/ExternalTokenModel/configSchema.js.map +1 -0
  71. package/esm/ExternalTokenModel/index.d.ts +2 -0
  72. package/esm/ExternalTokenModel/index.js +3 -0
  73. package/esm/ExternalTokenModel/index.js.map +1 -0
  74. package/esm/ExternalTokenModel/model.d.ts +67 -0
  75. package/esm/ExternalTokenModel/model.js +57 -0
  76. package/esm/ExternalTokenModel/model.js.map +1 -0
  77. package/esm/GoogleDriveOAuthModel/configSchema.d.ts +5 -0
  78. package/esm/GoogleDriveOAuthModel/configSchema.js +48 -0
  79. package/esm/GoogleDriveOAuthModel/configSchema.js.map +1 -0
  80. package/esm/GoogleDriveOAuthModel/index.d.ts +2 -0
  81. package/esm/GoogleDriveOAuthModel/index.js +3 -0
  82. package/esm/GoogleDriveOAuthModel/index.js.map +1 -0
  83. package/esm/GoogleDriveOAuthModel/model.d.ts +111 -0
  84. package/esm/GoogleDriveOAuthModel/model.js +108 -0
  85. package/esm/GoogleDriveOAuthModel/model.js.map +1 -0
  86. package/esm/HTTPBasicModel/HTTPBasicLoginForm.d.ts +5 -0
  87. package/esm/HTTPBasicModel/HTTPBasicLoginForm.js +28 -0
  88. package/esm/HTTPBasicModel/HTTPBasicLoginForm.js.map +1 -0
  89. package/esm/HTTPBasicModel/configSchema.d.ts +5 -0
  90. package/esm/HTTPBasicModel/configSchema.js +32 -0
  91. package/esm/HTTPBasicModel/configSchema.js.map +1 -0
  92. package/esm/HTTPBasicModel/index.d.ts +2 -0
  93. package/esm/HTTPBasicModel/index.js +3 -0
  94. package/esm/HTTPBasicModel/index.js.map +1 -0
  95. package/esm/HTTPBasicModel/model.d.ts +67 -0
  96. package/esm/HTTPBasicModel/model.js +57 -0
  97. package/esm/HTTPBasicModel/model.js.map +1 -0
  98. package/esm/OAuthModel/configSchema.d.ts +5 -0
  99. package/esm/OAuthModel/configSchema.js +88 -0
  100. package/esm/OAuthModel/configSchema.js.map +1 -0
  101. package/esm/OAuthModel/index.d.ts +2 -0
  102. package/esm/OAuthModel/index.js +3 -0
  103. package/esm/OAuthModel/index.js.map +1 -0
  104. package/esm/OAuthModel/model.d.ts +91 -0
  105. package/esm/OAuthModel/model.js +289 -0
  106. package/esm/OAuthModel/model.js.map +1 -0
  107. package/esm/index.d.ts +399 -0
  108. package/esm/index.js +64 -0
  109. package/esm/index.js.map +1 -0
  110. package/package.json +63 -0
  111. package/src/DropboxOAuthModel/configSchema.ts +77 -0
  112. package/src/DropboxOAuthModel/index.ts +2 -0
  113. package/src/DropboxOAuthModel/model.tsx +141 -0
  114. package/src/ExternalTokenModel/ExternalTokenEntryForm.tsx +61 -0
  115. package/src/ExternalTokenModel/configSchema.ts +36 -0
  116. package/src/ExternalTokenModel/index.ts +2 -0
  117. package/src/ExternalTokenModel/model.tsx +70 -0
  118. package/src/GoogleDriveOAuthModel/configSchema.ts +61 -0
  119. package/src/GoogleDriveOAuthModel/index.ts +2 -0
  120. package/src/GoogleDriveOAuthModel/model.tsx +174 -0
  121. package/src/HTTPBasicModel/HTTPBasicLoginForm.tsx +71 -0
  122. package/src/HTTPBasicModel/configSchema.ts +43 -0
  123. package/src/HTTPBasicModel/index.ts +2 -0
  124. package/src/HTTPBasicModel/model.tsx +70 -0
  125. package/src/OAuthModel/configSchema.ts +98 -0
  126. package/src/OAuthModel/index.ts +2 -0
  127. package/src/OAuthModel/model.tsx +357 -0
  128. package/src/__snapshots__/index.test.js.snap +8 -0
  129. package/src/index.test.js +96 -0
  130. package/src/index.ts +97 -0
@@ -0,0 +1,289 @@
1
+ import { ConfigurationReference, getConf } from '@jbrowse/core/configuration';
2
+ import { InternetAccount } from '@jbrowse/core/pluggableElementTypes/models';
3
+ import { isElectron } from '@jbrowse/core/util';
4
+ import { types } from 'mobx-state-tree';
5
+ import jwtDecode from 'jwt-decode';
6
+ function fixup(buf) {
7
+ return buf.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
8
+ }
9
+ function getGlobalObject() {
10
+ // Based on window-or-global
11
+ // https://github.com/purposeindustries/window-or-global/blob/322abc71de0010c9e5d9d0729df40959e1ef8775/lib/index.js
12
+ return (
13
+ // eslint-disable-next-line no-restricted-globals
14
+ (typeof self === 'object' && self.self === self && self) ||
15
+ (typeof global === 'object' && global.global === global && global) ||
16
+ // @ts-ignore
17
+ this);
18
+ }
19
+ const stateModelFactory = (configSchema) => {
20
+ return InternetAccount.named('OAuthInternetAccount')
21
+ .props({
22
+ type: types.literal('OAuthInternetAccount'),
23
+ configuration: ConfigurationReference(configSchema),
24
+ })
25
+ .views(() => {
26
+ let codeVerifier = undefined;
27
+ return {
28
+ get codeVerifierPKCE() {
29
+ if (codeVerifier) {
30
+ return codeVerifier;
31
+ }
32
+ const global = getGlobalObject();
33
+ const array = new Uint8Array(32);
34
+ global.crypto.getRandomValues(array);
35
+ codeVerifier = fixup(Buffer.from(array).toString('base64'));
36
+ return codeVerifier;
37
+ },
38
+ };
39
+ })
40
+ .views(self => ({
41
+ get authEndpoint() {
42
+ return getConf(self, 'authEndpoint');
43
+ },
44
+ get tokenEndpoint() {
45
+ return getConf(self, 'tokenEndpoint');
46
+ },
47
+ get needsPKCE() {
48
+ return getConf(self, 'needsPKCE');
49
+ },
50
+ get clientId() {
51
+ return getConf(self, 'clientId');
52
+ },
53
+ get scopes() {
54
+ return getConf(self, 'scopes');
55
+ },
56
+ /**
57
+ * OAuth state parameter: https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1
58
+ * Can override or extend if dynamic state is needed.
59
+ */
60
+ state() {
61
+ return getConf(self, 'state') || undefined;
62
+ },
63
+ get responseType() {
64
+ return getConf(self, 'responseType');
65
+ },
66
+ get hasRefreshToken() {
67
+ return getConf(self, 'hasRefreshToken');
68
+ },
69
+ get refreshTokenKey() {
70
+ return `${self.internetAccountId}-refreshToken`;
71
+ },
72
+ }))
73
+ .actions(self => ({
74
+ storeRefreshToken(refreshToken) {
75
+ localStorage.setItem(self.refreshTokenKey, refreshToken);
76
+ },
77
+ removeRefreshToken() {
78
+ localStorage.removeItem(self.refreshTokenKey);
79
+ },
80
+ retrieveRefreshToken() {
81
+ return localStorage.getItem(self.refreshTokenKey);
82
+ },
83
+ async exchangeAuthorizationForAccessToken(token, redirectUri) {
84
+ const data = {
85
+ code: token,
86
+ grant_type: 'authorization_code',
87
+ client_id: self.clientId,
88
+ code_verifier: self.codeVerifierPKCE,
89
+ redirect_uri: redirectUri,
90
+ };
91
+ const params = new URLSearchParams(Object.entries(data));
92
+ const response = await fetch(self.tokenEndpoint, {
93
+ method: 'POST',
94
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
95
+ body: params.toString(),
96
+ });
97
+ if (!response.ok) {
98
+ let errorMessage;
99
+ try {
100
+ errorMessage = await response.text();
101
+ }
102
+ catch (error) {
103
+ errorMessage = '';
104
+ }
105
+ throw new Error(`Failed to obtain token from endpoint: ${response.status} (${response.statusText})${errorMessage ? ` (${errorMessage})` : ''}`);
106
+ }
107
+ const accessToken = await response.json();
108
+ if (accessToken.refresh_token) {
109
+ this.storeRefreshToken(accessToken.refresh_token);
110
+ }
111
+ return accessToken.access_token;
112
+ },
113
+ async exchangeRefreshForAccessToken(refreshToken) {
114
+ var _a;
115
+ const data = {
116
+ grant_type: 'refresh_token',
117
+ refresh_token: refreshToken,
118
+ client_id: self.clientId,
119
+ };
120
+ const params = new URLSearchParams(Object.entries(data));
121
+ const response = await fetch(self.tokenEndpoint, {
122
+ method: 'POST',
123
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
124
+ body: params.toString(),
125
+ });
126
+ if (!response.ok) {
127
+ self.removeToken();
128
+ let text = await response.text();
129
+ try {
130
+ const obj = JSON.parse(text);
131
+ if (obj.error === 'invalid_grant') {
132
+ this.removeRefreshToken();
133
+ }
134
+ text = (_a = obj === null || obj === void 0 ? void 0 : obj.error_description) !== null && _a !== void 0 ? _a : text;
135
+ }
136
+ catch (e) {
137
+ /* just use original text as error */
138
+ }
139
+ throw new Error(`Network response failure — ${response.status} (${response.statusText}) ${text ? ` (${text})` : ''}`);
140
+ }
141
+ const accessToken = await response.json();
142
+ if (accessToken.refresh_token) {
143
+ this.storeRefreshToken(accessToken.refresh_token);
144
+ }
145
+ return accessToken.access_token;
146
+ },
147
+ }))
148
+ .actions(self => {
149
+ let listener;
150
+ let refreshTokenPromise = undefined;
151
+ return {
152
+ // used to listen to child window for auth code/token
153
+ addMessageChannel(resolve, reject) {
154
+ listener = event => {
155
+ this.finishOAuthWindow(event, resolve, reject);
156
+ };
157
+ window.addEventListener('message', listener);
158
+ },
159
+ deleteMessageChannel() {
160
+ window.removeEventListener('message', listener);
161
+ },
162
+ async finishOAuthWindow(event, resolve, reject) {
163
+ if (event.data.name !== `JBrowseAuthWindow-${self.internetAccountId}`) {
164
+ return this.deleteMessageChannel();
165
+ }
166
+ const redirectUriWithInfo = event.data.redirectUri;
167
+ const fixedQueryString = redirectUriWithInfo.replace('#', '?');
168
+ const redirectUrl = new URL(fixedQueryString);
169
+ const queryStringSearch = redirectUrl.search;
170
+ const urlParams = new URLSearchParams(queryStringSearch);
171
+ if (urlParams.has('access_token')) {
172
+ const token = urlParams.get('access_token');
173
+ if (!token) {
174
+ return reject(new Error('Error with token endpoint'));
175
+ }
176
+ self.storeToken(token);
177
+ return resolve(token);
178
+ }
179
+ if (urlParams.has('code')) {
180
+ const code = urlParams.get('code');
181
+ if (!code) {
182
+ return reject(new Error('Error with authorization endpoint'));
183
+ }
184
+ try {
185
+ const token = await self.exchangeAuthorizationForAccessToken(code, redirectUrl.origin + redirectUrl.pathname);
186
+ self.storeToken(token);
187
+ return resolve(token);
188
+ }
189
+ catch (error) {
190
+ if (error instanceof Error) {
191
+ return reject(error);
192
+ }
193
+ else {
194
+ return reject(new Error(String(error)));
195
+ }
196
+ }
197
+ }
198
+ if (redirectUriWithInfo.includes('access_denied')) {
199
+ return reject(new Error('OAuth flow was cancelled'));
200
+ }
201
+ if (redirectUriWithInfo.includes('error')) {
202
+ return reject(new Error('Oauth flow error: ' + queryStringSearch));
203
+ }
204
+ this.deleteMessageChannel();
205
+ },
206
+ // opens external OAuth flow, popup for web and new browser window for desktop
207
+ async useEndpointForAuthorization(resolve, reject) {
208
+ const redirectUri = isElectron
209
+ ? 'http://localhost/auth'
210
+ : window.location.origin + window.location.pathname;
211
+ const data = {
212
+ client_id: self.clientId,
213
+ redirect_uri: redirectUri,
214
+ response_type: self.responseType || 'code',
215
+ };
216
+ if (self.state()) {
217
+ data.state = self.state();
218
+ }
219
+ if (self.scopes) {
220
+ data.scope = self.scopes;
221
+ }
222
+ if (self.needsPKCE) {
223
+ const { codeVerifierPKCE } = self;
224
+ const sha256 = await import('crypto-js/sha256').then(f => f.default);
225
+ const Base64 = await import('crypto-js/enc-base64');
226
+ const codeChallenge = fixup(Base64.stringify(sha256(codeVerifierPKCE)));
227
+ data.code_challenge = codeChallenge;
228
+ data.code_challenge_method = 'S256';
229
+ }
230
+ if (self.hasRefreshToken) {
231
+ data.token_access_type = 'offline';
232
+ }
233
+ const params = new URLSearchParams(Object.entries(data));
234
+ const url = new URL(self.authEndpoint);
235
+ url.search = params.toString();
236
+ const eventName = `JBrowseAuthWindow-${self.internetAccountId}`;
237
+ if (isElectron) {
238
+ const { ipcRenderer } = window.require('electron');
239
+ const redirectUri = await ipcRenderer.invoke('openAuthWindow', {
240
+ internetAccountId: self.internetAccountId,
241
+ data,
242
+ url: url.toString(),
243
+ });
244
+ const eventFromDesktop = new MessageEvent('message', {
245
+ data: { name: eventName, redirectUri: redirectUri },
246
+ });
247
+ this.finishOAuthWindow(eventFromDesktop, resolve, reject);
248
+ }
249
+ else {
250
+ const options = `width=500,height=600,left=0,top=0`;
251
+ window.open(url, eventName, options);
252
+ }
253
+ },
254
+ async getTokenFromUser(resolve, reject) {
255
+ const refreshToken = self.hasRefreshToken && self.retrieveRefreshToken();
256
+ if (refreshToken) {
257
+ resolve(await self.exchangeRefreshForAccessToken(refreshToken));
258
+ }
259
+ this.addMessageChannel(resolve, reject);
260
+ this.useEndpointForAuthorization(resolve, reject);
261
+ },
262
+ async validateToken(token, location) {
263
+ const decoded = jwtDecode(token);
264
+ if (decoded.exp && decoded.exp < new Date().getTime() / 1000) {
265
+ const refreshToken = self.hasRefreshToken && self.retrieveRefreshToken();
266
+ if (refreshToken) {
267
+ try {
268
+ if (!refreshTokenPromise) {
269
+ refreshTokenPromise =
270
+ self.exchangeRefreshForAccessToken(refreshToken);
271
+ }
272
+ const newToken = await refreshTokenPromise;
273
+ return this.validateToken(newToken, location);
274
+ }
275
+ catch (err) {
276
+ throw new Error(`Token could not be refreshed. ${err}`);
277
+ }
278
+ }
279
+ }
280
+ else {
281
+ refreshTokenPromise = undefined;
282
+ }
283
+ return token;
284
+ },
285
+ };
286
+ });
287
+ };
288
+ export default stateModelFactory;
289
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/OAuthModel/model.tsx"],"names":[],"mappings":"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"}