@growth-labs/auth 0.2.0 → 0.2.2
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/client/login-page.d.ts +1 -1
- package/dist/client/login-page.d.ts.map +1 -1
- package/dist/client/login-page.js +1 -5
- package/dist/client/login-page.js.map +1 -1
- package/dist/routes/login.d.ts.map +1 -1
- package/dist/routes/login.js +52 -20
- package/dist/routes/login.js.map +1 -1
- package/package.json +5 -3
|
@@ -13,5 +13,5 @@
|
|
|
13
13
|
* from JS. Provider attribution is non-sensitive (just an analytics
|
|
14
14
|
* label) so this is an acceptable tradeoff.
|
|
15
15
|
*/
|
|
16
|
-
export declare function loginPageScript(
|
|
16
|
+
export declare function loginPageScript(_cookiePrefix: string): string;
|
|
17
17
|
//# sourceMappingURL=login-page.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-page.d.ts","sourceRoot":"","sources":["../../src/client/login-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"login-page.d.ts","sourceRoot":"","sources":["../../src/client/login-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAW7D"}
|
|
@@ -13,15 +13,11 @@
|
|
|
13
13
|
* from JS. Provider attribution is non-sensitive (just an analytics
|
|
14
14
|
* label) so this is an acceptable tradeoff.
|
|
15
15
|
*/
|
|
16
|
-
export function loginPageScript(
|
|
17
|
-
// JSON.stringify safely escapes the prefix into a JS string literal.
|
|
18
|
-
const prefixLiteral = JSON.stringify(cookiePrefix);
|
|
16
|
+
export function loginPageScript(_cookiePrefix) {
|
|
19
17
|
return `
|
|
20
18
|
document.querySelectorAll('[data-provider]').forEach(function(el) {
|
|
21
19
|
el.addEventListener('click', function() {
|
|
22
20
|
var provider = el.getAttribute('data-provider');
|
|
23
|
-
var prefix = ${prefixLiteral};
|
|
24
|
-
document.cookie = prefix + '_provider=' + encodeURIComponent(provider) + '; max-age=600; path=/; samesite=lax; secure';
|
|
25
21
|
if (window.glAnalytics) {
|
|
26
22
|
window.glAnalytics.track('login_clicked', { provider: provider });
|
|
27
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login-page.js","sourceRoot":"","sources":["../../src/client/login-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"login-page.js","sourceRoot":"","sources":["../../src/client/login-page.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,eAAe,CAAC,aAAqB;IACpD,OAAO;;;;;;;;;GASL,CAAA;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":"AAKA,UAAU,YAAY;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACR;AAED,wBAAsB,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":"AAKA,UAAU,YAAY;IACrB,OAAO,EAAE,OAAO,CAAA;IAChB,GAAG,EAAE,GAAG,CAAA;CACR;AAED,wBAAsB,GAAG,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuDlE"}
|
package/dist/routes/login.js
CHANGED
|
@@ -1,37 +1,69 @@
|
|
|
1
1
|
import { loginPageScript } from '../client/login-page.js';
|
|
2
2
|
import { getConfig } from '../config-store.js';
|
|
3
|
-
import { setAuthFlowCookies } from '../utils/cookies.js';
|
|
3
|
+
import { setAuthFlowCookies, setProviderCookie } from '../utils/cookies.js';
|
|
4
4
|
import { createAuthFlow, getAuthorizationUrl } from '../utils/openauth.js';
|
|
5
5
|
export async function GET(context) {
|
|
6
6
|
const options = getConfig();
|
|
7
7
|
const redirectPath = context.url.searchParams.get('redirect') || '/';
|
|
8
|
+
const provider = context.url.searchParams.get('provider');
|
|
8
9
|
const error = context.url.searchParams.get('error');
|
|
9
10
|
const reset = context.url.searchParams.get('reset');
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
11
|
+
if (provider) {
|
|
12
|
+
const normalizedProvider = normalizeProvider(provider);
|
|
13
|
+
if (!normalizedProvider || !options.providers.includes(normalizedProvider)) {
|
|
14
|
+
return new Response('Unknown auth provider', { status: 400 });
|
|
15
|
+
}
|
|
16
|
+
const authFlow = await createAuthFlow(context);
|
|
17
|
+
const authorization = await getAuthorizationUrl(context, openauthProviderFor(normalizedProvider), redirectPath, authFlow);
|
|
18
|
+
const response = new Response(null, {
|
|
19
|
+
status: 302,
|
|
20
|
+
headers: {
|
|
21
|
+
Location: authorization.url,
|
|
22
|
+
'Cache-Control': 'no-store',
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
setAuthFlowCookies(response, options, authFlow.verifier, authFlow.state, redirectPath);
|
|
26
|
+
setProviderCookie(response, options, normalizedProvider);
|
|
27
|
+
return response;
|
|
28
|
+
}
|
|
20
29
|
const html = renderLoginPage(options, {
|
|
21
|
-
google
|
|
22
|
-
|
|
23
|
-
|
|
30
|
+
google: options.providers.includes('google')
|
|
31
|
+
? buildStartUrl(options.loginPath, 'google', redirectPath)
|
|
32
|
+
: null,
|
|
33
|
+
password: options.providers.includes('password')
|
|
34
|
+
? buildStartUrl(options.loginPath, 'password', redirectPath)
|
|
35
|
+
: null,
|
|
36
|
+
emailCode: options.providers.includes('email-code')
|
|
37
|
+
? buildStartUrl(options.loginPath, 'email-code', redirectPath)
|
|
38
|
+
: null,
|
|
24
39
|
redirectPath,
|
|
25
40
|
error,
|
|
26
41
|
reset,
|
|
27
|
-
authFlow,
|
|
28
42
|
});
|
|
29
43
|
const response = new Response(html, {
|
|
30
|
-
headers: {
|
|
44
|
+
headers: {
|
|
45
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
46
|
+
'Cache-Control': 'no-store',
|
|
47
|
+
},
|
|
31
48
|
});
|
|
32
|
-
setAuthFlowCookies(response, options, authFlow.verifier, authFlow.state, redirectPath);
|
|
33
49
|
return response;
|
|
34
50
|
}
|
|
51
|
+
function normalizeProvider(provider) {
|
|
52
|
+
if (provider === 'google' || provider === 'password' || provider === 'email-code') {
|
|
53
|
+
return provider;
|
|
54
|
+
}
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
function openauthProviderFor(provider) {
|
|
58
|
+
return provider === 'email-code' ? 'code' : provider;
|
|
59
|
+
}
|
|
60
|
+
function buildStartUrl(loginPath, provider, redirectPath) {
|
|
61
|
+
const params = new URLSearchParams({
|
|
62
|
+
provider,
|
|
63
|
+
redirect: redirectPath,
|
|
64
|
+
});
|
|
65
|
+
return `${loginPath}?${params.toString()}`;
|
|
66
|
+
}
|
|
35
67
|
function renderLoginPage(options, data) {
|
|
36
68
|
const { loginPage, providers } = options;
|
|
37
69
|
const cookiePrefix = options.cookiePrefix;
|
|
@@ -60,10 +92,10 @@ function renderLoginPage(options, data) {
|
|
|
60
92
|
<h1>${loginPage.title}</h1>
|
|
61
93
|
${data.reset ? '<p class="success">Password reset successfully. Sign in with your new password.</p>' : ''}
|
|
62
94
|
${data.error ? '<p class="error">Authentication failed. Please try again.</p>' : ''}
|
|
63
|
-
${data.google ? `<a href="${data.google
|
|
95
|
+
${data.google ? `<a href="${data.google}" class="btn btn-google" data-provider="google">Sign in with Google</a>` : ''}
|
|
64
96
|
${data.google && (data.password || data.emailCode) ? '<div class="divider">or</div>' : ''}
|
|
65
|
-
${data.password ? `<a href="${data.password
|
|
66
|
-
${data.emailCode ? `<a href="${data.emailCode
|
|
97
|
+
${data.password ? `<a href="${data.password}" class="btn" data-provider="password">Sign in with password</a>` : ''}
|
|
98
|
+
${data.emailCode ? `<a href="${data.emailCode}" class="btn" data-provider="email-code">Sign in with email</a>` : ''}
|
|
67
99
|
${providers.includes('password')
|
|
68
100
|
? `<a href="${options.forgotPasswordPath}" class="forgot-link">Forgot password?</a>`
|
|
69
101
|
: ''}
|
package/dist/routes/login.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@growth-labs/auth",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "OpenAuth client package for Astro + Cloudflare. Verifies JWTs, manages session cookies, gates protected paths, and injects login/logout/callback routes.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"astro",
|
|
@@ -33,11 +33,13 @@
|
|
|
33
33
|
},
|
|
34
34
|
"./middleware/*": {
|
|
35
35
|
"types": "./dist/middleware/*.d.ts",
|
|
36
|
-
"import": "./dist/middleware/*.js"
|
|
36
|
+
"import": "./dist/middleware/*.js",
|
|
37
|
+
"default": "./dist/middleware/*.js"
|
|
37
38
|
},
|
|
38
39
|
"./routes/*": {
|
|
39
40
|
"types": "./dist/routes/*.d.ts",
|
|
40
|
-
"import": "./dist/routes/*.js"
|
|
41
|
+
"import": "./dist/routes/*.js",
|
|
42
|
+
"default": "./dist/routes/*.js"
|
|
41
43
|
},
|
|
42
44
|
"./types": {
|
|
43
45
|
"types": "./dist/types.d.ts",
|