@adonisjs/auth 9.0.0-9 → 9.0.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.
- package/build/chunk-3HZHOWKL.js +8 -0
- package/build/chunk-3HZHOWKL.js.map +1 -0
- package/build/chunk-CZCFTIBB.js +21 -0
- package/build/chunk-CZCFTIBB.js.map +1 -0
- package/build/chunk-OL2Z3AO5.js +246 -0
- package/build/chunk-OL2Z3AO5.js.map +1 -0
- package/build/chunk-UGHJLKDI.js +197 -0
- package/build/chunk-UGHJLKDI.js.map +1 -0
- package/build/index.d.ts +7 -6
- package/build/index.js +149 -15
- package/build/index.js.map +1 -0
- package/build/modules/access_tokens_guard/access_token.d.ts +137 -0
- package/build/modules/access_tokens_guard/crc32.d.ts +16 -0
- package/build/modules/access_tokens_guard/define_config.d.ts +17 -0
- package/build/modules/access_tokens_guard/guard.d.ts +81 -0
- package/build/modules/access_tokens_guard/main.d.ts +5 -0
- package/build/modules/access_tokens_guard/main.js +929 -0
- package/build/modules/access_tokens_guard/main.js.map +1 -0
- package/build/modules/access_tokens_guard/token_providers/db.d.ts +76 -0
- package/build/modules/access_tokens_guard/types.d.ts +208 -0
- package/build/modules/access_tokens_guard/types.js +1 -0
- package/build/modules/access_tokens_guard/types.js.map +1 -0
- package/build/modules/access_tokens_guard/user_providers/lucid.d.ts +53 -0
- package/build/modules/session_guard/define_config.d.ts +17 -0
- package/build/modules/session_guard/guard.d.ts +98 -0
- package/build/modules/session_guard/main.d.ts +5 -0
- package/build/modules/session_guard/main.js +741 -0
- package/build/modules/session_guard/main.js.map +1 -0
- package/build/modules/session_guard/remember_me_token.d.ts +88 -0
- package/build/modules/session_guard/token_providers/db.d.ts +69 -0
- package/build/modules/session_guard/types.d.ts +243 -0
- package/build/modules/session_guard/types.js +1 -0
- package/build/modules/session_guard/types.js.map +1 -0
- package/build/modules/session_guard/user_providers/lucid.d.ts +57 -0
- package/build/providers/auth_provider.d.ts +1 -1
- package/build/providers/auth_provider.js +31 -27
- package/build/providers/auth_provider.js.map +1 -0
- package/build/services/auth.d.ts +1 -1
- package/build/services/auth.js +10 -15
- package/build/services/auth.js.map +1 -0
- package/build/src/{auth/auth_manager.d.ts → auth_manager.d.ts} +8 -3
- package/build/src/authenticator.d.ts +81 -0
- package/build/src/{auth/authenticator_client.d.ts → authenticator_client.d.ts} +4 -4
- package/build/src/{auth/define_config.d.ts → define_config.d.ts} +0 -10
- package/build/src/errors.d.ts +105 -0
- package/build/src/{auth/middleware → middleware}/initialize_auth_middleware.d.ts +3 -2
- package/build/src/middleware/initialize_auth_middleware.js +17 -0
- package/build/src/middleware/initialize_auth_middleware.js.map +1 -0
- package/build/src/mixins/with_auth_finder.d.ts +156 -0
- package/build/src/{auth/plugins → plugins}/japa/api_client.d.ts +8 -8
- package/build/src/plugins/japa/api_client.js +59 -0
- package/build/src/plugins/japa/api_client.js.map +1 -0
- package/build/src/{auth/plugins → plugins}/japa/browser_client.d.ts +10 -7
- package/build/src/plugins/japa/browser_client.js +67 -0
- package/build/src/plugins/japa/browser_client.js.map +1 -0
- package/build/src/{auth/types.d.ts → types.d.ts} +31 -26
- package/build/src/types.js +1 -0
- package/build/src/types.js.map +1 -0
- package/package.json +88 -68
- package/build/configure.js +0 -47
- package/build/factories/basic_auth_guard_factory.d.ts +0 -12
- package/build/factories/basic_auth_guard_factory.js +0 -22
- package/build/factories/database_token_factory.d.ts +0 -36
- package/build/factories/database_token_factory.js +0 -54
- package/build/factories/database_user_provider.d.ts +0 -14
- package/build/factories/database_user_provider.js +0 -27
- package/build/factories/lucid_user_provider.d.ts +0 -28
- package/build/factories/lucid_user_provider.js +0 -68
- package/build/factories/main.d.ts +0 -4
- package/build/factories/main.js +0 -12
- package/build/factories/session_guard_factory.d.ts +0 -13
- package/build/factories/session_guard_factory.js +0 -24
- package/build/src/auth/auth_manager.js +0 -41
- package/build/src/auth/authenticator.d.ts +0 -63
- package/build/src/auth/authenticator.js +0 -129
- package/build/src/auth/authenticator_client.js +0 -59
- package/build/src/auth/debug.js +0 -10
- package/build/src/auth/define_config.js +0 -54
- package/build/src/auth/errors.d.ts +0 -90
- package/build/src/auth/errors.js +0 -201
- package/build/src/auth/middleware/initialize_auth_middleware.js +0 -25
- package/build/src/auth/plugins/japa/api_client.js +0 -63
- package/build/src/auth/plugins/japa/browser_client.js +0 -64
- package/build/src/auth/symbols.js +0 -17
- package/build/src/auth/types.js +0 -9
- package/build/src/auth/user_providers/main.d.ts +0 -15
- package/build/src/auth/user_providers/main.js +0 -22
- package/build/src/core/guard_user.d.ts +0 -26
- package/build/src/core/guard_user.js +0 -29
- package/build/src/core/token.d.ts +0 -89
- package/build/src/core/token.js +0 -114
- package/build/src/core/token_providers/database.d.ts +0 -77
- package/build/src/core/token_providers/database.js +0 -113
- package/build/src/core/types.d.ts +0 -178
- package/build/src/core/types.js +0 -9
- package/build/src/core/user_providers/database.d.ts +0 -78
- package/build/src/core/user_providers/database.js +0 -117
- package/build/src/core/user_providers/lucid.d.ts +0 -61
- package/build/src/core/user_providers/lucid.js +0 -122
- package/build/src/guards/basic_auth/define_config.d.ts +0 -16
- package/build/src/guards/basic_auth/define_config.js +0 -38
- package/build/src/guards/basic_auth/guard.d.ts +0 -70
- package/build/src/guards/basic_auth/guard.js +0 -190
- package/build/src/guards/basic_auth/main.d.ts +0 -2
- package/build/src/guards/basic_auth/main.js +0 -10
- package/build/src/guards/basic_auth/types.d.ts +0 -35
- package/build/src/guards/basic_auth/types.js +0 -9
- package/build/src/guards/session/define_config.d.ts +0 -23
- package/build/src/guards/session/define_config.js +0 -56
- package/build/src/guards/session/guard.d.ts +0 -123
- package/build/src/guards/session/guard.js +0 -510
- package/build/src/guards/session/main.d.ts +0 -3
- package/build/src/guards/session/main.js +0 -11
- package/build/src/guards/session/token.d.ts +0 -57
- package/build/src/guards/session/token.js +0 -58
- package/build/src/guards/session/token_providers/main.d.ts +0 -33
- package/build/src/guards/session/token_providers/main.js +0 -42
- package/build/src/guards/session/types.d.ts +0 -104
- package/build/src/guards/session/types.js +0 -9
- package/build/stubs/main.d.ts +0 -1
- package/build/stubs/main.js +0 -10
- package/build/stubs/middleware/auth_middleware.stub +0 -30
- package/build/stubs/middleware/guest_middleware.stub +0 -36
- /package/build/src/{auth/debug.d.ts → debug.d.ts} +0 -0
- /package/build/src/{auth/symbols.d.ts → symbols.d.ts} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../modules/session_guard/remember_me_token.ts","../../../modules/session_guard/guard.ts","../../../modules/session_guard/token_providers/db.ts","../../../modules/session_guard/user_providers/lucid.ts","../../../modules/session_guard/define_config.ts"],"sourcesContent":["/*\n * @adonisjs/auth\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { createHash } from 'node:crypto'\nimport string from '@adonisjs/core/helpers/string'\nimport { Secret, base64, safeEqual } from '@adonisjs/core/helpers'\n\n/**\n * Remember me token represents an opaque token that can be\n * used to automatically login a user without asking them\n * to re-login\n */\nexport class RememberMeToken {\n /**\n * Decodes a publicly shared token and return the series\n * and the token value from it.\n *\n * Returns null when unable to decode the token because of\n * invalid format or encoding.\n */\n static decode(value: string): null | { identifier: string; secret: Secret<string> } {\n /**\n * Ensure value is a string and starts with the prefix.\n */\n if (typeof value !== 'string') {\n return null\n }\n\n /**\n * Remove prefix from the rest of the token.\n */\n if (!value) {\n return null\n }\n\n const [identifier, ...tokenValue] = value.split('.')\n if (!identifier || tokenValue.length === 0) {\n return null\n }\n\n const decodedIdentifier = base64.urlDecode(identifier)\n const decodedSecret = base64.urlDecode(tokenValue.join('.'))\n if (!decodedIdentifier || !decodedSecret) {\n return null\n }\n\n return {\n identifier: decodedIdentifier,\n secret: new Secret(decodedSecret),\n }\n }\n\n /**\n * Creates a transient token that can be shared with the persistence\n * layer.\n */\n static createTransientToken(\n userId: string | number | BigInt,\n size: number,\n expiresIn: string | number\n ) {\n const expiresAt = new Date()\n expiresAt.setSeconds(expiresAt.getSeconds() + string.seconds.parse(expiresIn))\n\n return {\n userId,\n expiresAt,\n ...this.seed(size),\n }\n }\n\n /**\n * Creates a secret opaque token and its hash.\n */\n static seed(size: number) {\n const seed = string.random(size)\n const secret = new Secret(seed)\n const hash = createHash('sha256').update(secret.release()).digest('hex')\n return { secret, hash }\n }\n\n /**\n * Identifer is a unique sequence to identify the\n * token within database. It should be the\n * primary/unique key\n */\n identifier: string | number | BigInt\n\n /**\n * Reference to the user id for whom the token\n * is generated.\n */\n tokenableId: string | number | BigInt\n\n /**\n * The value is a public representation of a token. It is created\n * by combining the \"identifier\".\"secret\"\n */\n value?: Secret<string>\n\n /**\n * Hash is computed from the seed to later verify the validity\n * of seed\n */\n hash: string\n\n /**\n * Date/time when the token instance was created\n */\n createdAt: Date\n\n /**\n * Date/time when the token was updated\n */\n updatedAt: Date\n\n /**\n * Timestamp at which the token will expire\n */\n expiresAt: Date\n\n constructor(attributes: {\n identifier: string | number | BigInt\n tokenableId: string | number | BigInt\n hash: string\n createdAt: Date\n updatedAt: Date\n expiresAt: Date\n secret?: Secret<string>\n }) {\n this.identifier = attributes.identifier\n this.tokenableId = attributes.tokenableId\n this.hash = attributes.hash\n this.createdAt = attributes.createdAt\n this.updatedAt = attributes.updatedAt\n this.expiresAt = attributes.expiresAt\n\n /**\n * Compute value when secret is provided\n */\n if (attributes.secret) {\n this.value = new Secret(\n `${base64.urlEncode(String(this.identifier))}.${base64.urlEncode(\n attributes.secret.release()\n )}`\n )\n }\n }\n\n /**\n * Check if the token has been expired. Verifies\n * the \"expiresAt\" timestamp with the current\n * date.\n */\n isExpired() {\n return this.expiresAt < new Date()\n }\n\n /**\n * Verifies the value of a token against the pre-defined hash\n */\n verify(secret: Secret<string>): boolean {\n const newHash = createHash('sha256').update(secret.release()).digest('hex')\n return safeEqual(this.hash, newHash)\n }\n}\n","/*\n * @adonisjs/auth\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { Secret } from '@adonisjs/core/helpers'\nimport type { HttpContext } from '@adonisjs/core/http'\nimport { RuntimeException } from '@adonisjs/core/exceptions'\nimport type { EmitterLike } from '@adonisjs/core/types/events'\n\nimport { RememberMeToken } from './remember_me_token.js'\nimport { E_UNAUTHORIZED_ACCESS } from '../../src/errors.js'\nimport type { AuthClientResponse, GuardContract } from '../../src/types.js'\nimport { GUARD_KNOWN_EVENTS, PROVIDER_REAL_USER } from '../../src/symbols.js'\nimport type {\n SessionGuardEvents,\n SessionGuardOptions,\n SessionUserProviderContract,\n SessionWithTokensUserProviderContract,\n} from './types.js'\n\n/**\n * Session guard uses AdonisJS session store to track logged-in\n * user information.\n */\nexport class SessionGuard<\n UseRememberTokens extends boolean,\n UserProvider extends UseRememberTokens extends true\n ? SessionWithTokensUserProviderContract<unknown>\n : SessionUserProviderContract<unknown>,\n> implements GuardContract<UserProvider[typeof PROVIDER_REAL_USER]>\n{\n /**\n * Events emitted by the guard\n */\n declare [GUARD_KNOWN_EVENTS]: SessionGuardEvents<UserProvider[typeof PROVIDER_REAL_USER]>\n\n /**\n * A unique name for the guard.\n */\n #name: string\n\n /**\n * Reference to the current HTTP context\n */\n #ctx: HttpContext\n\n /**\n * Options accepted by the session guard\n */\n #options: Required<SessionGuardOptions<UseRememberTokens>>\n\n /**\n * Provider to lookup user details\n */\n #userProvider: UserProvider\n\n /**\n * Emitter to emit events\n */\n #emitter: EmitterLike<SessionGuardEvents<UserProvider[typeof PROVIDER_REAL_USER]>>\n\n /**\n * Driver name of the guard\n */\n driverName: 'session' = 'session'\n\n /**\n * Whether or not the authentication has been attempted\n * during the current request.\n */\n authenticationAttempted = false\n\n /**\n * A boolean to know if a remember me token was used in attempt\n * to login a user.\n */\n attemptedViaRemember = false\n\n /**\n * A boolean to know if the current request has\n * been authenticated\n */\n isAuthenticated = false\n\n /**\n * A boolean to know if the current request is authenticated\n * using the \"rememember_me\" token.\n */\n viaRemember = false\n\n /**\n * Find if the user has been logged out during\n * the current request\n */\n isLoggedOut = false\n\n /**\n * Reference to an instance of the authenticated user.\n * The value only exists after calling one of the\n * following methods.\n *\n * - authenticate\n * - check\n *\n * You can use the \"getUserOrFail\" method to throw an exception if\n * the request is not authenticated.\n */\n user?: UserProvider[typeof PROVIDER_REAL_USER]\n\n /**\n * The key used to store the logged-in user id inside\n * session\n */\n get sessionKeyName() {\n return `auth_${this.#name}`\n }\n\n /**\n * The key used to store the remember me token cookie\n */\n get rememberMeKeyName() {\n return `remember_${this.#name}`\n }\n\n constructor(\n name: string,\n ctx: HttpContext,\n options: SessionGuardOptions<UseRememberTokens>,\n emitter: EmitterLike<SessionGuardEvents<UserProvider[typeof PROVIDER_REAL_USER]>>,\n userProvider: UserProvider\n ) {\n this.#name = name\n this.#ctx = ctx\n this.#options = { rememberMeTokensAge: '2 years', ...options }\n this.#emitter = emitter\n this.#userProvider = userProvider\n }\n\n /**\n * Returns the session instance for the given request,\n * ensuring the property exists\n */\n #getSession() {\n if (!('session' in this.#ctx)) {\n throw new RuntimeException(\n 'Cannot authenticate user. Install and configure \"@adonisjs/session\" package'\n )\n }\n\n return this.#ctx.session\n }\n\n /**\n * Emits authentication failure, updates the local state,\n * and returns an exception to end the authentication\n * cycle.\n */\n #authenticationFailed(sessionId: string) {\n this.isAuthenticated = false\n this.viaRemember = false\n this.user = undefined\n this.isLoggedOut = false\n\n const error = new E_UNAUTHORIZED_ACCESS('Invalid or expired user session', {\n guardDriverName: this.driverName,\n })\n\n this.#emitter.emit('session_auth:authentication_failed', {\n ctx: this.#ctx,\n guardName: this.#name,\n error,\n sessionId,\n })\n\n return error\n }\n\n /**\n * Emits the authentication succeeded event and updates\n * the local state to reflect successful authentication\n */\n #authenticationSucceeded(\n sessionId: string,\n user: UserProvider[typeof PROVIDER_REAL_USER],\n rememberMeToken?: RememberMeToken\n ) {\n this.isAuthenticated = true\n this.viaRemember = !!rememberMeToken\n this.user = user\n this.isLoggedOut = false\n\n this.#emitter.emit('session_auth:authentication_succeeded', {\n ctx: this.#ctx,\n guardName: this.#name,\n sessionId,\n user,\n rememberMeToken,\n })\n }\n\n /**\n * Emits the login succeeded event and updates the login\n * state\n */\n #loginSucceeded(\n sessionId: string,\n user: UserProvider[typeof PROVIDER_REAL_USER],\n rememberMeToken?: RememberMeToken\n ) {\n this.user = user\n this.isLoggedOut = false\n\n this.#emitter.emit('session_auth:login_succeeded', {\n ctx: this.#ctx,\n guardName: this.#name,\n sessionId,\n user,\n rememberMeToken,\n })\n }\n\n /**\n * Creates session for a given user by their user id.\n */\n #createSessionForUser(userId: string | number | BigInt) {\n const session = this.#getSession()\n session.put(this.sessionKeyName, userId)\n session.regenerate()\n }\n\n /**\n * Creates the remember me cookie\n */\n #createRememberMeCookie(value: Secret<string>) {\n this.#ctx.response.encryptedCookie(this.rememberMeKeyName, value.release(), {\n maxAge: this.#options.rememberMeTokensAge,\n httpOnly: true,\n })\n }\n\n /**\n * Authenticates the user using its id read from the session\n * store.\n *\n * - We check the user exists in the db\n * - If not, throw exception.\n * - Otherwise, update local state to mark the user as logged-in\n */\n async #authenticateViaId(userId: string | number | BigInt, sessionId: string) {\n const providerUser = await this.#userProvider.findById(userId)\n if (!providerUser) {\n throw this.#authenticationFailed(sessionId)\n }\n\n this.#authenticationSucceeded(sessionId, providerUser.getOriginal())\n return this.user!\n }\n\n /**\n * Authenticates user from the remember me cookie. Creates a fresh\n * session for them and recycles the remember me token as well.\n */\n async #authenticateViaRememberCookie(rememberMeCookie: string, sessionId: string) {\n /**\n * This method is only invoked when \"options.useRememberTokens\" is set to\n * true and hence the user provider will have methods to manage tokens\n */\n const userProvider = this.#userProvider as SessionWithTokensUserProviderContract<\n UserProvider[typeof PROVIDER_REAL_USER]\n >\n\n /**\n * Verify the token using the user provider.\n */\n const token = await userProvider.verifyRememberToken(new Secret(rememberMeCookie))\n if (!token) {\n throw this.#authenticationFailed(sessionId)\n }\n\n /**\n * Check if a user for the token exists. Otherwise abort\n * authentication\n */\n const providerUser = await userProvider.findById(token.tokenableId)\n if (!providerUser) {\n throw this.#authenticationFailed(sessionId)\n }\n\n /**\n * Recycle remember token and the remember me cookie\n */\n const recycledToken = await userProvider.recycleRememberToken(\n providerUser.getOriginal(),\n token.identifier,\n this.#options.rememberMeTokensAge\n )\n\n /**\n * Persist remember token inside the cookie\n */\n this.#createRememberMeCookie(recycledToken.value!)\n\n /**\n * Create session\n */\n this.#createSessionForUser(providerUser.getId())\n\n /**\n * Emit event and update local state\n */\n this.#authenticationSucceeded(sessionId, providerUser.getOriginal(), token)\n\n return this.user!\n }\n\n /**\n * Returns an instance of the authenticated user. Or throws\n * an exception if the request is not authenticated.\n */\n getUserOrFail(): UserProvider[typeof PROVIDER_REAL_USER] {\n if (!this.user) {\n throw new E_UNAUTHORIZED_ACCESS('Invalid or expired user session', {\n guardDriverName: this.driverName,\n })\n }\n\n return this.user\n }\n\n /**\n * Login user using sessions. Optionally, you can also create\n * a remember me token to automatically login user when their\n * session expires.\n */\n async login(user: UserProvider[typeof PROVIDER_REAL_USER], remember: boolean = false) {\n const session = this.#getSession()\n const providerUser = await this.#userProvider.createUserForGuard(user)\n\n this.#emitter.emit('session_auth:login_attempted', {\n ctx: this.#ctx,\n user,\n guardName: this.#name,\n })\n\n /**\n * Create remember me token and persist it with the provider\n * when remember me token is true.\n */\n let token: RememberMeToken | undefined\n if (remember) {\n if (!this.#options.useRememberMeTokens) {\n throw new RuntimeException('Cannot use \"rememberMe\" feature. It has been disabled')\n }\n\n /**\n * Here we assume the userProvider has implemented APIs to manage remember\n * me tokens, since the \"useRememberMeTokens\" flag is enabled.\n */\n const userProvider = this.#userProvider as SessionWithTokensUserProviderContract<\n UserProvider[typeof PROVIDER_REAL_USER]\n >\n\n token = await userProvider.createRememberToken(\n providerUser.getOriginal(),\n this.#options.rememberMeTokensAge\n )\n }\n\n /**\n * Persist remember token inside the cookie (if exists)\n * Otherwise remove the cookie\n */\n if (token) {\n this.#createRememberMeCookie(token.value!)\n } else {\n this.#ctx.response.clearCookie(this.rememberMeKeyName)\n }\n\n /**\n * Create session\n */\n this.#createSessionForUser(providerUser.getId())\n\n /**\n * Mark user as logged-in\n */\n this.#loginSucceeded(session.sessionId, providerUser.getOriginal(), token)\n }\n\n /**\n * Logout a user by removing its state from the session\n * store and delete the remember me cookie (if any).\n */\n async logout() {\n const session = this.#getSession()\n const rememberMeCookie = this.#ctx.request.encryptedCookie(this.rememberMeKeyName)\n\n /**\n * Clear client side state\n */\n session.forget(this.sessionKeyName)\n this.#ctx.response.clearCookie(this.rememberMeKeyName)\n\n /**\n * Delete remember me token when\n *\n * - Tokens are enabled\n * - A cookie exists\n * - And we know about the user already\n */\n if (this.user && rememberMeCookie && this.#options.useRememberMeTokens) {\n /**\n * Here we assume the userProvider has implemented APIs to manage remember\n * me tokens, since the \"useRememberMeTokens\" flag is enabled.\n */\n const userProvider = this.#userProvider as SessionWithTokensUserProviderContract<\n UserProvider[typeof PROVIDER_REAL_USER]\n >\n\n const token = await userProvider.verifyRememberToken(new Secret(rememberMeCookie))\n if (token) {\n await userProvider.deleteRemeberToken(this.user, token.identifier)\n }\n }\n\n /**\n * Update local state\n */\n this.user = undefined\n this.viaRemember = false\n this.isAuthenticated = false\n this.isLoggedOut = true\n\n /**\n * Notify the user has been logged out\n */\n this.#emitter.emit('session_auth:logged_out', {\n ctx: this.#ctx,\n guardName: this.#name,\n user: this.user || null,\n sessionId: session.sessionId,\n })\n }\n\n /**\n * Authenticate the current HTTP request by verifying the bearer\n * token or fails with an exception\n */\n async authenticate(): Promise<UserProvider[typeof PROVIDER_REAL_USER]> {\n /**\n * Return early when authentication has already been\n * attempted\n */\n if (this.authenticationAttempted) {\n return this.getUserOrFail()\n }\n\n /**\n * Notify we begin to attempt the authentication\n */\n this.authenticationAttempted = true\n const session = this.#getSession()\n\n this.#emitter.emit('session_auth:authentication_attempted', {\n ctx: this.#ctx,\n sessionId: session.sessionId,\n guardName: this.#name,\n })\n\n /**\n * Check if there is a user id inside the session store.\n * If yes, fetch the user from the persistent storage\n * and mark them as logged-in\n */\n const authUserId = session.get(this.sessionKeyName)\n if (authUserId) {\n return this.#authenticateViaId(authUserId, session.sessionId)\n }\n\n /**\n * If user provider supports remember me tokens and the remember me\n * cookie exists, then attempt to login + authenticate via\n * the remember me token.\n */\n const rememberMeCookie = this.#ctx.request.encryptedCookie(this.rememberMeKeyName)\n if (rememberMeCookie && this.#options.useRememberMeTokens) {\n this.attemptedViaRemember = true\n return this.#authenticateViaRememberCookie(rememberMeCookie, session.sessionId)\n }\n\n /**\n * Otherwise throw an exception\n */\n throw this.#authenticationFailed(session.sessionId)\n }\n\n /**\n * Silently check if the user is authenticated or not, without\n * throwing any exceptions\n */\n async check(): Promise<boolean> {\n try {\n await this.authenticate()\n return true\n } catch (error) {\n if (error instanceof E_UNAUTHORIZED_ACCESS) {\n return false\n }\n\n throw error\n }\n }\n\n /**\n * Returns the session info for the clients to send during\n * an HTTP request to mark the user as logged-in.\n */\n async authenticateAsClient(\n user: UserProvider[typeof PROVIDER_REAL_USER]\n ): Promise<AuthClientResponse> {\n const providerUser = await this.#userProvider.createUserForGuard(user)\n const userId = providerUser.getId()\n\n return {\n session: {\n [this.sessionKeyName]: userId,\n },\n }\n }\n}\n","/*\n * @adonisjs/auth\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport type { Secret } from '@adonisjs/core/helpers'\nimport { RuntimeException } from '@adonisjs/core/exceptions'\nimport type { LucidModel } from '@adonisjs/lucid/types/model'\n\nimport { RememberMeToken } from '../remember_me_token.js'\nimport type {\n RememberMeTokenDbColumns,\n RememberMeTokensProviderContract,\n DbRememberMeTokensProviderOptions,\n} from '../types.js'\n\n/**\n * DbRememberMeTokensProvider uses lucid database service to fetch and\n * persist tokens for a given user.\n *\n * The user must be an instance of the associated user model.\n */\nexport class DbRememberMeTokensProvider<TokenableModel extends LucidModel>\n implements RememberMeTokensProviderContract<TokenableModel>\n{\n /**\n * Create tokens provider instance for a given Lucid model\n */\n static forModel<TokenableModel extends LucidModel>(\n model: DbRememberMeTokensProviderOptions<TokenableModel>['tokenableModel'],\n options?: Omit<DbRememberMeTokensProviderOptions<TokenableModel>, 'tokenableModel'>\n ) {\n return new DbRememberMeTokensProvider<TokenableModel>({\n tokenableModel: model,\n ...(options || {}),\n })\n }\n\n /**\n * Database table to use for querying remember me tokens\n */\n protected table: string\n\n /**\n * The length for the token secret. A secret is a cryptographically\n * secure random string.\n */\n protected tokenSecretLength: number\n\n constructor(protected options: DbRememberMeTokensProviderOptions<TokenableModel>) {\n this.table = options.table || 'remember_me_tokens'\n this.tokenSecretLength = options.tokenSecretLength || 40\n }\n\n /**\n * Ensure the provided user is an instance of the user model and\n * has a primary key\n */\n #ensureIsPersisted(user: InstanceType<TokenableModel>) {\n const model = this.options.tokenableModel\n if (user instanceof model === false) {\n throw new RuntimeException(\n `Invalid user object. It must be an instance of the \"${model.name}\" model`\n )\n }\n\n if (!user.$primaryKeyValue) {\n throw new RuntimeException(\n `Cannot use \"${model.name}\" model for managing remember me tokens. The value of column \"${model.primaryKey}\" is undefined or null`\n )\n }\n }\n\n /**\n * Maps a database row to an instance token instance\n */\n protected dbRowToRememberMeToken(dbRow: RememberMeTokenDbColumns): RememberMeToken {\n return new RememberMeToken({\n identifier: dbRow.id,\n tokenableId: dbRow.tokenable_id,\n hash: dbRow.hash,\n createdAt:\n typeof dbRow.created_at === 'number' ? new Date(dbRow.created_at) : dbRow.created_at,\n updatedAt:\n typeof dbRow.updated_at === 'number' ? new Date(dbRow.updated_at) : dbRow.updated_at,\n expiresAt:\n typeof dbRow.expires_at === 'number' ? new Date(dbRow.expires_at) : dbRow.expires_at,\n })\n }\n\n /**\n * Returns a query client instance from the parent model\n */\n protected async getDb() {\n const model = this.options.tokenableModel\n return model.$adapter.query(model).client\n }\n\n /**\n * Create a token for a user\n */\n async create(user: InstanceType<TokenableModel>, expiresIn: string | number) {\n this.#ensureIsPersisted(user)\n\n const queryClient = await this.getDb()\n\n /**\n * Creating a transient token. Transient token abstracts\n * the logic of creating a random secure secret and its\n * hash\n */\n const transientToken = RememberMeToken.createTransientToken(\n user.$primaryKeyValue!,\n this.tokenSecretLength,\n expiresIn\n )\n\n /**\n * Row to insert inside the database. We expect exactly these\n * columns to exist.\n */\n const dbRow: Omit<RememberMeTokenDbColumns, 'id'> = {\n tokenable_id: transientToken.userId,\n hash: transientToken.hash,\n created_at: new Date(),\n updated_at: new Date(),\n expires_at: transientToken.expiresAt,\n }\n\n /**\n * Insert data to the database.\n */\n const [id] = await queryClient.table(this.table).insert(dbRow)\n\n /**\n * Convert db row to a remember token\n */\n return new RememberMeToken({\n identifier: id,\n tokenableId: dbRow.tokenable_id,\n secret: transientToken.secret,\n hash: dbRow.hash,\n createdAt: dbRow.created_at,\n updatedAt: dbRow.updated_at,\n expiresAt: dbRow.expires_at,\n })\n }\n\n /**\n * Find a token for a user by the token id\n */\n async find(user: InstanceType<TokenableModel>, identifier: string | number | BigInt) {\n this.#ensureIsPersisted(user)\n\n const queryClient = await this.getDb()\n const dbRow = await queryClient\n .query<RememberMeTokenDbColumns>()\n .from(this.table)\n .where({ id: identifier, tokenable_id: user.$primaryKeyValue })\n .limit(1)\n .first()\n\n if (!dbRow) {\n return null\n }\n\n return this.dbRowToRememberMeToken(dbRow)\n }\n\n /**\n * Delete a token by its id\n */\n async delete(\n user: InstanceType<TokenableModel>,\n identifier: string | number | BigInt\n ): Promise<number> {\n this.#ensureIsPersisted(user)\n\n const queryClient = await this.getDb()\n const affectedRows = await queryClient\n .query<number>()\n .from(this.table)\n .where({ id: identifier, tokenable_id: user.$primaryKeyValue })\n .del()\n .exec()\n\n return affectedRows as unknown as number\n }\n\n /**\n * Returns all the tokens a given user\n */\n async all(user: InstanceType<TokenableModel>) {\n this.#ensureIsPersisted(user)\n\n const queryClient = await this.getDb()\n const dbRows = await queryClient\n .query<RememberMeTokenDbColumns>()\n .from(this.table)\n .where({ tokenable_id: user.$primaryKeyValue })\n .orderBy('id', 'desc')\n .exec()\n\n return dbRows.map((dbRow) => {\n return this.dbRowToRememberMeToken(dbRow)\n })\n }\n\n /**\n * Verifies a publicly shared remember me token and returns an\n * RememberMeToken for it.\n *\n * Returns null when unable to verify the token or find it\n * inside the storage\n */\n async verify(tokenValue: Secret<string>) {\n const decodedToken = RememberMeToken.decode(tokenValue.release())\n if (!decodedToken) {\n return null\n }\n\n const db = await this.getDb()\n const dbRow = await db\n .query<RememberMeTokenDbColumns>()\n .from(this.table)\n .where({ id: decodedToken.identifier })\n .limit(1)\n .first()\n\n if (!dbRow) {\n return null\n }\n\n /**\n * Convert to remember me token instance\n */\n const rememberMeToken = this.dbRowToRememberMeToken(dbRow)\n\n /**\n * Ensure the token secret matches the token hash\n */\n if (!rememberMeToken.verify(decodedToken.secret) || rememberMeToken.isExpired()) {\n return null\n }\n\n return rememberMeToken\n }\n\n /**\n * Recycles a remember me token by deleting the old one and\n * creates a new one.\n *\n * Ideally, the recycle should update the existing token, but we\n * skip that for now and come back to it later and handle race\n * conditions as well.\n */\n async recycle(\n user: InstanceType<TokenableModel>,\n identifier: string | number | BigInt,\n expiresIn: string | number\n ): Promise<RememberMeToken> {\n await this.delete(user, identifier)\n return this.create(user, expiresIn)\n }\n}\n","/*\n * @adonisjs/auth\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { Secret } from '@adonisjs/core/helpers'\nimport { RuntimeException } from '@adonisjs/core/exceptions'\n\nimport { RememberMeToken } from '../remember_me_token.js'\nimport { PROVIDER_REAL_USER } from '../../../src/symbols.js'\nimport type {\n SessionGuardUser,\n LucidAuthenticatable,\n SessionLucidUserProviderOptions,\n SessionUserProviderContract,\n} from '../types.js'\n\n/**\n * Uses a lucid model to verify access tokens and find a user during\n * authentication\n */\nexport class SessionLucidUserProvider<UserModel extends LucidAuthenticatable>\n implements SessionUserProviderContract<InstanceType<UserModel>>\n{\n declare [PROVIDER_REAL_USER]: InstanceType<UserModel>\n\n /**\n * Reference to the lazily imported model\n */\n protected model?: UserModel\n\n constructor(\n /**\n * Lucid provider options\n */\n protected options: SessionLucidUserProviderOptions<UserModel>\n ) {}\n\n /**\n * Imports the model from the provider, returns and caches it\n * for further operations.\n */\n protected async getModel() {\n if (this.model) {\n return this.model\n }\n\n const importedModel = await this.options.model()\n this.model = importedModel.default\n return this.model\n }\n\n /**\n * Returns the tokens provider associated with the user model\n */\n protected async getTokensProvider() {\n const model = await this.getModel()\n\n if (!model.rememberMeTokens) {\n throw new RuntimeException(\n `Cannot use \"${model.name}\" model for verifying remember me tokens. Make sure to assign a token provider to the model.`\n )\n }\n\n return model.rememberMeTokens\n }\n\n /**\n * Creates an adapter user for the guard\n */\n async createUserForGuard(\n user: InstanceType<UserModel>\n ): Promise<SessionGuardUser<InstanceType<UserModel>>> {\n const model = await this.getModel()\n if (user instanceof model === false) {\n throw new RuntimeException(\n `Invalid user object. It must be an instance of the \"${model.name}\" model`\n )\n }\n\n return {\n getId() {\n /**\n * Ensure user has a primary key\n */\n if (!user.$primaryKeyValue) {\n throw new RuntimeException(\n `Cannot use \"${model.name}\" model for authentication. The value of column \"${model.primaryKey}\" is undefined or null`\n )\n }\n\n return user.$primaryKeyValue\n },\n getOriginal() {\n return user\n },\n }\n }\n\n /**\n * Finds a user by their primary key value\n */\n async findById(\n identifier: string | number | BigInt\n ): Promise<SessionGuardUser<InstanceType<UserModel>> | null> {\n const model = await this.getModel()\n const user = await model.find(identifier)\n\n if (!user) {\n return null\n }\n\n return this.createUserForGuard(user)\n }\n\n /**\n * Creates a remember token for a given user\n */\n async createRememberToken(\n user: InstanceType<UserModel>,\n expiresIn: string | number\n ): Promise<RememberMeToken> {\n const tokensProvider = await this.getTokensProvider()\n return tokensProvider.create(user, expiresIn)\n }\n\n /**\n * Verify a token by its publicly shared value\n */\n async verifyRememberToken(tokenValue: Secret<string>): Promise<RememberMeToken | null> {\n const tokensProvider = await this.getTokensProvider()\n return tokensProvider.verify(tokenValue)\n }\n\n /**\n * Delete a token for a user by the token identifier\n */\n async deleteRemeberToken(\n user: InstanceType<UserModel>,\n identifier: string | number | BigInt\n ): Promise<number> {\n const tokensProvider = await this.getTokensProvider()\n return tokensProvider.delete(user, identifier)\n }\n\n /**\n * Recycle a token for a user by the token identifier\n */\n async recycleRememberToken(\n user: InstanceType<UserModel>,\n identifier: string | number | BigInt,\n expiresIn: string | number\n ) {\n const tokensProvider = await this.getTokensProvider()\n return tokensProvider.recycle(user, identifier, expiresIn)\n }\n}\n","/*\n * @adonisjs/auth\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport type { HttpContext } from '@adonisjs/core/http'\nimport type { ConfigProvider } from '@adonisjs/core/types'\n\nimport { SessionGuard } from './guard.js'\nimport type { GuardConfigProvider } from '../../src/types.js'\nimport { SessionLucidUserProvider } from './user_providers/lucid.js'\nimport type {\n SessionGuardOptions,\n LucidAuthenticatable,\n SessionUserProviderContract,\n SessionLucidUserProviderOptions,\n SessionWithTokensUserProviderContract,\n} from './types.js'\n\n/**\n * Configures session tokens guard for authentication\n */\nexport function sessionGuard<\n UseRememberTokens extends boolean,\n UserProvider extends UseRememberTokens extends true\n ? SessionWithTokensUserProviderContract<unknown>\n : SessionUserProviderContract<unknown>,\n>(\n config: {\n provider: UserProvider | ConfigProvider<UserProvider>\n } & SessionGuardOptions<UseRememberTokens>\n): GuardConfigProvider<(ctx: HttpContext) => SessionGuard<UseRememberTokens, UserProvider>> {\n return {\n async resolver(name, app) {\n const emitter = await app.container.make('emitter')\n const provider =\n 'resolver' in config.provider ? await config.provider.resolver(app) : config.provider\n return (ctx) => new SessionGuard(name, ctx, config, emitter as any, provider)\n },\n }\n}\n\n/**\n * Configures user provider that uses Lucid models to authenticate\n * users using sessions\n */\nexport function sessionUserProvider<Model extends LucidAuthenticatable>(\n config: SessionLucidUserProviderOptions<Model>\n): SessionLucidUserProvider<Model> {\n return new SessionLucidUserProvider(config)\n}\n"],"mappings":"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","names":["Secret","Secret","RuntimeException","RuntimeException","RuntimeException"]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Secret } from '@adonisjs/core/helpers';
|
|
2
|
+
/**
|
|
3
|
+
* Remember me token represents an opaque token that can be
|
|
4
|
+
* used to automatically login a user without asking them
|
|
5
|
+
* to re-login
|
|
6
|
+
*/
|
|
7
|
+
export declare class RememberMeToken {
|
|
8
|
+
/**
|
|
9
|
+
* Decodes a publicly shared token and return the series
|
|
10
|
+
* and the token value from it.
|
|
11
|
+
*
|
|
12
|
+
* Returns null when unable to decode the token because of
|
|
13
|
+
* invalid format or encoding.
|
|
14
|
+
*/
|
|
15
|
+
static decode(value: string): null | {
|
|
16
|
+
identifier: string;
|
|
17
|
+
secret: Secret<string>;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Creates a transient token that can be shared with the persistence
|
|
21
|
+
* layer.
|
|
22
|
+
*/
|
|
23
|
+
static createTransientToken(userId: string | number | BigInt, size: number, expiresIn: string | number): {
|
|
24
|
+
secret: Secret<string>;
|
|
25
|
+
hash: string;
|
|
26
|
+
userId: string | number | BigInt;
|
|
27
|
+
expiresAt: Date;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Creates a secret opaque token and its hash.
|
|
31
|
+
*/
|
|
32
|
+
static seed(size: number): {
|
|
33
|
+
secret: Secret<string>;
|
|
34
|
+
hash: string;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Identifer is a unique sequence to identify the
|
|
38
|
+
* token within database. It should be the
|
|
39
|
+
* primary/unique key
|
|
40
|
+
*/
|
|
41
|
+
identifier: string | number | BigInt;
|
|
42
|
+
/**
|
|
43
|
+
* Reference to the user id for whom the token
|
|
44
|
+
* is generated.
|
|
45
|
+
*/
|
|
46
|
+
tokenableId: string | number | BigInt;
|
|
47
|
+
/**
|
|
48
|
+
* The value is a public representation of a token. It is created
|
|
49
|
+
* by combining the "identifier"."secret"
|
|
50
|
+
*/
|
|
51
|
+
value?: Secret<string>;
|
|
52
|
+
/**
|
|
53
|
+
* Hash is computed from the seed to later verify the validity
|
|
54
|
+
* of seed
|
|
55
|
+
*/
|
|
56
|
+
hash: string;
|
|
57
|
+
/**
|
|
58
|
+
* Date/time when the token instance was created
|
|
59
|
+
*/
|
|
60
|
+
createdAt: Date;
|
|
61
|
+
/**
|
|
62
|
+
* Date/time when the token was updated
|
|
63
|
+
*/
|
|
64
|
+
updatedAt: Date;
|
|
65
|
+
/**
|
|
66
|
+
* Timestamp at which the token will expire
|
|
67
|
+
*/
|
|
68
|
+
expiresAt: Date;
|
|
69
|
+
constructor(attributes: {
|
|
70
|
+
identifier: string | number | BigInt;
|
|
71
|
+
tokenableId: string | number | BigInt;
|
|
72
|
+
hash: string;
|
|
73
|
+
createdAt: Date;
|
|
74
|
+
updatedAt: Date;
|
|
75
|
+
expiresAt: Date;
|
|
76
|
+
secret?: Secret<string>;
|
|
77
|
+
});
|
|
78
|
+
/**
|
|
79
|
+
* Check if the token has been expired. Verifies
|
|
80
|
+
* the "expiresAt" timestamp with the current
|
|
81
|
+
* date.
|
|
82
|
+
*/
|
|
83
|
+
isExpired(): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* Verifies the value of a token against the pre-defined hash
|
|
86
|
+
*/
|
|
87
|
+
verify(secret: Secret<string>): boolean;
|
|
88
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Secret } from '@adonisjs/core/helpers';
|
|
2
|
+
import type { LucidModel } from '@adonisjs/lucid/types/model';
|
|
3
|
+
import { RememberMeToken } from '../remember_me_token.js';
|
|
4
|
+
import type { RememberMeTokenDbColumns, RememberMeTokensProviderContract, DbRememberMeTokensProviderOptions } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* DbRememberMeTokensProvider uses lucid database service to fetch and
|
|
7
|
+
* persist tokens for a given user.
|
|
8
|
+
*
|
|
9
|
+
* The user must be an instance of the associated user model.
|
|
10
|
+
*/
|
|
11
|
+
export declare class DbRememberMeTokensProvider<TokenableModel extends LucidModel> implements RememberMeTokensProviderContract<TokenableModel> {
|
|
12
|
+
#private;
|
|
13
|
+
protected options: DbRememberMeTokensProviderOptions<TokenableModel>;
|
|
14
|
+
/**
|
|
15
|
+
* Create tokens provider instance for a given Lucid model
|
|
16
|
+
*/
|
|
17
|
+
static forModel<TokenableModel extends LucidModel>(model: DbRememberMeTokensProviderOptions<TokenableModel>['tokenableModel'], options?: Omit<DbRememberMeTokensProviderOptions<TokenableModel>, 'tokenableModel'>): DbRememberMeTokensProvider<TokenableModel>;
|
|
18
|
+
/**
|
|
19
|
+
* Database table to use for querying remember me tokens
|
|
20
|
+
*/
|
|
21
|
+
protected table: string;
|
|
22
|
+
/**
|
|
23
|
+
* The length for the token secret. A secret is a cryptographically
|
|
24
|
+
* secure random string.
|
|
25
|
+
*/
|
|
26
|
+
protected tokenSecretLength: number;
|
|
27
|
+
constructor(options: DbRememberMeTokensProviderOptions<TokenableModel>);
|
|
28
|
+
/**
|
|
29
|
+
* Maps a database row to an instance token instance
|
|
30
|
+
*/
|
|
31
|
+
protected dbRowToRememberMeToken(dbRow: RememberMeTokenDbColumns): RememberMeToken;
|
|
32
|
+
/**
|
|
33
|
+
* Returns a query client instance from the parent model
|
|
34
|
+
*/
|
|
35
|
+
protected getDb(): Promise<import("@adonisjs/lucid/types/database").QueryClientContract>;
|
|
36
|
+
/**
|
|
37
|
+
* Create a token for a user
|
|
38
|
+
*/
|
|
39
|
+
create(user: InstanceType<TokenableModel>, expiresIn: string | number): Promise<RememberMeToken>;
|
|
40
|
+
/**
|
|
41
|
+
* Find a token for a user by the token id
|
|
42
|
+
*/
|
|
43
|
+
find(user: InstanceType<TokenableModel>, identifier: string | number | BigInt): Promise<RememberMeToken | null>;
|
|
44
|
+
/**
|
|
45
|
+
* Delete a token by its id
|
|
46
|
+
*/
|
|
47
|
+
delete(user: InstanceType<TokenableModel>, identifier: string | number | BigInt): Promise<number>;
|
|
48
|
+
/**
|
|
49
|
+
* Returns all the tokens a given user
|
|
50
|
+
*/
|
|
51
|
+
all(user: InstanceType<TokenableModel>): Promise<RememberMeToken[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Verifies a publicly shared remember me token and returns an
|
|
54
|
+
* RememberMeToken for it.
|
|
55
|
+
*
|
|
56
|
+
* Returns null when unable to verify the token or find it
|
|
57
|
+
* inside the storage
|
|
58
|
+
*/
|
|
59
|
+
verify(tokenValue: Secret<string>): Promise<RememberMeToken | null>;
|
|
60
|
+
/**
|
|
61
|
+
* Recycles a remember me token by deleting the old one and
|
|
62
|
+
* creates a new one.
|
|
63
|
+
*
|
|
64
|
+
* Ideally, the recycle should update the existing token, but we
|
|
65
|
+
* skip that for now and come back to it later and handle race
|
|
66
|
+
* conditions as well.
|
|
67
|
+
*/
|
|
68
|
+
recycle(user: InstanceType<TokenableModel>, identifier: string | number | BigInt, expiresIn: string | number): Promise<RememberMeToken>;
|
|
69
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import type { Secret } from '@adonisjs/core/helpers';
|
|
2
|
+
import type { HttpContext } from '@adonisjs/core/http';
|
|
3
|
+
import type { Exception } from '@adonisjs/core/exceptions';
|
|
4
|
+
import type { LucidModel } from '@adonisjs/lucid/types/model';
|
|
5
|
+
import { PROVIDER_REAL_USER } from '../../src/symbols.js';
|
|
6
|
+
import type { RememberMeToken } from './remember_me_token.js';
|
|
7
|
+
/**
|
|
8
|
+
* Options accepted by the tokens provider that uses lucid
|
|
9
|
+
* database service to fetch and persist tokens.
|
|
10
|
+
*/
|
|
11
|
+
export type DbRememberMeTokensProviderOptions<TokenableModel extends LucidModel> = {
|
|
12
|
+
/**
|
|
13
|
+
* The user model for which to generate tokens. Note, the model
|
|
14
|
+
* is not used for tokens, but is used to associate a user
|
|
15
|
+
* with the token
|
|
16
|
+
*/
|
|
17
|
+
tokenableModel: TokenableModel;
|
|
18
|
+
/**
|
|
19
|
+
* Database table to use for querying tokens.
|
|
20
|
+
*
|
|
21
|
+
* Defaults to "remember_me_tokens"
|
|
22
|
+
*/
|
|
23
|
+
table?: string;
|
|
24
|
+
/**
|
|
25
|
+
* The length for the token secret. A secret is a cryptographically
|
|
26
|
+
* secure random string.
|
|
27
|
+
*
|
|
28
|
+
* Defaults to 40
|
|
29
|
+
*/
|
|
30
|
+
tokenSecretLength?: number;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Remember me token providers are used verify a remember me
|
|
34
|
+
* token during authentication
|
|
35
|
+
*/
|
|
36
|
+
export interface RememberMeTokensProviderContract<Tokenable extends LucidModel> {
|
|
37
|
+
/**
|
|
38
|
+
* Create a token for a given user
|
|
39
|
+
*/
|
|
40
|
+
create(user: InstanceType<Tokenable>, expiresIn: string | number): Promise<RememberMeToken>;
|
|
41
|
+
/**
|
|
42
|
+
* Verifies the remember me token shared as cookie and returns an
|
|
43
|
+
* instance of remember me token
|
|
44
|
+
*/
|
|
45
|
+
verify(tokenValue: Secret<string>): Promise<RememberMeToken | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Delete token for a user by the token identifier.
|
|
48
|
+
*/
|
|
49
|
+
delete(user: InstanceType<Tokenable>, identifier: string | number | BigInt): Promise<number>;
|
|
50
|
+
/**
|
|
51
|
+
* Recycle an existing token by its id. Recycling tokens helps
|
|
52
|
+
* detect compromised tokens.
|
|
53
|
+
* https://web.archive.org/web/20130214051957/http://jaspan.com/improved_persistent_login_cookie_best_practice
|
|
54
|
+
*/
|
|
55
|
+
recycle(user: InstanceType<Tokenable>, identifier: string | number | BigInt, expiresIn: string | number): Promise<RememberMeToken>;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A lucid model with a tokens provider to verify remember me tokens during
|
|
59
|
+
* authentication
|
|
60
|
+
*/
|
|
61
|
+
export type LucidAuthenticatable = LucidModel & {
|
|
62
|
+
rememberMeTokens?: RememberMeTokensProviderContract<LucidModel>;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Options accepted by the user provider that uses a lucid
|
|
66
|
+
* model to lookup a user during authentication and verify
|
|
67
|
+
* tokens
|
|
68
|
+
*/
|
|
69
|
+
export type SessionLucidUserProviderOptions<Model extends LucidAuthenticatable> = {
|
|
70
|
+
/**
|
|
71
|
+
* The model to use for users lookup
|
|
72
|
+
*/
|
|
73
|
+
model: () => Promise<{
|
|
74
|
+
default: Model;
|
|
75
|
+
}>;
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* The database columns expected at the database level
|
|
79
|
+
*/
|
|
80
|
+
export type RememberMeTokenDbColumns = {
|
|
81
|
+
/**
|
|
82
|
+
* Token primary key. It can be an integer, bigInteger or
|
|
83
|
+
* even a UUID or any other string based value.
|
|
84
|
+
*
|
|
85
|
+
* The id should not have ". (dots)" inside it.
|
|
86
|
+
*/
|
|
87
|
+
id: number | string | BigInt;
|
|
88
|
+
/**
|
|
89
|
+
* The user or entity for whom the token is
|
|
90
|
+
* generated
|
|
91
|
+
*/
|
|
92
|
+
tokenable_id: string | number | BigInt;
|
|
93
|
+
/**
|
|
94
|
+
* Token hash is used to verify the token shared
|
|
95
|
+
* with the user
|
|
96
|
+
*/
|
|
97
|
+
hash: string;
|
|
98
|
+
/**
|
|
99
|
+
* Timestamps
|
|
100
|
+
*/
|
|
101
|
+
created_at: Date;
|
|
102
|
+
updated_at: Date;
|
|
103
|
+
/**
|
|
104
|
+
* The date after which the token will be considered
|
|
105
|
+
* expired.
|
|
106
|
+
*/
|
|
107
|
+
expires_at: Date;
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Guard user is an adapter between the user provider
|
|
111
|
+
* and the guard.
|
|
112
|
+
*
|
|
113
|
+
* The guard is user provider agnostic and therefore it
|
|
114
|
+
* needs a adapter to known some basic info about the
|
|
115
|
+
* user.
|
|
116
|
+
*/
|
|
117
|
+
export type SessionGuardUser<RealUser> = {
|
|
118
|
+
getId(): string | number | BigInt;
|
|
119
|
+
getOriginal(): RealUser;
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* The user provider used by session guard to lookup users
|
|
123
|
+
* during authentication
|
|
124
|
+
*/
|
|
125
|
+
export interface SessionUserProviderContract<RealUser> {
|
|
126
|
+
[PROVIDER_REAL_USER]: RealUser;
|
|
127
|
+
/**
|
|
128
|
+
* Create a user object that acts as an adapter between
|
|
129
|
+
* the guard and real user value.
|
|
130
|
+
*/
|
|
131
|
+
createUserForGuard(user: RealUser): Promise<SessionGuardUser<RealUser>>;
|
|
132
|
+
/**
|
|
133
|
+
* Find a user by their id.
|
|
134
|
+
*/
|
|
135
|
+
findById(identifier: string | number | BigInt): Promise<SessionGuardUser<RealUser> | null>;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* The user provider used by session guard with support for tokens
|
|
139
|
+
*/
|
|
140
|
+
export interface SessionWithTokensUserProviderContract<RealUser> extends SessionUserProviderContract<RealUser> {
|
|
141
|
+
/**
|
|
142
|
+
* Create a token for a given user. Must be implemented when
|
|
143
|
+
* "supportsRememberMeTokens" flag is true
|
|
144
|
+
*/
|
|
145
|
+
createRememberToken(user: RealUser, expiresIn: string | number): Promise<RememberMeToken>;
|
|
146
|
+
/**
|
|
147
|
+
* Verify a token by its publicly shared value. Must be implemented when
|
|
148
|
+
* "supportsRememberMeTokens" flag is true
|
|
149
|
+
*/
|
|
150
|
+
verifyRememberToken(tokenValue: Secret<string>): Promise<RememberMeToken | null>;
|
|
151
|
+
/**
|
|
152
|
+
* Recycle a token for a user by the token identifier. Must be
|
|
153
|
+
* implemented when "supportsRememberMeTokens" flag is true
|
|
154
|
+
*/
|
|
155
|
+
recycleRememberToken(user: RealUser, tokenIdentifier: string | number | BigInt, expiresIn: string | number): Promise<RememberMeToken>;
|
|
156
|
+
/**
|
|
157
|
+
* Delete a token for a user by the token identifier. Must be
|
|
158
|
+
* implemented when "supportsRememberMeTokens" flag is true
|
|
159
|
+
*/
|
|
160
|
+
deleteRemeberToken(user: RealUser, tokenIdentifier: string | number | BigInt): Promise<number>;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Options accepted by the session guard
|
|
164
|
+
*/
|
|
165
|
+
export type SessionGuardOptions<UseRememberTokens extends boolean> = {
|
|
166
|
+
/**
|
|
167
|
+
* Whether or not use remember me tokens during authentication
|
|
168
|
+
* and login.
|
|
169
|
+
*
|
|
170
|
+
* If enabled, the provided user provider must implement the APIs
|
|
171
|
+
* needed to manage remember me tokens
|
|
172
|
+
*/
|
|
173
|
+
useRememberMeTokens: UseRememberTokens;
|
|
174
|
+
/**
|
|
175
|
+
* The age of remember me tokens after which they
|
|
176
|
+
* should expire.
|
|
177
|
+
*
|
|
178
|
+
* Defaults to "2 years"
|
|
179
|
+
*/
|
|
180
|
+
rememberMeTokensAge?: string | number;
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Events emitted by the session guard
|
|
184
|
+
*/
|
|
185
|
+
export type SessionGuardEvents<User> = {
|
|
186
|
+
/**
|
|
187
|
+
* The event is emitted when login is attempted for
|
|
188
|
+
* a given user.
|
|
189
|
+
*/
|
|
190
|
+
'session_auth:login_attempted': {
|
|
191
|
+
ctx: HttpContext;
|
|
192
|
+
guardName: string;
|
|
193
|
+
user: User;
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* The event is emitted when user has been logged in
|
|
197
|
+
* successfully
|
|
198
|
+
*/
|
|
199
|
+
'session_auth:login_succeeded': {
|
|
200
|
+
ctx: HttpContext;
|
|
201
|
+
guardName: string;
|
|
202
|
+
user: User;
|
|
203
|
+
sessionId: string;
|
|
204
|
+
rememberMeToken?: RememberMeToken;
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* Attempting to authenticate the user
|
|
208
|
+
*/
|
|
209
|
+
'session_auth:authentication_attempted': {
|
|
210
|
+
ctx: HttpContext;
|
|
211
|
+
guardName: string;
|
|
212
|
+
sessionId: string;
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Authentication was successful
|
|
216
|
+
*/
|
|
217
|
+
'session_auth:authentication_succeeded': {
|
|
218
|
+
ctx: HttpContext;
|
|
219
|
+
guardName: string;
|
|
220
|
+
user: User;
|
|
221
|
+
sessionId: string;
|
|
222
|
+
rememberMeToken?: RememberMeToken;
|
|
223
|
+
};
|
|
224
|
+
/**
|
|
225
|
+
* Authentication failed
|
|
226
|
+
*/
|
|
227
|
+
'session_auth:authentication_failed': {
|
|
228
|
+
ctx: HttpContext;
|
|
229
|
+
guardName: string;
|
|
230
|
+
error: Exception;
|
|
231
|
+
sessionId: string;
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* The event is emitted when user has been logged out
|
|
235
|
+
* sucessfully
|
|
236
|
+
*/
|
|
237
|
+
'session_auth:logged_out': {
|
|
238
|
+
ctx: HttpContext;
|
|
239
|
+
guardName: string;
|
|
240
|
+
user: User | null;
|
|
241
|
+
sessionId: string;
|
|
242
|
+
};
|
|
243
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Secret } from '@adonisjs/core/helpers';
|
|
2
|
+
import { RememberMeToken } from '../remember_me_token.js';
|
|
3
|
+
import { PROVIDER_REAL_USER } from '../../../src/symbols.js';
|
|
4
|
+
import type { SessionGuardUser, LucidAuthenticatable, SessionLucidUserProviderOptions, SessionUserProviderContract } from '../types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Uses a lucid model to verify access tokens and find a user during
|
|
7
|
+
* authentication
|
|
8
|
+
*/
|
|
9
|
+
export declare class SessionLucidUserProvider<UserModel extends LucidAuthenticatable> implements SessionUserProviderContract<InstanceType<UserModel>> {
|
|
10
|
+
/**
|
|
11
|
+
* Lucid provider options
|
|
12
|
+
*/
|
|
13
|
+
protected options: SessionLucidUserProviderOptions<UserModel>;
|
|
14
|
+
[PROVIDER_REAL_USER]: InstanceType<UserModel>;
|
|
15
|
+
/**
|
|
16
|
+
* Reference to the lazily imported model
|
|
17
|
+
*/
|
|
18
|
+
protected model?: UserModel;
|
|
19
|
+
constructor(
|
|
20
|
+
/**
|
|
21
|
+
* Lucid provider options
|
|
22
|
+
*/
|
|
23
|
+
options: SessionLucidUserProviderOptions<UserModel>);
|
|
24
|
+
/**
|
|
25
|
+
* Imports the model from the provider, returns and caches it
|
|
26
|
+
* for further operations.
|
|
27
|
+
*/
|
|
28
|
+
protected getModel(): Promise<UserModel>;
|
|
29
|
+
/**
|
|
30
|
+
* Returns the tokens provider associated with the user model
|
|
31
|
+
*/
|
|
32
|
+
protected getTokensProvider(): Promise<import("../types.js").RememberMeTokensProviderContract<import("@adonisjs/lucid/types/model").LucidModel>>;
|
|
33
|
+
/**
|
|
34
|
+
* Creates an adapter user for the guard
|
|
35
|
+
*/
|
|
36
|
+
createUserForGuard(user: InstanceType<UserModel>): Promise<SessionGuardUser<InstanceType<UserModel>>>;
|
|
37
|
+
/**
|
|
38
|
+
* Finds a user by their primary key value
|
|
39
|
+
*/
|
|
40
|
+
findById(identifier: string | number | BigInt): Promise<SessionGuardUser<InstanceType<UserModel>> | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Creates a remember token for a given user
|
|
43
|
+
*/
|
|
44
|
+
createRememberToken(user: InstanceType<UserModel>, expiresIn: string | number): Promise<RememberMeToken>;
|
|
45
|
+
/**
|
|
46
|
+
* Verify a token by its publicly shared value
|
|
47
|
+
*/
|
|
48
|
+
verifyRememberToken(tokenValue: Secret<string>): Promise<RememberMeToken | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Delete a token for a user by the token identifier
|
|
51
|
+
*/
|
|
52
|
+
deleteRemeberToken(user: InstanceType<UserModel>, identifier: string | number | BigInt): Promise<number>;
|
|
53
|
+
/**
|
|
54
|
+
* Recycle a token for a user by the token identifier
|
|
55
|
+
*/
|
|
56
|
+
recycleRememberToken(user: InstanceType<UserModel>, identifier: string | number | BigInt, expiresIn: string | number): Promise<RememberMeToken>;
|
|
57
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ApplicationService } from '@adonisjs/core/types';
|
|
2
|
-
import type { AuthService } from '../src/
|
|
2
|
+
import type { AuthService } from '../src/types.js';
|
|
3
3
|
declare module '@adonisjs/core/types' {
|
|
4
4
|
interface ContainerBindings {
|
|
5
5
|
'auth.manager': AuthService;
|
|
@@ -1,27 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
import { configProvider } from
|
|
10
|
-
import { RuntimeException } from
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
app;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
AuthManager
|
|
3
|
+
} from "../chunk-OL2Z3AO5.js";
|
|
4
|
+
import "../chunk-3HZHOWKL.js";
|
|
5
|
+
import "../chunk-UGHJLKDI.js";
|
|
6
|
+
import "../chunk-CZCFTIBB.js";
|
|
7
|
+
|
|
8
|
+
// providers/auth_provider.ts
|
|
9
|
+
import { configProvider } from "@adonisjs/core";
|
|
10
|
+
import { RuntimeException } from "@poppinss/utils";
|
|
11
|
+
var AuthProvider = class {
|
|
12
|
+
constructor(app) {
|
|
13
|
+
this.app = app;
|
|
14
|
+
}
|
|
15
|
+
register() {
|
|
16
|
+
this.app.container.singleton("auth.manager", async () => {
|
|
17
|
+
const authConfigProvider = this.app.config.get("auth");
|
|
18
|
+
const config = await configProvider.resolve(this.app, authConfigProvider);
|
|
19
|
+
if (!config) {
|
|
20
|
+
throw new RuntimeException(
|
|
21
|
+
'Invalid config exported from "config/auth.ts" file. Make sure to use the defineConfig method'
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return new AuthManager(config);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
export {
|
|
29
|
+
AuthProvider as default
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=auth_provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../providers/auth_provider.ts"],"sourcesContent":["/*\n * @adonisjs/auth\n *\n * (c) AdonisJS\n *\n * For the full copyright and license information, please view the LICENSE\n * file that was distributed with this source code.\n */\n\nimport { configProvider } from '@adonisjs/core'\nimport { RuntimeException } from '@poppinss/utils'\nimport type { ApplicationService } from '@adonisjs/core/types'\n\nimport type { AuthService } from '../src/types.js'\nimport { AuthManager } from '../src/auth_manager.js'\n\ndeclare module '@adonisjs/core/types' {\n export interface ContainerBindings {\n 'auth.manager': AuthService\n }\n}\n\nexport default class AuthProvider {\n constructor(protected app: ApplicationService) {}\n\n register() {\n this.app.container.singleton('auth.manager', async () => {\n const authConfigProvider = this.app.config.get('auth')\n const config = await configProvider.resolve<any>(this.app, authConfigProvider)\n\n if (!config) {\n throw new RuntimeException(\n 'Invalid config exported from \"config/auth.ts\" file. Make sure to use the defineConfig method'\n )\n }\n\n return new AuthManager(config)\n })\n }\n}\n"],"mappings":";;;;;;;;AASA,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAYjC,IAAqB,eAArB,MAAkC;AAAA,EAChC,YAAsB,KAAyB;AAAzB;AAAA,EAA0B;AAAA,EAEhD,WAAW;AACT,SAAK,IAAI,UAAU,UAAU,gBAAgB,YAAY;AACvD,YAAM,qBAAqB,KAAK,IAAI,OAAO,IAAI,MAAM;AACrD,YAAM,SAAS,MAAM,eAAe,QAAa,KAAK,KAAK,kBAAkB;AAE7E,UAAI,CAAC,QAAQ;AACX,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,aAAO,IAAI,YAAY,MAAM;AAAA,IAC/B,CAAC;AAAA,EACH;AACF;","names":[]}
|
package/build/services/auth.d.ts
CHANGED