piral-oauth2 1.6.0-beta.7240 → 1.6.0-beta.7244
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/lib/client-oauth2.js +2 -7
- package/lib/client-oauth2.js.map +1 -1
- package/lib/create.js +1 -5
- package/lib/create.js.map +1 -1
- package/lib/index.js +4 -7
- package/lib/index.js.map +1 -1
- package/lib/setup.js +5 -9
- package/lib/setup.js.map +1 -1
- package/lib/types.js +1 -2
- package/lib/utils.js +3 -9
- package/lib/utils.js.map +1 -1
- package/package.json +9 -20
- package/esm/client-oauth2.d.ts +0 -140
- package/esm/client-oauth2.js +0 -528
- package/esm/client-oauth2.js.map +0 -1
- package/esm/create.d.ts +0 -6
- package/esm/create.js +0 -14
- package/esm/create.js.map +0 -1
- package/esm/index.d.ts +0 -4
- package/esm/index.js +0 -5
- package/esm/index.js.map +0 -1
- package/esm/setup.d.ts +0 -6
- package/esm/setup.js +0 -103
- package/esm/setup.js.map +0 -1
- package/esm/types.d.ts +0 -126
- package/esm/types.js +0 -2
- package/esm/types.js.map +0 -1
- package/esm/utils.d.ts +0 -13
- package/esm/utils.js +0 -56
- package/esm/utils.js.map +0 -1
package/esm/setup.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { ClientOAuth2 } from './client-oauth2';
|
|
2
|
-
import { createOAuth2MemoryPersistence } from './utils';
|
|
3
|
-
const callbackName = 'oauth2Cb';
|
|
4
|
-
/**
|
|
5
|
-
* Sets up a new client wrapping the OAuth 2.0 API.
|
|
6
|
-
* @param config The configuration for the client.
|
|
7
|
-
*/
|
|
8
|
-
export function setupOAuth2Client(config) {
|
|
9
|
-
const { clientId, clientSecret, authorizationUri, accessTokenUri, redirectUri = `${location.origin}/auth`, scopes = [], flow, headers, query, state, restrict = false, returnPath = '/', persist = createOAuth2MemoryPersistence(), } = config;
|
|
10
|
-
const client = new ClientOAuth2({
|
|
11
|
-
clientId,
|
|
12
|
-
clientSecret,
|
|
13
|
-
redirectUri,
|
|
14
|
-
authorizationUri,
|
|
15
|
-
accessTokenUri,
|
|
16
|
-
scopes,
|
|
17
|
-
headers,
|
|
18
|
-
query,
|
|
19
|
-
state,
|
|
20
|
-
});
|
|
21
|
-
let currentToken;
|
|
22
|
-
let retrieveToken;
|
|
23
|
-
let getLoginUri;
|
|
24
|
-
const setCurrentToken = (token) => {
|
|
25
|
-
persist.save({
|
|
26
|
-
accessToken: token.accessToken,
|
|
27
|
-
data: token.data,
|
|
28
|
-
refreshToken: token.refreshToken,
|
|
29
|
-
});
|
|
30
|
-
currentToken = token;
|
|
31
|
-
};
|
|
32
|
-
const retrieve = (init, refresh) => {
|
|
33
|
-
return init.then(() => {
|
|
34
|
-
if (!currentToken) {
|
|
35
|
-
return Promise.reject('Not logged in. Please call `login()` to retrieve a token.');
|
|
36
|
-
}
|
|
37
|
-
if (!currentToken.expired()) {
|
|
38
|
-
return currentToken.accessToken;
|
|
39
|
-
}
|
|
40
|
-
return refresh().then((refreshedToken) => {
|
|
41
|
-
setCurrentToken(refreshedToken);
|
|
42
|
-
return currentToken.accessToken;
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
};
|
|
46
|
-
const initialize = (load) => {
|
|
47
|
-
const info = persist.load();
|
|
48
|
-
if (info) {
|
|
49
|
-
currentToken = client.createToken(info.accessToken, info.refreshToken, undefined, info.data);
|
|
50
|
-
return Promise.resolve();
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
return load().then((token) => {
|
|
54
|
-
const opener = window.opener;
|
|
55
|
-
setCurrentToken(token);
|
|
56
|
-
if (opener && typeof opener[callbackName] === 'function') {
|
|
57
|
-
opener[callbackName](token);
|
|
58
|
-
window.close();
|
|
59
|
-
}
|
|
60
|
-
}, () => { });
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
if (flow === 'code') {
|
|
64
|
-
const init = initialize(() => {
|
|
65
|
-
const url = location.href;
|
|
66
|
-
history.replaceState(undefined, undefined, returnPath);
|
|
67
|
-
return client.code.getToken(url);
|
|
68
|
-
});
|
|
69
|
-
retrieveToken = () => {
|
|
70
|
-
return retrieve(init, () => currentToken.refresh());
|
|
71
|
-
};
|
|
72
|
-
getLoginUri = () => client.code.getUri();
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
const init = initialize(() => client.token.getToken(location.href));
|
|
76
|
-
retrieveToken = () => {
|
|
77
|
-
return retrieve(init, () => new Promise((resolve) => {
|
|
78
|
-
window[callbackName] = resolve;
|
|
79
|
-
window.open(client.token.getUri());
|
|
80
|
-
}));
|
|
81
|
-
};
|
|
82
|
-
getLoginUri = () => client.token.getUri();
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
_: client,
|
|
86
|
-
login() {
|
|
87
|
-
window.location.href = getLoginUri();
|
|
88
|
-
},
|
|
89
|
-
logout() {
|
|
90
|
-
currentToken = undefined;
|
|
91
|
-
},
|
|
92
|
-
extendHeaders(req) {
|
|
93
|
-
if (!restrict) {
|
|
94
|
-
req.setHeaders(retrieveToken().then((token) => token && { Authorization: `Bearer ${token}` }, () => undefined));
|
|
95
|
-
}
|
|
96
|
-
},
|
|
97
|
-
account() {
|
|
98
|
-
return !!currentToken;
|
|
99
|
-
},
|
|
100
|
-
token: retrieveToken,
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=setup.js.map
|
package/esm/setup.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
|
package/esm/types.d.ts
DELETED
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
declare module 'piral-core/lib/types/custom' {
|
|
2
|
-
interface PiletCustomApi extends PiralOAuth2Api {
|
|
3
|
-
}
|
|
4
|
-
}
|
|
5
|
-
export interface PiralOAuth2Api {
|
|
6
|
-
/**
|
|
7
|
-
* Gets the currently valid access token, if any.
|
|
8
|
-
*/
|
|
9
|
-
getAccessToken(): Promise<string | undefined>;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* The relevant OAuth 2 token information.
|
|
13
|
-
*/
|
|
14
|
-
export interface OAuth2TokenInfo {
|
|
15
|
-
accessToken: string;
|
|
16
|
-
refreshToken: string;
|
|
17
|
-
data: Record<string, string>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Available configuration options for the OAuth 2 plugin.
|
|
21
|
-
*/
|
|
22
|
-
export interface OAuth2Config {
|
|
23
|
-
/**
|
|
24
|
-
* The id of the client. Required for the setup of OAuth 2.
|
|
25
|
-
*/
|
|
26
|
-
clientId: string;
|
|
27
|
-
/**
|
|
28
|
-
* The client secret. Only required for the `code` flow.
|
|
29
|
-
*/
|
|
30
|
-
clientSecret?: string;
|
|
31
|
-
/**
|
|
32
|
-
* The Uri pointing to the authorization endpoint of the Identity Provider.
|
|
33
|
-
*/
|
|
34
|
-
authorizationUri: string;
|
|
35
|
-
/**
|
|
36
|
-
* The Uri pointing to the access token endpoint of the Identity Provider.
|
|
37
|
-
*/
|
|
38
|
-
accessTokenUri?: string;
|
|
39
|
-
/**
|
|
40
|
-
* The redirect Uri to use. By default the origin with /auth
|
|
41
|
-
* is used.
|
|
42
|
-
*/
|
|
43
|
-
redirectUri?: string;
|
|
44
|
-
/**
|
|
45
|
-
* The return path to use in case of the "code" flow. By default the
|
|
46
|
-
* path will be set to "/".
|
|
47
|
-
*/
|
|
48
|
-
returnPath?: string;
|
|
49
|
-
/**
|
|
50
|
-
* The scopes to be used.
|
|
51
|
-
*/
|
|
52
|
-
scopes?: Array<string>;
|
|
53
|
-
/**
|
|
54
|
-
* The OAuth 2 authorization flow type to be used.
|
|
55
|
-
*/
|
|
56
|
-
flow?: 'implicit' | 'code';
|
|
57
|
-
/**
|
|
58
|
-
* Restricts token sharing such that other integrations, e.g., with
|
|
59
|
-
* fetch would need to be done manually.
|
|
60
|
-
* Otherwise, the client is responsive to the `before-fetch` event.
|
|
61
|
-
*/
|
|
62
|
-
restrict?: boolean;
|
|
63
|
-
/**
|
|
64
|
-
* Optional persistence layer for OAuth 2. By default nothing is stored.
|
|
65
|
-
*/
|
|
66
|
-
persist?: OAuth2Persistence;
|
|
67
|
-
/**
|
|
68
|
-
* The optional headers to supply in OAuth 2 requests.
|
|
69
|
-
*/
|
|
70
|
-
headers?: Record<string, string | Array<string>>;
|
|
71
|
-
/**
|
|
72
|
-
* The optional query parameters to supply in OAuth 2 requests.
|
|
73
|
-
*/
|
|
74
|
-
query?: Record<string, string | Array<string>>;
|
|
75
|
-
/**
|
|
76
|
-
* The optional state parameter to supply in OAuth 2 requests.
|
|
77
|
-
*/
|
|
78
|
-
state?: string;
|
|
79
|
-
}
|
|
80
|
-
export interface OAuth2Request {
|
|
81
|
-
/**
|
|
82
|
-
* Sets the headers of the request.
|
|
83
|
-
* @param headers Headers or a promise to headers.
|
|
84
|
-
*/
|
|
85
|
-
setHeaders(headers: any): void;
|
|
86
|
-
}
|
|
87
|
-
export interface OAuth2Client {
|
|
88
|
-
/**
|
|
89
|
-
* The underlying OAuth2 client.
|
|
90
|
-
*/
|
|
91
|
-
_: any;
|
|
92
|
-
/**
|
|
93
|
-
* Performs a login.
|
|
94
|
-
*/
|
|
95
|
-
login(): void;
|
|
96
|
-
/**
|
|
97
|
-
* Performs a logout.
|
|
98
|
-
*/
|
|
99
|
-
logout(): void;
|
|
100
|
-
/**
|
|
101
|
-
* Gets a token.
|
|
102
|
-
*/
|
|
103
|
-
token(): Promise<string>;
|
|
104
|
-
/**
|
|
105
|
-
* Checks if the user is currently logged in.
|
|
106
|
-
*/
|
|
107
|
-
account(): boolean;
|
|
108
|
-
/**
|
|
109
|
-
* Extends the headers of the provided request.
|
|
110
|
-
*/
|
|
111
|
-
extendHeaders(req: OAuth2Request): void;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Defines the interface for the OAuth 2 persistence layer.
|
|
115
|
-
*/
|
|
116
|
-
export interface OAuth2Persistence {
|
|
117
|
-
/**
|
|
118
|
-
* Loads an OAuth 2 token structure.
|
|
119
|
-
*/
|
|
120
|
-
load(): OAuth2TokenInfo;
|
|
121
|
-
/**
|
|
122
|
-
* Stores an OAuth 2 token structure.
|
|
123
|
-
* @param info The token infos to store.
|
|
124
|
-
*/
|
|
125
|
-
save(info: OAuth2TokenInfo): void;
|
|
126
|
-
}
|
package/esm/types.js
DELETED
package/esm/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/esm/utils.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { OAuth2Persistence } from './types';
|
|
2
|
-
/**
|
|
3
|
-
* Creates an OAuth 2 persistence layer using memory.
|
|
4
|
-
*/
|
|
5
|
-
export declare function createOAuth2MemoryPersistence(): OAuth2Persistence;
|
|
6
|
-
/**
|
|
7
|
-
* Creates an OAuth 2 persistence layer using sessionStorage.
|
|
8
|
-
*/
|
|
9
|
-
export declare function createOAuth2SessionPersistence(sessionKey?: string): OAuth2Persistence;
|
|
10
|
-
/**
|
|
11
|
-
* Creates an OAuth 2 persistence layer using localStorage.
|
|
12
|
-
*/
|
|
13
|
-
export declare function createOAuth2BrowserPersistence(localKey?: string): OAuth2Persistence;
|
package/esm/utils.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Creates an OAuth 2 persistence layer using memory.
|
|
3
|
-
*/
|
|
4
|
-
export function createOAuth2MemoryPersistence() {
|
|
5
|
-
return {
|
|
6
|
-
load() {
|
|
7
|
-
return undefined;
|
|
8
|
-
},
|
|
9
|
-
save() { },
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Creates an OAuth 2 persistence layer using sessionStorage.
|
|
14
|
-
*/
|
|
15
|
-
export function createOAuth2SessionPersistence(sessionKey = '$piral_oauth2_info') {
|
|
16
|
-
return {
|
|
17
|
-
load() {
|
|
18
|
-
const content = sessionStorage.getItem(sessionKey);
|
|
19
|
-
if (typeof content === 'string') {
|
|
20
|
-
try {
|
|
21
|
-
return JSON.parse(content);
|
|
22
|
-
}
|
|
23
|
-
catch {
|
|
24
|
-
console.error('Found invalid data in the OAuth 2 session storage key. Skipped.');
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
return undefined;
|
|
28
|
-
},
|
|
29
|
-
save(info) {
|
|
30
|
-
sessionStorage.setItem(sessionKey, JSON.stringify(info));
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Creates an OAuth 2 persistence layer using localStorage.
|
|
36
|
-
*/
|
|
37
|
-
export function createOAuth2BrowserPersistence(localKey = '$piral_oauth2_info') {
|
|
38
|
-
return {
|
|
39
|
-
load() {
|
|
40
|
-
const content = localStorage.getItem(localKey);
|
|
41
|
-
if (typeof content === 'string') {
|
|
42
|
-
try {
|
|
43
|
-
return JSON.parse(content);
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
|
-
console.error('Found invalid data in the OAuth 2 local storage key. Skipped.');
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return undefined;
|
|
50
|
-
},
|
|
51
|
-
save(info) {
|
|
52
|
-
localStorage.setItem(localKey, JSON.stringify(info));
|
|
53
|
-
},
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
//# sourceMappingURL=utils.js.map
|
package/esm/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,6BAA6B;IAC3C,OAAO;QACL,IAAI;YACF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,KAAI,CAAC;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,UAAU,GAAG,oBAAoB;IAC9E,OAAO;QACL,IAAI;YACF,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAEnD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;gBAC/B,IAAI;oBACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;iBAC5B;gBAAC,MAAM;oBACN,OAAO,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC;iBAClF;aACF;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAI;YACP,cAAc,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3D,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,8BAA8B,CAAC,QAAQ,GAAG,oBAAoB;IAC5E,OAAO;QACL,IAAI;YACF,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAE/C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;gBAC/B,IAAI;oBACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;iBAC5B;gBAAC,MAAM;oBACN,OAAO,CAAC,KAAK,CAAC,+DAA+D,CAAC,CAAC;iBAChF;aACF;YAED,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAI;YACP,YAAY,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;KACF,CAAC;AACJ,CAAC"}
|