@authgear/nextjs 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/proxy.ts"],"sourcesContent":["import { NextResponse, type NextRequest } from \"next/server\";\nimport type { AuthgearConfig } from \"./types.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { decryptSession, buildSessionCookie } from \"./session/cookie.js\";\nimport { isTokenExpired } from \"./session/state.js\";\nimport { fetchOIDCConfiguration } from \"./oauth/discovery.js\";\nimport { refreshAccessToken } from \"./oauth/token.js\";\n\nexport interface AuthgearProxyOptions extends AuthgearConfig {\n /**\n * Paths that require authentication. Unauthenticated requests are redirected to login.\n * Supports exact paths and prefix patterns ending with `*` (e.g. \"/dashboard/*\").\n */\n protectedPaths?: string[];\n\n /**\n * Paths that are always public (never redirected to login).\n * Takes precedence over protectedPaths.\n * Defaults to [\"/api/auth/*\"].\n */\n publicPaths?: string[];\n\n /**\n * URL to redirect unauthenticated users. Defaults to \"/api/auth/login\".\n */\n loginPath?: string;\n}\n\nfunction matchesPath(pathname: string, patterns: string[]): boolean {\n return patterns.some((pattern) => {\n if (pattern.endsWith(\"*\")) {\n return pathname.startsWith(pattern.slice(0, -1));\n }\n return pathname === pattern;\n });\n}\n\n/**\n * Create a Next.js 16 proxy function for Authgear authentication.\n *\n * Usage in `proxy.ts`:\n * ```ts\n * import { createAuthgearProxy } from \"@authgear/nextjs/proxy\";\n * export const proxy = createAuthgearProxy({ ...config, protectedPaths: [\"/dashboard/*\"] });\n * ```\n */\nexport function createAuthgearProxy(options: AuthgearProxyOptions) {\n const resolved = resolveConfig(options);\n const protectedPaths = options.protectedPaths ?? [];\n const publicPaths = options.publicPaths ?? [\"/api/auth/*\"];\n const loginPath = options.loginPath ?? \"/api/auth/login\";\n\n return async function proxy(request: NextRequest): Promise<NextResponse> {\n const { pathname } = request.nextUrl;\n\n // Always allow public paths\n if (matchesPath(pathname, publicPaths)) {\n return NextResponse.next();\n }\n\n const sessionCookieValue = request.cookies.get(resolved.cookieName)?.value;\n let sessionData = sessionCookieValue\n ? decryptSession(sessionCookieValue, resolved.sessionSecret)\n : null;\n\n // Try to refresh expired token\n if (sessionData && isTokenExpired(sessionData.expiresAt) && sessionData.refreshToken) {\n try {\n const oidcConfig = await fetchOIDCConfiguration(resolved.endpoint);\n const tokenResponse = await refreshAccessToken(oidcConfig, {\n refreshToken: sessionData.refreshToken,\n clientID: resolved.clientID,\n clientSecret: resolved.clientSecret || undefined,\n });\n sessionData = {\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token ?? sessionData.refreshToken,\n idToken: tokenResponse.id_token ?? sessionData.idToken,\n expiresAt: Math.floor(Date.now() / 1000) + tokenResponse.expires_in,\n };\n } catch {\n sessionData = null;\n }\n }\n\n // Redirect unauthenticated requests on protected paths\n if (!sessionData && matchesPath(pathname, protectedPaths)) {\n const loginURL = new URL(loginPath, request.nextUrl.origin);\n loginURL.searchParams.set(\"returnTo\", pathname);\n return NextResponse.redirect(loginURL);\n }\n\n const response = NextResponse.next();\n\n // Inject Authorization header for authenticated requests\n if (sessionData) {\n const requestHeaders = new Headers(request.headers);\n requestHeaders.set(\"Authorization\", `Bearer ${sessionData.accessToken}`);\n\n // Update session cookie if token was refreshed\n const newCookie = buildSessionCookie(resolved.cookieName, sessionData, resolved.sessionSecret);\n response.cookies.set(newCookie.name, newCookie.value, {\n httpOnly: newCookie.httpOnly,\n secure: newCookie.secure,\n sameSite: newCookie.sameSite,\n path: newCookie.path,\n maxAge: newCookie.maxAge,\n });\n }\n\n return response;\n };\n}\n"],"mappings":";;;;;;;;;;;AAAA,SAAS,oBAAsC;AA4B/C,SAAS,YAAY,UAAkB,UAA6B;AAClE,SAAO,SAAS,KAAK,CAAC,YAAY;AAChC,QAAI,QAAQ,SAAS,GAAG,GAAG;AACzB,aAAO,SAAS,WAAW,QAAQ,MAAM,GAAG,EAAE,CAAC;AAAA,IACjD;AACA,WAAO,aAAa;AAAA,EACtB,CAAC;AACH;AAWO,SAAS,oBAAoB,SAA+B;AACjE,QAAM,WAAW,cAAc,OAAO;AACtC,QAAM,iBAAiB,QAAQ,kBAAkB,CAAC;AAClD,QAAM,cAAc,QAAQ,eAAe,CAAC,aAAa;AACzD,QAAM,YAAY,QAAQ,aAAa;AAEvC,SAAO,eAAe,MAAM,SAA6C;AACvE,UAAM,EAAE,SAAS,IAAI,QAAQ;AAG7B,QAAI,YAAY,UAAU,WAAW,GAAG;AACtC,aAAO,aAAa,KAAK;AAAA,IAC3B;AAEA,UAAM,qBAAqB,QAAQ,QAAQ,IAAI,SAAS,UAAU,GAAG;AACrE,QAAI,cAAc,qBACd,eAAe,oBAAoB,SAAS,aAAa,IACzD;AAGJ,QAAI,eAAe,eAAe,YAAY,SAAS,KAAK,YAAY,cAAc;AACpF,UAAI;AACF,cAAM,aAAa,MAAM,uBAAuB,SAAS,QAAQ;AACjE,cAAM,gBAAgB,MAAM,mBAAmB,YAAY;AAAA,UACzD,cAAc,YAAY;AAAA,UAC1B,UAAU,SAAS;AAAA,UACnB,cAAc,SAAS,gBAAgB;AAAA,QACzC,CAAC;AACD,sBAAc;AAAA,UACZ,aAAa,cAAc;AAAA,UAC3B,cAAc,cAAc,iBAAiB,YAAY;AAAA,UACzD,SAAS,cAAc,YAAY,YAAY;AAAA,UAC/C,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,cAAc;AAAA,QAC3D;AAAA,MACF,QAAQ;AACN,sBAAc;AAAA,MAChB;AAAA,IACF;AAGA,QAAI,CAAC,eAAe,YAAY,UAAU,cAAc,GAAG;AACzD,YAAM,WAAW,IAAI,IAAI,WAAW,QAAQ,QAAQ,MAAM;AAC1D,eAAS,aAAa,IAAI,YAAY,QAAQ;AAC9C,aAAO,aAAa,SAAS,QAAQ;AAAA,IACvC;AAEA,UAAM,WAAW,aAAa,KAAK;AAGnC,QAAI,aAAa;AACf,YAAM,iBAAiB,IAAI,QAAQ,QAAQ,OAAO;AAClD,qBAAe,IAAI,iBAAiB,UAAU,YAAY,WAAW,EAAE;AAGvE,YAAM,YAAY,mBAAmB,SAAS,YAAY,aAAa,SAAS,aAAa;AAC7F,eAAS,QAAQ,IAAI,UAAU,MAAM,UAAU,OAAO;AAAA,QACpD,UAAU,UAAU;AAAA,QACpB,QAAQ,UAAU;AAAA,QAClB,UAAU,UAAU;AAAA,QACpB,MAAM,UAAU;AAAA,QAChB,QAAQ,UAAU;AAAA,MACpB,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
@@ -0,0 +1,22 @@
1
+ import { A as AuthgearConfig, S as Session, U as UserInfo, J as JWTPayload } from './types-Csfra4K2.js';
2
+ export { P as Page, b as SessionState } from './types-Csfra4K2.js';
3
+
4
+ /**
5
+ * Read the current session in a Server Component or Route Handler.
6
+ * Automatically refreshes the access token if expired.
7
+ */
8
+ declare function auth(config: AuthgearConfig): Promise<Session>;
9
+ /**
10
+ * Get the current user in a Server Component or Route Handler.
11
+ * Returns null if not authenticated.
12
+ */
13
+ declare function currentUser(config: AuthgearConfig): Promise<UserInfo | null>;
14
+ /**
15
+ * Verify a JWT access token (from Authorization: Bearer header).
16
+ * Useful for protecting API routes.
17
+ *
18
+ * @throws {Error} If the token is invalid, expired, or has wrong issuer/audience
19
+ */
20
+ declare function verifyAccessToken(token: string, config: AuthgearConfig): Promise<JWTPayload>;
21
+
22
+ export { JWTPayload, Session, UserInfo, auth, currentUser, verifyAccessToken };
package/dist/server.js ADDED
@@ -0,0 +1,100 @@
1
+ import {
2
+ parseUserInfo
3
+ } from "./chunk-3KVYAFQJ.js";
4
+ import {
5
+ decryptSession,
6
+ deriveSessionState,
7
+ fetchOIDCConfiguration,
8
+ isTokenExpired,
9
+ refreshAccessToken,
10
+ resolveConfig
11
+ } from "./chunk-MJD3XNUK.js";
12
+ import {
13
+ Page,
14
+ SessionState
15
+ } from "./chunk-UY6NEM2T.js";
16
+
17
+ // src/server.ts
18
+ import "server-only";
19
+ import { cookies } from "next/headers";
20
+
21
+ // src/jwt/verify.ts
22
+ import { jwtVerify } from "jose";
23
+
24
+ // src/jwt/jwks.ts
25
+ import { createRemoteJWKSet } from "jose";
26
+ var jwksSets = /* @__PURE__ */ new Map();
27
+ function getJWKS(oidcConfig) {
28
+ const uri = oidcConfig.jwks_uri;
29
+ let jwks = jwksSets.get(uri);
30
+ if (!jwks) {
31
+ jwks = createRemoteJWKSet(new URL(uri));
32
+ jwksSets.set(uri, jwks);
33
+ }
34
+ return jwks;
35
+ }
36
+
37
+ // src/jwt/verify.ts
38
+ async function verifyJWT(token, oidcConfig, options) {
39
+ const jwks = getJWKS(oidcConfig);
40
+ const { payload } = await jwtVerify(token, jwks, {
41
+ issuer: oidcConfig.issuer,
42
+ audience: options?.audience,
43
+ algorithms: ["RS256"]
44
+ });
45
+ return payload;
46
+ }
47
+
48
+ // src/server.ts
49
+ async function auth(config) {
50
+ const resolved = resolveConfig(config);
51
+ const cookieStore = await cookies();
52
+ const sessionCookieValue = cookieStore.get(resolved.cookieName)?.value;
53
+ const sessionData = sessionCookieValue ? decryptSession(sessionCookieValue, resolved.sessionSecret) : null;
54
+ return deriveSessionState(sessionData);
55
+ }
56
+ async function currentUser(config) {
57
+ const resolved = resolveConfig(config);
58
+ const cookieStore = await cookies();
59
+ const sessionCookieValue = cookieStore.get(resolved.cookieName)?.value;
60
+ if (!sessionCookieValue) return null;
61
+ let sessionData = decryptSession(sessionCookieValue, resolved.sessionSecret);
62
+ if (!sessionData) return null;
63
+ const oidcConfig = await fetchOIDCConfiguration(resolved.endpoint);
64
+ if (isTokenExpired(sessionData.expiresAt) && sessionData.refreshToken) {
65
+ try {
66
+ const tokenResponse = await refreshAccessToken(oidcConfig, {
67
+ refreshToken: sessionData.refreshToken,
68
+ clientID: resolved.clientID,
69
+ clientSecret: resolved.clientSecret || void 0
70
+ });
71
+ sessionData = {
72
+ accessToken: tokenResponse.access_token,
73
+ refreshToken: tokenResponse.refresh_token ?? sessionData.refreshToken,
74
+ idToken: tokenResponse.id_token ?? sessionData.idToken,
75
+ expiresAt: Math.floor(Date.now() / 1e3) + tokenResponse.expires_in
76
+ };
77
+ } catch {
78
+ return null;
79
+ }
80
+ }
81
+ const userinfoRes = await fetch(oidcConfig.userinfo_endpoint, {
82
+ headers: { Authorization: `Bearer ${sessionData.accessToken}` }
83
+ });
84
+ if (!userinfoRes.ok) return null;
85
+ const raw = await userinfoRes.json();
86
+ return parseUserInfo(raw);
87
+ }
88
+ async function verifyAccessToken(token, config) {
89
+ const resolved = resolveConfig(config);
90
+ const oidcConfig = await fetchOIDCConfiguration(resolved.endpoint);
91
+ return verifyJWT(token, oidcConfig);
92
+ }
93
+ export {
94
+ Page,
95
+ SessionState,
96
+ auth,
97
+ currentUser,
98
+ verifyAccessToken
99
+ };
100
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../src/jwt/verify.ts","../src/jwt/jwks.ts"],"sourcesContent":["import \"server-only\";\nimport { cookies } from \"next/headers\";\nimport { SessionState, Page, type Session, type UserInfo, type JWTPayload, type AuthgearConfig } from \"./types.js\";\nimport { resolveConfig } from \"./config.js\";\nimport { decryptSession } from \"./session/cookie.js\";\nimport { deriveSessionState, isTokenExpired } from \"./session/state.js\";\nimport { fetchOIDCConfiguration } from \"./oauth/discovery.js\";\nimport { refreshAccessToken } from \"./oauth/token.js\";\n// ROADMAP: import { getAppSessionToken } from \"./oauth/token.js\";\n// ROADMAP: import { buildOpenURL } from \"./oauth/authorize.js\";\nimport { verifyJWT } from \"./jwt/verify.js\";\nimport { parseUserInfo } from \"./user.js\";\n\n/**\n * Read the current session in a Server Component or Route Handler.\n * Automatically refreshes the access token if expired.\n */\nexport async function auth(config: AuthgearConfig): Promise<Session> {\n const resolved = resolveConfig(config);\n const cookieStore = await cookies();\n const sessionCookieValue = cookieStore.get(resolved.cookieName)?.value;\n\n const sessionData = sessionCookieValue\n ? decryptSession(sessionCookieValue, resolved.sessionSecret)\n : null;\n\n return deriveSessionState(sessionData);\n}\n\n/**\n * Get the current user in a Server Component or Route Handler.\n * Returns null if not authenticated.\n */\nexport async function currentUser(config: AuthgearConfig): Promise<UserInfo | null> {\n const resolved = resolveConfig(config);\n const cookieStore = await cookies();\n const sessionCookieValue = cookieStore.get(resolved.cookieName)?.value;\n\n if (!sessionCookieValue) return null;\n\n let sessionData = decryptSession(sessionCookieValue, resolved.sessionSecret);\n if (!sessionData) return null;\n\n const oidcConfig = await fetchOIDCConfiguration(resolved.endpoint);\n\n // Auto-refresh expired token\n if (isTokenExpired(sessionData.expiresAt) && sessionData.refreshToken) {\n try {\n const tokenResponse = await refreshAccessToken(oidcConfig, {\n refreshToken: sessionData.refreshToken,\n clientID: resolved.clientID,\n clientSecret: resolved.clientSecret || undefined,\n });\n sessionData = {\n accessToken: tokenResponse.access_token,\n refreshToken: tokenResponse.refresh_token ?? sessionData.refreshToken,\n idToken: tokenResponse.id_token ?? sessionData.idToken,\n expiresAt: Math.floor(Date.now() / 1000) + tokenResponse.expires_in,\n };\n } catch {\n return null;\n }\n }\n\n const userinfoRes = await fetch(oidcConfig.userinfo_endpoint, {\n headers: { Authorization: `Bearer ${sessionData.accessToken}` },\n });\n\n if (!userinfoRes.ok) return null;\n\n const raw = (await userinfoRes.json()) as Record<string, unknown>;\n return parseUserInfo(raw);\n}\n\n/**\n * Verify a JWT access token (from Authorization: Bearer header).\n * Useful for protecting API routes.\n *\n * @throws {Error} If the token is invalid, expired, or has wrong issuer/audience\n */\nexport async function verifyAccessToken(\n token: string,\n config: AuthgearConfig,\n): Promise<JWTPayload> {\n const resolved = resolveConfig(config);\n const oidcConfig = await fetchOIDCConfiguration(resolved.endpoint);\n return verifyJWT(token, oidcConfig);\n}\n\n// ROADMAP: getOpenURL — open Authgear settings (or any Authgear page) with the\n// current user pre-authenticated via the app_session_token exchange.\n//\n// This requires the Authgear server to grant the client permission to call\n// POST /oauth2/app_session_token (\"full user access\"). Once that server-side\n// configuration is available, uncomment the implementation below and the\n// imports above, then expose it from the example dashboard via a Server Action.\n//\n// export async function getOpenURL(\n// page: Page | string,\n// config: AuthgearConfig,\n// ): Promise<string> {\n// const resolved = resolveConfig(config);\n// const cookieStore = await cookies();\n// const sessionCookieValue = cookieStore.get(resolved.cookieName)?.value;\n// if (!sessionCookieValue) throw new Error(\"Not authenticated\");\n// const sessionData = decryptSession(sessionCookieValue, resolved.sessionSecret);\n// if (!sessionData?.refreshToken) throw new Error(\"No refresh token in session\");\n// const oidcConfig = await fetchOIDCConfiguration(resolved.endpoint);\n// const { app_session_token } = await getAppSessionToken(\n// resolved.endpoint,\n// sessionData.refreshToken,\n// );\n// return buildOpenURL(oidcConfig, {\n// clientID: resolved.clientID,\n// appSessionToken: app_session_token,\n// targetPath: page,\n// });\n// }\n\nexport { SessionState, Page };\nexport type { Session, UserInfo, JWTPayload };\n","import { jwtVerify } from \"jose\";\nimport type { JWTPayload, OIDCConfiguration } from \"../types.js\";\nimport { getJWKS } from \"./jwks.js\";\n\nexport interface VerifyOptions {\n /** Expected audience. If not set, audience is not checked. */\n audience?: string | string[];\n}\n\nexport async function verifyJWT(\n token: string,\n oidcConfig: OIDCConfiguration,\n options?: VerifyOptions,\n): Promise<JWTPayload> {\n const jwks = getJWKS(oidcConfig);\n\n const { payload } = await jwtVerify(token, jwks, {\n issuer: oidcConfig.issuer,\n audience: options?.audience,\n algorithms: [\"RS256\"],\n });\n\n return payload as unknown as JWTPayload;\n}\n","import { createRemoteJWKSet } from \"jose\";\nimport type { OIDCConfiguration } from \"../types.js\";\n\nconst jwksSets = new Map<string, ReturnType<typeof createRemoteJWKSet>>();\n\nexport function getJWKS(oidcConfig: OIDCConfiguration) {\n const uri = oidcConfig.jwks_uri;\n let jwks = jwksSets.get(uri);\n if (!jwks) {\n jwks = createRemoteJWKSet(new URL(uri));\n jwksSets.set(uri, jwks);\n }\n return jwks;\n}\n\n/** Clear cached JWKS (useful for testing) */\nexport function clearJWKSCache(): void {\n jwksSets.clear();\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAAA,OAAO;AACP,SAAS,eAAe;;;ACDxB,SAAS,iBAAiB;;;ACA1B,SAAS,0BAA0B;AAGnC,IAAM,WAAW,oBAAI,IAAmD;AAEjE,SAAS,QAAQ,YAA+B;AACrD,QAAM,MAAM,WAAW;AACvB,MAAI,OAAO,SAAS,IAAI,GAAG;AAC3B,MAAI,CAAC,MAAM;AACT,WAAO,mBAAmB,IAAI,IAAI,GAAG,CAAC;AACtC,aAAS,IAAI,KAAK,IAAI;AAAA,EACxB;AACA,SAAO;AACT;;;ADJA,eAAsB,UACpB,OACA,YACA,SACqB;AACrB,QAAM,OAAO,QAAQ,UAAU;AAE/B,QAAM,EAAE,QAAQ,IAAI,MAAM,UAAU,OAAO,MAAM;AAAA,IAC/C,QAAQ,WAAW;AAAA,IACnB,UAAU,SAAS;AAAA,IACnB,YAAY,CAAC,OAAO;AAAA,EACtB,CAAC;AAED,SAAO;AACT;;;ADNA,eAAsB,KAAK,QAA0C;AACnE,QAAM,WAAW,cAAc,MAAM;AACrC,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,qBAAqB,YAAY,IAAI,SAAS,UAAU,GAAG;AAEjE,QAAM,cAAc,qBAChB,eAAe,oBAAoB,SAAS,aAAa,IACzD;AAEJ,SAAO,mBAAmB,WAAW;AACvC;AAMA,eAAsB,YAAY,QAAkD;AAClF,QAAM,WAAW,cAAc,MAAM;AACrC,QAAM,cAAc,MAAM,QAAQ;AAClC,QAAM,qBAAqB,YAAY,IAAI,SAAS,UAAU,GAAG;AAEjE,MAAI,CAAC,mBAAoB,QAAO;AAEhC,MAAI,cAAc,eAAe,oBAAoB,SAAS,aAAa;AAC3E,MAAI,CAAC,YAAa,QAAO;AAEzB,QAAM,aAAa,MAAM,uBAAuB,SAAS,QAAQ;AAGjE,MAAI,eAAe,YAAY,SAAS,KAAK,YAAY,cAAc;AACrE,QAAI;AACF,YAAM,gBAAgB,MAAM,mBAAmB,YAAY;AAAA,QACzD,cAAc,YAAY;AAAA,QAC1B,UAAU,SAAS;AAAA,QACnB,cAAc,SAAS,gBAAgB;AAAA,MACzC,CAAC;AACD,oBAAc;AAAA,QACZ,aAAa,cAAc;AAAA,QAC3B,cAAc,cAAc,iBAAiB,YAAY;AAAA,QACzD,SAAS,cAAc,YAAY,YAAY;AAAA,QAC/C,WAAW,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,IAAI,cAAc;AAAA,MAC3D;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAc,MAAM,MAAM,WAAW,mBAAmB;AAAA,IAC5D,SAAS,EAAE,eAAe,UAAU,YAAY,WAAW,GAAG;AAAA,EAChE,CAAC;AAED,MAAI,CAAC,YAAY,GAAI,QAAO;AAE5B,QAAM,MAAO,MAAM,YAAY,KAAK;AACpC,SAAO,cAAc,GAAG;AAC1B;AAQA,eAAsB,kBACpB,OACA,QACqB;AACrB,QAAM,WAAW,cAAc,MAAM;AACrC,QAAM,aAAa,MAAM,uBAAuB,SAAS,QAAQ;AACjE,SAAO,UAAU,OAAO,UAAU;AACpC;","names":[]}
@@ -0,0 +1,94 @@
1
+ interface AuthgearConfig {
2
+ /** Authgear endpoint, e.g. "https://myapp.authgear.cloud" */
3
+ endpoint: string;
4
+ /** OAuth client ID */
5
+ clientID: string;
6
+ /** OAuth client secret (for confidential server-side clients) */
7
+ clientSecret?: string;
8
+ /** Redirect URI for OAuth callback, e.g. "http://localhost:3000/api/auth/callback" */
9
+ redirectURI: string;
10
+ /** Where to redirect after logout */
11
+ postLogoutRedirectURI?: string;
12
+ /** OAuth scopes. Defaults to ["openid", "offline_access", "https://authgear.com/scopes/full-userinfo"] */
13
+ scopes?: string[];
14
+ /** Secret key for encrypting session cookie (min 32 chars) */
15
+ sessionSecret: string;
16
+ /** Session cookie name. Defaults to "authgear.session" */
17
+ cookieName?: string;
18
+ }
19
+ /**
20
+ * Pages that can be opened via open().
21
+ */
22
+ declare enum Page {
23
+ Settings = "/settings"
24
+ }
25
+ declare const DEFAULT_SCOPES: string[];
26
+ declare enum SessionState {
27
+ Unknown = "UNKNOWN",
28
+ NoSession = "NO_SESSION",
29
+ Authenticated = "AUTHENTICATED"
30
+ }
31
+ interface SessionData {
32
+ accessToken: string;
33
+ refreshToken: string | null;
34
+ idToken: string | null;
35
+ expiresAt: number;
36
+ }
37
+ interface Session {
38
+ state: SessionState;
39
+ accessToken: string | null;
40
+ refreshToken: string | null;
41
+ idToken: string | null;
42
+ expiresAt: number | null;
43
+ user: UserInfo | null;
44
+ }
45
+ interface UserInfo {
46
+ sub: string;
47
+ email?: string;
48
+ emailVerified?: boolean;
49
+ phoneNumber?: string;
50
+ phoneNumberVerified?: boolean;
51
+ preferredUsername?: string;
52
+ givenName?: string;
53
+ familyName?: string;
54
+ name?: string;
55
+ picture?: string;
56
+ roles?: string[];
57
+ isAnonymous?: boolean;
58
+ isVerified?: boolean;
59
+ canReauthenticate?: boolean;
60
+ customAttributes?: Record<string, unknown>;
61
+ raw: Record<string, unknown>;
62
+ }
63
+ interface JWTPayload {
64
+ sub: string;
65
+ iss: string;
66
+ aud: string | string[];
67
+ exp: number;
68
+ iat: number;
69
+ jti?: string;
70
+ client_id?: string;
71
+ "https://authgear.com/claims/user/is_anonymous"?: boolean;
72
+ "https://authgear.com/claims/user/is_verified"?: boolean;
73
+ "https://authgear.com/claims/user/can_reauthenticate"?: boolean;
74
+ "https://authgear.com/claims/user/roles"?: string[];
75
+ [key: string]: unknown;
76
+ }
77
+ interface TokenResponse {
78
+ access_token: string;
79
+ token_type: string;
80
+ expires_in: number;
81
+ refresh_token?: string;
82
+ id_token?: string;
83
+ }
84
+ interface OIDCConfiguration {
85
+ authorization_endpoint: string;
86
+ token_endpoint: string;
87
+ userinfo_endpoint: string;
88
+ revocation_endpoint: string;
89
+ end_session_endpoint: string;
90
+ jwks_uri: string;
91
+ issuer: string;
92
+ }
93
+
94
+ export { type AuthgearConfig as A, DEFAULT_SCOPES as D, type JWTPayload as J, type OIDCConfiguration as O, Page as P, type Session as S, type TokenResponse as T, type UserInfo as U, type SessionData as a, SessionState as b };
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@authgear/nextjs",
3
+ "version": "0.1.1",
4
+ "description": "Authgear SDK for Next.js 16 - OAuth authentication, session management, and JWT verification",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ },
11
+ "./client": {
12
+ "types": "./dist/client.d.ts",
13
+ "import": "./dist/client.js"
14
+ },
15
+ "./server": {
16
+ "types": "./dist/server.d.ts",
17
+ "import": "./dist/server.js"
18
+ },
19
+ "./proxy": {
20
+ "types": "./dist/proxy.d.ts",
21
+ "import": "./dist/proxy.js"
22
+ }
23
+ },
24
+ "files": [
25
+ "dist"
26
+ ],
27
+ "scripts": {
28
+ "build": "tsup",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest",
31
+ "typecheck": "tsc --noEmit"
32
+ },
33
+ "keywords": [
34
+ "authgear",
35
+ "nextjs",
36
+ "authentication",
37
+ "oauth",
38
+ "oidc",
39
+ "jwt"
40
+ ],
41
+ "license": "MIT",
42
+ "dependencies": {
43
+ "jose": "^6.0.0"
44
+ },
45
+ "peerDependencies": {
46
+ "next": ">=16.0.0",
47
+ "react": ">=19.0.0",
48
+ "react-dom": ">=19.0.0"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^25.5.0",
52
+ "@types/react": "^19.0.0",
53
+ "@types/react-dom": "^19.0.0",
54
+ "next": "^16.0.0",
55
+ "react": "^19.0.0",
56
+ "react-dom": "^19.0.0",
57
+ "tsup": "^8.0.0",
58
+ "typescript": "^5.7.0",
59
+ "vitest": "^3.0.0"
60
+ }
61
+ }