import type { HttpContext } from '@adonisjs/core/http'; import { Oauth1Client } from '@poppinss/oauth-client/oauth1'; import { type AllyUserContract, type Oauth1AccessToken, type Oauth1DriverConfig, type ApiRequestContract, type AllyDriverContract, type RedirectRequestContract } from '../types.ts'; import { RedirectRequest } from '../redirect_request.ts'; /** * Abstract base class for implementing OAuth1 social authentication drivers. * Extends the OAuth1 client to provide AdonisJS-specific functionality like * token management via cookies and integration with HTTP context. * * @example * ```ts * export class CustomDriver extends Oauth1Driver { * protected oauthTokenCookieName = 'custom_oauth_token' * protected oauthTokenParamName = 'oauth_token' * protected oauthTokenVerifierName = 'oauth_verifier' * protected errorParamName = 'error' * protected requestTokenUrl = 'https://provider.com/oauth/request_token' * protected authorizeUrl = 'https://provider.com/oauth/authorize' * protected accessTokenUrl = 'https://provider.com/oauth/access_token' * protected scopeParamName = '' * protected scopesSeparator = ' ' * * async user() { * // Implementation * } * } * ``` */ export declare abstract class Oauth1Driver extends Oauth1Client implements AllyDriverContract { #private; protected ctx: HttpContext; config: Oauth1DriverConfig; /** * The cookie name for storing the OAuth token. Must be unique for * your driver to avoid conflicts. For example: `twitter_oauth_token` */ protected abstract oauthTokenCookieName: string; /** * The query parameter name for the OAuth token returned after * authorization redirect. This is typically 'oauth_token'. */ protected abstract oauthTokenParamName: string; /** * The query parameter name for the OAuth verifier returned after * authorization redirect. This is typically 'oauth_verifier'. */ protected abstract oauthTokenVerifierName: string; /** * The query parameter name for error messages returned by the provider * after authorization redirect. */ protected abstract errorParamName: string; /** * The OAuth provider's endpoint for obtaining a request token. * This is the first step in the OAuth1 flow. */ protected abstract requestTokenUrl: string; /** * The OAuth provider's authorization URL where users are redirected * to grant permissions. */ protected abstract authorizeUrl: string; /** * The OAuth provider's endpoint for exchanging the request token * and verifier for an access token. */ protected abstract accessTokenUrl: string; /** * The query parameter name for defining authorization scopes. * Leave as empty string if scopes are not supported by the provider. */ protected abstract scopeParamName: string; /** * The separator character for joining multiple scopes. This is * typically a space ' '. */ protected abstract scopesSeparator: string; /** * Fetch the user details from the OAuth provider using the * authorization from the current request. * * @param callback - Optional callback to customize the API request * @returns A promise resolving to the authenticated user profile. */ abstract user(callback?: (request: ApiRequestContract) => void): Promise>; /** * Fetch user details using an existing access token and secret. * This is the OAuth1 equivalent of `userFromToken`. * * @param token - The access token * @param secret - The token secret * @param callback - Optional callback to customize the API request * @returns A promise resolving to the authenticated user profile. */ abstract userFromTokenAndSecret(token: string, secret: string, callback?: (request: ApiRequestContract) => void): Promise>; /** * Check if the current error indicates that the user denied access. * Different providers use different error codes for access denial. * * @returns `true` when the provider reported an access-denied state. */ abstract accessDenied(): boolean; /** * OAuth protocol version identifier */ version: "oauth1"; /** * Cached OAuth token and secret values read from cookies */ protected oauthTokenCookieValue?: string; protected oauthSecretCookieValue?: string; /** * The cookie name for storing the OAuth token secret. * Automatically derived from the token cookie name. * * @returns The cookie name used to persist the OAuth token secret. */ protected get oauthSecretCookieName(): string; /** * Create a new OAuth1 driver instance. * * @param ctx - The current HTTP context * @param config - OAuth1 driver configuration */ constructor(ctx: HttpContext, config: Oauth1DriverConfig); /** * Creates a URL builder instance for constructing authorization URLs * with scope support. * * @param url - The base authorization URL * @returns A redirect request builder for the given URL. */ protected urlBuilder(url: string): RedirectRequest; /** * Loads the OAuth token and secret from encrypted cookies and immediately * clears the cookies. This must be called by child classes in their * constructor to enable token verification. * * @example * ```ts * constructor(ctx: HttpContext, config: DriverConfig) { * super(ctx, config) * this.loadState() * } * ``` */ protected loadState(): void; /** * OAuth1 does not support stateless authentication due to the * three-legged authentication flow requiring token persistence. * * @returns This method never returns. */ stateless(): never; /** * Get the authorization redirect URL without performing the redirect. * Useful when you need to manually handle the redirect or use the URL * in a different context. * * @param callback - Optional callback to customize the redirect request * @returns A promise resolving to the authorization URL. * * @example * ```ts * const url = await ally.use('twitter').redirectUrl() * ``` */ redirectUrl(callback?: (request: RedirectRequestContract) => void): Promise; /** * Redirect the user to the OAuth provider's authorization page. * The request token is automatically obtained and stored in cookies. * * @param callback - Optional callback to customize the redirect request * @returns A promise that resolves after the redirect response is prepared. * * @example * ```ts * await ally.use('twitter').redirect() * ``` */ redirect(callback?: (request: RedirectRequestContract) => void): Promise; /** * Check if the OAuth token from the callback matches the token * stored in the cookie. * * @returns `true` when the callback token does not match the stored token. */ stateMisMatch(): boolean; /** * Check if an error was returned by the OAuth provider. * * @returns `true` when an error exists on the callback request. */ hasError(): boolean; /** * Get the error code or message returned by the OAuth provider. * Returns 'unknown_error' if no verifier is present and no error was specified. * * @returns The provider error value when present. */ getError(): string | null; /** * Get the OAuth verifier from the callback request. * * @returns The OAuth verifier when present. */ getCode(): string | null; /** * Check if the OAuth verifier is present in the callback request. * * @returns `true` when the callback request contains an OAuth verifier. */ hasCode(): boolean; /** * Exchange the request token and verifier for an access token. * This method validates the token and checks for errors before * making the request. * * @param callback - Optional callback to customize the token request * @returns A promise resolving to the access token payload. * * @example * ```ts * const token = await ally.use('twitter').accessToken() * ``` */ accessToken(callback?: (request: ApiRequestContract) => void): Promise; /** * Not applicable with OAuth1. Use `userFromTokenAndSecret` instead. * * @returns This method never returns. */ userFromToken(): Promise; }