supaapps-auth 1.0.2 → 1.0.4
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/dist/AuthManager.js +13 -6
- package/package.json +1 -1
- package/src/AuthManager.ts +13 -6
package/dist/AuthManager.js
CHANGED
|
@@ -26,13 +26,13 @@ class AuthManager {
|
|
|
26
26
|
const NUM_OF_BYTES = 32; // This will generate a verifier of sufficient length
|
|
27
27
|
const HASH_ALG = 'sha256';
|
|
28
28
|
// Generate code verifier
|
|
29
|
-
const
|
|
29
|
+
const newCodeVerifier = this.toBase64Url((0, crypto_1.randomBytes)(NUM_OF_BYTES).toString('base64'));
|
|
30
30
|
// Generate code challenge
|
|
31
31
|
const hash = (0, crypto_1.createHash)(HASH_ALG)
|
|
32
|
-
.update(
|
|
32
|
+
.update(newCodeVerifier)
|
|
33
33
|
.digest('base64');
|
|
34
|
-
const
|
|
35
|
-
return {
|
|
34
|
+
const newCodeChallenge = this.toBase64Url(hash);
|
|
35
|
+
return { newCodeVerifier, newCodeChallenge };
|
|
36
36
|
};
|
|
37
37
|
this.authServer = authServer;
|
|
38
38
|
this.realmName = realmName;
|
|
@@ -46,12 +46,15 @@ class AuthManager {
|
|
|
46
46
|
return AuthManager.instance;
|
|
47
47
|
}
|
|
48
48
|
getLoginWithGoogleUri() {
|
|
49
|
-
|
|
49
|
+
// get or create codeVerifier and codeChallenge from localstorage
|
|
50
|
+
const { newCodeVerifier, newCodeChallenge } = this.generatePKCEPair();
|
|
51
|
+
let codeVerifier = localStorage.getItem('codeVerifier') || newCodeVerifier;
|
|
52
|
+
let codeChallenge = localStorage.getItem('codeChallenge') || newCodeChallenge;
|
|
50
53
|
localStorage.setItem('codeVerifier', codeVerifier);
|
|
51
54
|
localStorage.setItem('codeChallenge', codeChallenge);
|
|
52
55
|
if (this.authServer && this.realmName && this.redirectUri) {
|
|
53
56
|
return `${this.authServer}auth/login_with_google?realm_name=${this.realmName}` +
|
|
54
|
-
`&redirect_uri=${encodeURIComponent(this.
|
|
57
|
+
`&redirect_uri=${encodeURIComponent(this.redirectUri)}&code_challenge=${codeChallenge}&code_challenge_method=S256`;
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
isLoggedIn() {
|
|
@@ -128,6 +131,8 @@ class AuthManager {
|
|
|
128
131
|
}),
|
|
129
132
|
})
|
|
130
133
|
.then((response) => {
|
|
134
|
+
localStorage.removeItem('codeVerifier');
|
|
135
|
+
localStorage.removeItem('codeChallenge');
|
|
131
136
|
if (response.status !== 200) {
|
|
132
137
|
throw new Error('Failed to exchange code for token');
|
|
133
138
|
}
|
|
@@ -139,6 +144,8 @@ class AuthManager {
|
|
|
139
144
|
resolve();
|
|
140
145
|
})
|
|
141
146
|
.catch((error) => {
|
|
147
|
+
localStorage.removeItem('codeVerifier');
|
|
148
|
+
localStorage.removeItem('codeChallenge');
|
|
142
149
|
reject(error);
|
|
143
150
|
});
|
|
144
151
|
}
|
package/package.json
CHANGED
package/src/AuthManager.ts
CHANGED
|
@@ -34,26 +34,29 @@ export class AuthManager {
|
|
|
34
34
|
const HASH_ALG = 'sha256';
|
|
35
35
|
|
|
36
36
|
// Generate code verifier
|
|
37
|
-
const
|
|
37
|
+
const newCodeVerifier = this.toBase64Url(
|
|
38
38
|
randomBytes(NUM_OF_BYTES).toString('base64'),
|
|
39
39
|
);
|
|
40
40
|
|
|
41
41
|
// Generate code challenge
|
|
42
42
|
const hash = createHash(HASH_ALG)
|
|
43
|
-
.update(
|
|
43
|
+
.update(newCodeVerifier)
|
|
44
44
|
.digest('base64');
|
|
45
|
-
const
|
|
45
|
+
const newCodeChallenge = this.toBase64Url(hash);
|
|
46
46
|
|
|
47
|
-
return {
|
|
47
|
+
return { newCodeVerifier, newCodeChallenge };
|
|
48
48
|
};
|
|
49
49
|
public getLoginWithGoogleUri(): string {
|
|
50
|
-
|
|
50
|
+
// get or create codeVerifier and codeChallenge from localstorage
|
|
51
|
+
const { newCodeVerifier, newCodeChallenge } = this.generatePKCEPair();
|
|
52
|
+
let codeVerifier = localStorage.getItem('codeVerifier') || newCodeVerifier;
|
|
53
|
+
let codeChallenge = localStorage.getItem('codeChallenge') || newCodeChallenge;
|
|
51
54
|
localStorage.setItem('codeVerifier', codeVerifier);
|
|
52
55
|
localStorage.setItem('codeChallenge', codeChallenge);
|
|
53
56
|
|
|
54
57
|
if (this.authServer && this.realmName && this.redirectUri) {
|
|
55
58
|
return `${this.authServer}auth/login_with_google?realm_name=${this.realmName}` +
|
|
56
|
-
`&redirect_uri=${encodeURIComponent(this.
|
|
59
|
+
`&redirect_uri=${encodeURIComponent(this.redirectUri)}&code_challenge=${codeChallenge}&code_challenge_method=S256`
|
|
57
60
|
}
|
|
58
61
|
}
|
|
59
62
|
public async isLoggedIn(): Promise<boolean> {
|
|
@@ -127,6 +130,8 @@ export class AuthManager {
|
|
|
127
130
|
}),
|
|
128
131
|
})
|
|
129
132
|
.then((response) => {
|
|
133
|
+
localStorage.removeItem('codeVerifier');
|
|
134
|
+
localStorage.removeItem('codeChallenge');
|
|
130
135
|
if (response.status !== 200) {
|
|
131
136
|
throw new Error('Failed to exchange code for token');
|
|
132
137
|
}
|
|
@@ -138,6 +143,8 @@ export class AuthManager {
|
|
|
138
143
|
resolve();
|
|
139
144
|
})
|
|
140
145
|
.catch((error) => {
|
|
146
|
+
localStorage.removeItem('codeVerifier');
|
|
147
|
+
localStorage.removeItem('codeChallenge');
|
|
141
148
|
reject(error);
|
|
142
149
|
});
|
|
143
150
|
}
|