supertokens-node
Version:
NodeJS driver for SuperTokens core
568 lines (567 loc) • 16.7 kB
TypeScript
// @ts-nocheck
import type { BaseRequest, BaseResponse } from "../../framework";
import OverrideableBuilder from "supertokens-js-override";
import { GeneralErrorResponse, JSONObject, JSONValue, NonNullableProperties, UserContext } from "../../types";
import { SessionContainerInterface } from "../session/types";
import { OAuth2Client } from "./OAuth2Client";
import { User } from "../../user";
import RecipeUserId from "../../recipeUserId";
export type TypeInput = {
override?: {
functions?: (
originalImplementation: RecipeInterface,
builder: OverrideableBuilder<RecipeInterface>
) => RecipeInterface;
apis?: (originalImplementation: APIInterface, builder: OverrideableBuilder<APIInterface>) => APIInterface;
};
};
export type TypeNormalisedInput = {
override: {
functions: (
originalImplementation: RecipeInterface,
builder: OverrideableBuilder<RecipeInterface>
) => RecipeInterface;
apis: (originalImplementation: APIInterface, builder: OverrideableBuilder<APIInterface>) => APIInterface;
};
};
export type APIOptions = {
recipeImplementation: RecipeInterface;
config: TypeNormalisedInput;
recipeId: string;
isInServerlessEnv: boolean;
req: BaseRequest;
res: BaseResponse;
};
export type ErrorOAuth2 = {
status: "ERROR";
error: string;
errorDescription: string;
statusCode?: number;
};
export type ConsentRequest = {
acr?: string;
amr?: string[];
challenge: string;
client?: OAuth2Client;
context?: JSONObject;
loginChallenge?: string;
loginSessionId?: string;
oidcContext?: any;
requestedAccessTokenAudience?: string[];
requestedScope?: string[];
skip?: boolean;
subject?: string;
};
export type LoginRequest = {
challenge: string;
client: OAuth2Client;
oidcContext?: any;
requestUrl: string;
requestedAccessTokenAudience?: string[];
requestedScope?: string[];
sessionId?: string;
skip: boolean;
subject: string;
};
export type TokenInfo = {
access_token?: string;
expires_in: number;
id_token?: string;
refresh_token?: string;
scope: string;
token_type: string;
};
export type LoginInfo = {
clientId: string;
clientName: string;
tosUri?: string;
policyUri?: string;
logoUri?: string;
clientUri?: string;
metadata?: Record<string, any> | null;
};
export type UserInfo = {
sub: string;
email?: string;
email_verified?: boolean;
phoneNumber?: string;
phoneNumber_verified?: boolean;
[key: string]: JSONValue;
};
export type InstrospectTokenResponse =
| {
active: false;
}
| ({
active: true;
} & JSONObject);
export type RecipeInterface = {
authorization(input: {
params: Record<string, string>;
cookies: string | undefined;
session: SessionContainerInterface | undefined;
userContext: UserContext;
}): Promise<
| {
redirectTo: string;
cookies: string[] | undefined;
}
| ErrorOAuth2
>;
tokenExchange(input: {
authorizationHeader?: string;
body: Record<string, string | undefined>;
userContext: UserContext;
}): Promise<TokenInfo | ErrorOAuth2>;
getConsentRequest(input: { challenge: string; userContext: UserContext }): Promise<ConsentRequest | ErrorOAuth2>;
acceptConsentRequest(input: {
challenge: string;
context?: any;
grantAccessTokenAudience?: string[];
grantScope?: string[];
handledAt?: string;
tenantId: string;
rsub: string;
sessionHandle: string;
initialAccessTokenPayload: JSONObject | undefined;
initialIdTokenPayload: JSONObject | undefined;
userContext: UserContext;
}): Promise<
| {
redirectTo: string;
status: "OK";
}
| ErrorOAuth2
>;
rejectConsentRequest(input: { challenge: string; error: ErrorOAuth2; userContext: UserContext }): Promise<
| {
redirectTo: string;
status: "OK";
}
| ErrorOAuth2
>;
getLoginRequest(input: { challenge: string; userContext: UserContext }): Promise<
| (LoginRequest & {
status: "OK";
})
| ErrorOAuth2
>;
acceptLoginRequest(input: {
challenge: string;
acr?: string;
amr?: string[];
context?: any;
extendSessionLifespan?: boolean;
identityProviderSessionId?: string;
subject: string;
userContext: UserContext;
}): Promise<
| {
redirectTo: string;
status: "OK";
}
| ErrorOAuth2
>;
rejectLoginRequest(input: { challenge: string; error: ErrorOAuth2; userContext: UserContext }): Promise<
| {
redirectTo: string;
status: "OK";
}
| ErrorOAuth2
>;
getOAuth2Client(input: { clientId: string; userContext: UserContext }): Promise<
| {
status: "OK";
client: OAuth2Client;
}
| {
status: "ERROR";
error: string;
errorDescription: string;
}
>;
getOAuth2Clients(
input: GetOAuth2ClientsInput & {
userContext: UserContext;
}
): Promise<
| {
status: "OK";
clients: Array<OAuth2Client>;
nextPaginationToken?: string;
}
| {
status: "ERROR";
error: string;
errorDescription: string;
}
>;
createOAuth2Client(
input: CreateOAuth2ClientInput & {
userContext: UserContext;
}
): Promise<
| {
status: "OK";
client: OAuth2Client;
}
| {
status: "ERROR";
error: string;
errorDescription: string;
}
>;
updateOAuth2Client(
input: UpdateOAuth2ClientInput & {
userContext: UserContext;
}
): Promise<
| {
status: "OK";
client: OAuth2Client;
}
| {
status: "ERROR";
error: string;
errorDescription: string;
}
>;
deleteOAuth2Client(
input: DeleteOAuth2ClientInput & {
userContext: UserContext;
}
): Promise<
| {
status: "OK";
}
| {
status: "ERROR";
error: string;
errorDescription: string;
}
>;
validateOAuth2AccessToken(input: {
token: string;
requirements?: {
clientId?: string;
scopes?: string[];
audience?: string;
};
checkDatabase?: boolean;
userContext: UserContext;
}): Promise<{
status: "OK";
payload: JSONObject;
}>;
getRequestedScopes(input: {
recipeUserId: RecipeUserId | undefined;
sessionHandle: string | undefined;
scopeParam: string[];
clientId: string;
userContext: UserContext;
}): Promise<string[]>;
buildAccessTokenPayload(input: {
user: User | undefined;
client: OAuth2Client;
sessionHandle: string | undefined;
scopes: string[];
userContext: UserContext;
}): Promise<JSONObject>;
buildIdTokenPayload(input: {
user: User | undefined;
client: OAuth2Client;
sessionHandle: string | undefined;
scopes: string[];
userContext: UserContext;
}): Promise<JSONObject>;
buildUserInfo(input: {
user: User;
accessTokenPayload: JSONObject;
scopes: string[];
tenantId: string;
userContext: UserContext;
}): Promise<JSONObject>;
getFrontendRedirectionURL(
input:
| {
type: "login";
loginChallenge: string;
tenantId: string;
forceFreshAuth: boolean;
hint: string | undefined;
userContext: UserContext;
}
| {
type: "try-refresh";
loginChallenge: string;
userContext: UserContext;
}
| {
type: "logout-confirmation";
logoutChallenge: string;
userContext: UserContext;
}
| {
type: "post-logout-fallback";
userContext: UserContext;
}
): Promise<string>;
revokeToken(
input: {
token: string;
userContext: UserContext;
} & (
| {
authorizationHeader: string;
}
| {
clientId: string;
clientSecret?: string;
}
)
): Promise<
| {
status: "OK";
}
| ErrorOAuth2
>;
revokeTokensByClientId(input: { clientId: string; userContext: UserContext }): Promise<{
status: "OK";
}>;
revokeTokensBySessionHandle(input: { sessionHandle: string; userContext: UserContext }): Promise<{
status: "OK";
}>;
introspectToken(input: { token: string; scopes?: string[]; userContext: UserContext }): Promise<
| (InstrospectTokenResponse & {
status: "OK";
})
| ErrorOAuth2
>;
endSession(input: {
params: Record<string, string>;
session?: SessionContainerInterface;
shouldTryRefresh: boolean;
userContext: UserContext;
}): Promise<
| {
redirectTo: string;
}
| ErrorOAuth2
>;
acceptLogoutRequest(input: { challenge: string; userContext: UserContext }): Promise<
| {
redirectTo: string;
}
| ErrorOAuth2
>;
rejectLogoutRequest(input: { challenge: string; userContext: UserContext }): Promise<{
status: "OK";
}>;
};
export type APIInterface = {
loginGET:
| undefined
| ((input: {
loginChallenge: string;
options: APIOptions;
session?: SessionContainerInterface;
shouldTryRefresh: boolean;
userContext: UserContext;
}) => Promise<
| {
frontendRedirectTo: string;
cookies?: string[];
}
| ErrorOAuth2
| GeneralErrorResponse
>);
authGET:
| undefined
| ((input: {
params: any;
cookie: string | undefined;
session: SessionContainerInterface | undefined;
shouldTryRefresh: boolean;
options: APIOptions;
userContext: UserContext;
}) => Promise<
| {
redirectTo: string;
cookies?: string[];
}
| ErrorOAuth2
| GeneralErrorResponse
>);
tokenPOST:
| undefined
| ((input: {
authorizationHeader?: string;
body: any;
options: APIOptions;
userContext: UserContext;
}) => Promise<TokenInfo | ErrorOAuth2 | GeneralErrorResponse>);
loginInfoGET:
| undefined
| ((input: { loginChallenge: string; options: APIOptions; userContext: UserContext }) => Promise<
| {
status: "OK";
info: LoginInfo;
}
| ErrorOAuth2
| GeneralErrorResponse
>);
userInfoGET:
| undefined
| ((input: {
accessTokenPayload: JSONObject;
user: User;
scopes: string[];
tenantId: string;
options: APIOptions;
userContext: UserContext;
}) => Promise<JSONObject | GeneralErrorResponse>);
revokeTokenPOST:
| undefined
| ((
input: {
token: string;
options: APIOptions;
userContext: UserContext;
} & (
| {
authorizationHeader: string;
}
| {
clientId: string;
clientSecret?: string;
}
)
) => Promise<
| {
status: "OK";
}
| ErrorOAuth2
>);
introspectTokenPOST:
| undefined
| ((input: {
token: string;
scopes?: string[];
options: APIOptions;
userContext: UserContext;
}) => Promise<InstrospectTokenResponse | GeneralErrorResponse | ErrorOAuth2>);
endSessionGET:
| undefined
| ((input: {
params: Record<string, string>;
session?: SessionContainerInterface;
shouldTryRefresh: boolean;
options: APIOptions;
userContext: UserContext;
}) => Promise<
| {
redirectTo: string;
}
| ErrorOAuth2
| GeneralErrorResponse
>);
endSessionPOST:
| undefined
| ((input: {
params: Record<string, string>;
session?: SessionContainerInterface;
shouldTryRefresh: boolean;
options: APIOptions;
userContext: UserContext;
}) => Promise<
| {
redirectTo: string;
}
| ErrorOAuth2
| GeneralErrorResponse
>);
logoutPOST:
| undefined
| ((input: {
logoutChallenge: string;
options: APIOptions;
session?: SessionContainerInterface;
userContext: UserContext;
}) => Promise<
| {
status: "OK";
frontendRedirectTo: string;
}
| ErrorOAuth2
| GeneralErrorResponse
>);
};
export type OAuth2ClientOptions = {
clientId: string;
clientSecret?: string;
createdAt: string;
updatedAt: string;
clientName: string;
scope: string;
redirectUris?: string[] | null;
postLogoutRedirectUris?: string[];
authorizationCodeGrantAccessTokenLifespan?: string | null;
authorizationCodeGrantIdTokenLifespan?: string | null;
authorizationCodeGrantRefreshTokenLifespan?: string | null;
clientCredentialsGrantAccessTokenLifespan?: string | null;
implicitGrantAccessTokenLifespan?: string | null;
implicitGrantIdTokenLifespan?: string | null;
refreshTokenGrantAccessTokenLifespan?: string | null;
refreshTokenGrantIdTokenLifespan?: string | null;
refreshTokenGrantRefreshTokenLifespan?: string | null;
tokenEndpointAuthMethod: string;
audience?: string[];
grantTypes?: string[] | null;
responseTypes?: string[] | null;
clientUri?: string;
logoUri?: string;
policyUri?: string;
tosUri?: string;
metadata?: Record<string, any>;
enableRefreshTokenRotation?: boolean;
};
export type GetOAuth2ClientsInput = {
/**
* Items per Page. Defaults to 250.
*/
pageSize?: number;
/**
* Next Page Token. Defaults to "1".
*/
paginationToken?: string;
/**
* The name of the clients to filter by.
*/
clientName?: string;
};
export type CreateOAuth2ClientInput = Partial<Omit<OAuth2ClientOptions, "createdAt" | "updatedAt">>;
export type UpdateOAuth2ClientInput = NonNullableProperties<
Omit<CreateOAuth2ClientInput, "redirectUris" | "grantTypes" | "responseTypes" | "metadata">
> & {
clientId: string;
redirectUris?: string[] | null;
grantTypes?: string[] | null;
responseTypes?: string[] | null;
metadata?: Record<string, any> | null;
};
export type DeleteOAuth2ClientInput = {
clientId: string;
};
export type PayloadBuilderFunction = (
user: User,
scopes: string[],
sessionHandle: string,
userContext: UserContext
) => Promise<JSONObject>;
export type UserInfoBuilderFunction = (
user: User,
accessTokenPayload: JSONObject,
scopes: string[],
tenantId: string,
userContext: UserContext
) => Promise<JSONObject>;