@growth-labs/auth 0.2.1 → 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.
@@ -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(cookiePrefix: string): string;
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,YAAY,EAAE,MAAM,GAAG,MAAM,CAe5D"}
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(cookiePrefix) {
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,YAAoB;IACnD,qEAAqE;IACrE,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;IAClD,OAAO;;;;uBAIe,aAAa;;;;;;;GAOjC,CAAA;AACH,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,CAiClE"}
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"}
@@ -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
- const authFlow = await createAuthFlow(context);
11
- const google = options.providers.includes('google')
12
- ? await getAuthorizationUrl(context, 'google', redirectPath, authFlow)
13
- : null;
14
- const password = options.providers.includes('password')
15
- ? await getAuthorizationUrl(context, 'password', redirectPath, authFlow)
16
- : null;
17
- const emailCode = options.providers.includes('email-code')
18
- ? await getAuthorizationUrl(context, 'code', redirectPath, authFlow)
19
- : null;
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
- password,
23
- emailCode,
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: { 'Content-Type': 'text/html; charset=utf-8' },
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.url}" class="btn btn-google" data-provider="google">Sign in with Google</a>` : ''}
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.url}" class="btn" data-provider="password">Sign in with password</a>` : ''}
66
- ${data.emailCode ? `<a href="${data.emailCode.url}" class="btn" data-provider="email-code">Sign in with email</a>` : ''}
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
  : ''}
@@ -1 +1 @@
1
- {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/routes/login.ts"],"names":[],"mappings":"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"}
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.1",
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",