@zeushq/nextjs-zidentity
Version:
Next.js SDK for signin in with Zeus Identity
359 lines • 13.6 kB
TypeScript
/// <reference types="node" />
import { IncomingMessage } from 'http';
import { AuthorizationParameters as OidcAuthorizationParameters } from 'openid-client';
import { LoginOptions, DeepPartial } from './zsession';
/**
* @category server
*/
export interface BaseConfig {
/**F
* The secret(s) used to derive an encryption key for the user identity in a session cookie and
* to sign the transient cookies used by the login callback.
* Use a single string key or array of keys for an encrypted session cookie.
* You can also use the ZIDENTITY_SECRET environment variable.
*/
secret: string | Array<string>;
/**
* Object defining application session cookie attributes.
*/
session: SessionConfig;
/**
* Boolean value to enable Zeus Identity's proprietary logout feature.
* Since this SDK is for Zeus Identity, it's set to `true`by default.
*/
zIdentityLogout: boolean;
/**
* URL parameters used when redirecting users to the authorization server to log in.
*
* If this property is not provided by your application, its default values will be:
*
* ```js
* {
* response_type: 'code',
* scope: 'openid profile email'
* }
* ```
*
* New values can be passed in to change what is returned from the authorization server
* depending on your specific scenario. Additional custom parameters can be added as well.
*
* **Note:** You must provide the required parameters if this object is set.
*
* ```js
* {
* response_type: 'code',
* scope: 'openid profile email',
*
* // Additional parameters
* acr_value: "tenant:test-tenant",
* custom_param: "custom-value"
* };
* ```
*/
authorizationParams: AuthorizationParameters;
/**
* The root URL for the application router, eg https://localhost
* You can also use the ZIDENTITY_BASE_URL environment variable.
* If you provide a domain, we will prefix it with `https://` - This can be useful when assigning it to
* `VERCEL_URL` for Vercel deploys
*/
baseURL: string;
/**
* The Client ID for your application.
* You can also use the ZIDENTITY_CLIENT_ID environment variable.
*/
clientID: string;
/**
* The Client Secret for your application.
* Required when requesting access tokens.
* You can also use the ZIDENTITY_CLIENT_SECRET environment variable.
*/
clientSecret?: string;
/**
* Integer value for the system clock's tolerance (leeway) in seconds for ID token verification.`
* Default is 60
* You can also use the ZIDENTITY_CLOCK_TOLERANCE environment variable.
*/
clockTolerance: number;
/**
* Integer value for the http timeout in ms for authentication requests.
* Default is 5000
* You can also use the ZIDENTITY_HTTP_TIMEOUT environment variable.
*/
httpTimeout: number;
/**
* To opt-out of sending the library and node version to your authorization server
* via the `Zeus Identity-Client` header. Default is `true
* You can also use the ZIDENTITY_ENABLE_TELEMETRY environment variable.
*/
enableTelemetry: boolean;
/**
* Function that returns an object with URL-safe state values for login.
* Used for passing custom state parameters to your authorization server.
* Can also be passed in to {@link HandleLogin}
*
* ```js
* {
* ...
* getLoginState(req, options) {
* return {
* returnTo: options.returnTo || req.originalUrl,
* customState: 'foo'
* };
* }
* }
* ``
*/
getLoginState: (req: IncomingMessage, options: LoginOptions) => Record<string, any>;
/**
* Array value of claims to remove from the ID token before storing the cookie session.
* Default is `['aud', 'iss', 'iat', 'exp', 'nbf', 'nonce', 'azp', 'auth_time', 's_hash', 'at_hash', 'c_hash' ]`
*/
identityClaimFilter: string[];
/**
* Boolean value to log the user out from the identity provider on application logout. Default is `true`
* You can also use the ZIDENTITY_IDP_LOGOUT environment variable.
*/
idpLogout: boolean;
/**
* String value for the expected ID token algorithm. Default is 'RS256'
* You can also use the ZIDENTITY_ID_TOKEN_SIGNING_ALG environment variable.
*/
idTokenSigningAlg: string;
/**
* REQUIRED. The root URL for the token issuer with no trailing slash.
* This is `https://` plus your Zeus Identity domain
* You can also use the ZIDENTITY_ISSUER_BASE_URL environment variable.
*/
issuerBaseURL: string;
/**
* Set a fallback cookie with no `SameSite` attribute when `response_mode` is `form_post`.
* The default `response_mode` for this SDK is `query` so this defaults to `false`
* You can also use the ZIDENTITY_LEGACY_SAME_SITE_COOKIE environment variable.
*/
legacySameSiteCookie: boolean;
/**
* Boolean value to automatically install the login and logout routes.
*/
routes: {
/**
* Either a relative path to the application or a valid URI to an external domain.
* This value must be registered on the authorization server.
* The user will be redirected to this after a logout has been performed.
* You can also use the ZIDENTITY_POST_LOGOUT_REDIRECT environment variable.
*/
postLogoutRedirect: string;
/**
* Relative path to the application callback to process the response from the authorization server.
* Defaults to `/api/auth/callback`
* You can also use the ZIDENTITY_CALLBACK environment variable.
*/
callback: string;
};
}
/**
* Configuration parameters used for the application session.
*
* @category Server
*/
export interface SessionConfig {
/**
* String value for the cookie name used for the internal session.
* This value must only include letters, numbers, and underscores.
* Default is `appSession`.
* You can also use the ZIDENTITY_SESSION_NAME environment variable.
*/
name: string;
/**
* If you want your session duration to be rolling, eg reset everytime the
* user is active on your site, set this to a `true`. If you want the session
* duration to be absolute, where the user is logged out a fixed time after login,
* regardless of activity, set this to `false`
* Default is `true`.
* You can also use the ZIDENTITY_SESSION_ROLLING environment variable.
*/
rolling: boolean;
/**
* Integer value, in seconds, for application session rolling duration.
* The amount of time for which the user must be idle for then to be logged out.
* Default is 86400 seconds (1 day).
* You can also use the ZIDENTITY_SESSION_ROLLING_DURATION environment variable.
*/
rollingDuration: number;
/**
* Integer value, in seconds, for application absolute rolling duration.
* The amount of time after the user has logged in that they will be logged out.
* Set this to `false` if you don't want an absolute duration on your session.
* Default is 604800 seconds (7 days).
* You can also use the ZIDENTITY_SESSION_ABSOLUTE_DURATION environment variable.
*/
absoluteDuration: boolean | number;
cookie: CookieConfig;
}
/**
* Configure how the session cookie and transient cookies are stored.
*
* @category Server
*/
export interface CookieConfig {
/**
* Domain name for the cookie.
* You can also use the ZIDENTITY_COOKIE_DOMAIN environment variable.
*/
domain?: string;
/**
* Path for the cookie.
* This defaults to `/`
* You should change this to be more restrictive if you application shares a domain with other apps.
* You can also use the ZIDENTITY_COOKIE_PATH environment variable.
*/
path?: string;
/**
* Set to true to use a transient cookie (cookie without an explicit expiration).
* Default is `false`
* You can also use the ZIDENTITY_COOKIE_TRANSIENT environment variable.
*/
transient: boolean;
/**
* Flags the cookie to be accessible only by the web server.
* Defaults to `true`.
* You can also use the ZIDENTITY_COOKIE_HTTP_ONLY environment variable.
*/
httpOnly: boolean;
/**
* Marks the cookie to be used over secure channels only.
* Defaults to the protocol of {@link BaseConfig.baseURL}.
* You can also use the ZIDENTITY_COOKIE_SECURE environment variable.
*/
secure?: boolean;
/**
* Value of the SameSite Set-Cookie attribute.
* Defaults to "lax" but will be adjusted based on {@link AuthorizationParameters.response_type}.
* You can also use the ZIDENTITY_COOKIE_SAME_SITE environment variable.
*/
sameSite: 'lax' | 'strict' | 'none';
}
/**
* Authorization parameters that will be passed to the identity provider on login.
*
* The library uses `response_mode: 'query'` and `response_type: 'code'` (with PKCE) by default.
*
* @category Server
*/
export interface AuthorizationParameters extends OidcAuthorizationParameters {
scope: string;
response_mode: 'query' | 'form_post';
response_type: 'id_token' | 'code id_token' | 'code';
}
/**
* @category server
*/
export interface NextConfig extends Pick<BaseConfig, 'identityClaimFilter'> {
/**
* Log users in to a specific organization.
*
* This will specify an `organization` parameter in your user's login request and will add a step to validate
* the `org_id` claim in your user's ID Token.
*
* If your app supports multiple organizations, you should take a look at {@Link AuthorizationParams.organization}
*/
organization?: string;
routes: {
login: string;
};
}
/**
* ## Configuration properties.
*
* The Server part of the SDK can be configured in 2 ways.
*
* ### 1. Environmental Variables
*
* The simplest way to use the SDK is to use the named exports ({@link HandleAuth}, {@link HandleLogin},
* {@link HandleLogout}, {@link HandleCallback}, {@link HandleProfile}, {@link GetSession}, {@link GetAccessToken},
* {@link WithApiAuthRequired} and {@link WithPageAuthRequired}), eg:
*
* ```js
* // pages/api/auth/[...zidentity].js
* import { handleAuth } from '@zeushq/nextjs-zidentity';
*
* return handleAuth();
* ```
*
* When you use these named exports, an instance of the SDK is created for you which you can configure using
* environmental variables:
*
* ### Required
*
* - `ZIDENTITY_SECRET`: See {@link secret}
* - `ZIDENTITY_ISSUER_BASE_URL`: See {@link issuerBaseURL}
* - `ZIDENTITY_BASE_URL`: See {@link baseURL}
* - `ZIDENTITY_CLIENT_ID`: See {@link clientID}
* - `ZIDENTITY_CLIENT_SECRET`: See {@link clientSecret}
*
* ### Optional
*
* - `ZIDENTITY_CLOCK_TOLERANCE`: See {@link clockTolerance}
* - `ZIDENTITY_HTTP_TIMEOUT`: See {@link httpTimeout}
* - `ZIDENTITY_ENABLE_TELEMETRY`: See {@link enableTelemetry}
* - `ZIDENTITY_IDP_LOGOUT`: See {@link idpLogout}
* - `ZIDENTITY_ID_TOKEN_SIGNING_ALG`: See {@link idTokenSigningAlg}
* - `ZIDENTITY_LEGACY_SAME_SITE_COOKIE`: See {@link legacySameSiteCookie}
* - `NEXT_PUBLIC_ZIDENTITY_LOGIN`: See {@link NextConfig.routes}
* - `ZIDENTITY_CALLBACK`: See {@link BaseConfig.routes}
* - `ZIDENTITY_POST_LOGOUT_REDIRECT`: See {@link BaseConfig.routes}
* - `ZIDENTITY_AUDIENCE`: See {@link BaseConfig.authorizationParams}
* - `ZIDENTITY_SCOPE`: See {@link BaseConfig.authorizationParams}
* - `ZIDENTITY_ORGANIZATION`: See {@link NextConfig.organization}
* - `ZIDENTITY_SESSION_NAME`: See {@link SessionConfig.name}
* - `ZIDENTITY_SESSION_ROLLING`: See {@link SessionConfig.rolling}
* - `ZIDENTITY_SESSION_ROLLING_DURATION`: See {@link SessionConfig.rollingDuration}
* - `ZIDENTITY_SESSION_ABSOLUTE_DURATION`: See {@link SessionConfig.absoluteDuration}
* - `ZIDENTITY_COOKIE_DOMAIN`: See {@link CookieConfig.domain}
* - `ZIDENTITY_COOKIE_PATH`: See {@link CookieConfig.path}
* - `ZIDENTITY_COOKIE_TRANSIENT`: See {@link CookieConfig.transient}
* - `ZIDENTITY_COOKIE_HTTP_ONLY`: See {@link CookieConfig.httpOnly}
* - `ZIDENTITY_COOKIE_SECURE`: See {@link CookieConfig.secure}
* - `ZIDENTITY_COOKIE_SAME_SITE`: See {@link CookieConfig.sameSite}
*
* ### 2. Create your own instance using {@link InitZeusIdentity}
*
* If you don't want to configure the SDK with environment variables or you want more fine grained control over the
* instance, you can create an instance yourself and use the handlers and helpers from that.
*
* First, export your configured instance from another module:
*
* ```js
* // utils/zidentity.js
* import { InitZeusIdentity } from '@zeushq/nextjs-zidentity';
*
* export default InitZeusIdentity({ ...ConfigParameters... });
* ```
*
* Then import it into your route handler:
*
* ```js
* // pages/api/auth/[...zidentity].js
* import zidentity from '../../../../utils/zidentity';
*
* return zidentity.handleAuth();
* ```
*
* **Note** If you use {@link InitZeusIdentity}, you should *not* use the other named exports as they
* will use a different instance of the SDK.
*
* @category Server
*/
export declare type ConfigParameters = DeepPartial<BaseConfig & NextConfig>;
/**
* @ignore
*/
export declare const getLoginUrl: () => string;
/**
* @ignore
*/
export declare const getConfig: (params?: ConfigParameters) => {
baseConfig: BaseConfig;
nextConfig: NextConfig;
};
//# sourceMappingURL=config.d.ts.map