@absolutejs/auth 0.79.0 → 0.80.0
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/CHANGELOG.md +10 -0
- package/README.md +32 -0
- package/changelog.json +17 -0
- package/dist/cli/migrate.js +46 -1
- package/dist/cli/migrate.js.map +6 -5
- package/dist/cli/setup.d.ts +12 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +62 -14
- package/dist/index.js.map +8 -7
- package/dist/linkedProviders/credentialError.d.ts +7 -0
- package/dist/linkedProviders/index.d.ts +1 -0
- package/dist/linkedProviders/index.js +57 -10
- package/dist/linkedProviders/index.js.map +6 -5
- package/dist/manifest.js +13 -17
- package/dist/manifest.js.map +3 -3
- package/dist/manifest.json +9 -14
- package/dist/server.js +61 -14
- package/dist/server.js.map +8 -7
- package/dist/session/neonStore.d.ts +4 -0
- package/package.json +1 -1
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { runMigrations } from '../migrations';
|
|
2
|
+
/** A missing or unknown selection must never silently become ephemeral storage. */
|
|
3
|
+
export declare const setupStorage: (configuration: unknown) => "memory" | "neon";
|
|
4
|
+
export declare const runSetup: ({ configuration, databaseUrl, migrate, log }?: {
|
|
5
|
+
configuration?: unknown;
|
|
6
|
+
databaseUrl?: string;
|
|
7
|
+
migrate?: typeof runMigrations;
|
|
8
|
+
log?: (message: string) => void;
|
|
9
|
+
}) => Promise<{
|
|
10
|
+
migrated: boolean;
|
|
11
|
+
storage: string;
|
|
12
|
+
}>;
|
package/dist/index.d.ts
CHANGED
|
@@ -4209,7 +4209,7 @@ export { readSessionCookie } from './session/cookieReader';
|
|
|
4209
4209
|
export { AuthIdentityConflictError } from './errors';
|
|
4210
4210
|
export { sessionStore } from './session/state';
|
|
4211
4211
|
export { createInMemoryAuthSessionStore } from './session/inMemoryStore';
|
|
4212
|
-
export { createNeonAuthSessionStore } from './session/neonStore';
|
|
4212
|
+
export { createNeonAuthSessionStore, createPostgresAuthSessionStore } from './session/neonStore';
|
|
4213
4213
|
export { providersFromEnv, type ProviderSelection } from './providersFromEnv';
|
|
4214
4214
|
export { createRedisAuthSessionStore, type RedisSessionClient } from './session/redisStore';
|
|
4215
4215
|
export { createLinkedProviderCredentialResolver, type CreateLinkedProviderCredentialResolverOptions, type LinkedProviderRefreshResult } from './linkedProviders/resolver';
|
package/dist/index.js
CHANGED
|
@@ -25793,10 +25793,9 @@ var toUnregisteredSessionData = (row) => ({
|
|
|
25793
25793
|
sessionInformation: cloneRecord(row.session_information_json ?? undefined),
|
|
25794
25794
|
userIdentity: cloneRecord(row.user_identity_json ?? undefined)
|
|
25795
25795
|
});
|
|
25796
|
-
var createNeonAuthSessionStore = (databaseUrl, decodeUser) => {
|
|
25797
|
-
|
|
25798
|
-
const
|
|
25799
|
-
return {
|
|
25796
|
+
var createNeonAuthSessionStore = (databaseUrl, decodeUser) => createPostgresAuthSessionStore(drizzle({ client: as(databaseUrl) }), decodeUser);
|
|
25797
|
+
var createPostgresAuthSessionStore = (db, decodeUser) => {
|
|
25798
|
+
const store = {
|
|
25800
25799
|
deleteExpired: async () => {
|
|
25801
25800
|
const rows = await db.delete(authSessionsTable).where(lt(authSessionsTable.expires_at_ms, Date.now())).returning({ id: authSessionsTable.id });
|
|
25802
25801
|
return rows.length;
|
|
@@ -25874,6 +25873,7 @@ var createNeonAuthSessionStore = (databaseUrl, decodeUser) => {
|
|
|
25874
25873
|
});
|
|
25875
25874
|
}
|
|
25876
25875
|
};
|
|
25876
|
+
return store;
|
|
25877
25877
|
};
|
|
25878
25878
|
// src/providersFromEnv.ts
|
|
25879
25879
|
var envKey = (provider, suffix) => `${provider.replace(/[^a-zA-Z0-9]/g, "_").toUpperCase()}_${suffix}`;
|
|
@@ -33970,6 +33970,30 @@ var createRedisAuthSessionStore = (redis, decodeUser, keyPrefix = "auth:session:
|
|
|
33970
33970
|
}
|
|
33971
33971
|
};
|
|
33972
33972
|
};
|
|
33973
|
+
// src/linkedProviders/credentialError.ts
|
|
33974
|
+
class LinkedProviderCredentialError extends Error {
|
|
33975
|
+
code;
|
|
33976
|
+
recovery;
|
|
33977
|
+
constructor(code, recovery, message, cause) {
|
|
33978
|
+
super(message, { cause });
|
|
33979
|
+
this.code = code;
|
|
33980
|
+
this.recovery = recovery;
|
|
33981
|
+
this.name = "LinkedProviderCredentialError";
|
|
33982
|
+
}
|
|
33983
|
+
}
|
|
33984
|
+
var credentialRefreshError = (error2) => {
|
|
33985
|
+
if (error2 instanceof LinkedProviderCredentialError)
|
|
33986
|
+
return error2;
|
|
33987
|
+
const message = error2 instanceof Error ? error2.message : "";
|
|
33988
|
+
if (/\binvalid_grant\b/.test(message)) {
|
|
33989
|
+
return new LinkedProviderCredentialError("invalid_grant", "reconnect", "Authorization has expired or was revoked. Reconnect your account.", error2);
|
|
33990
|
+
}
|
|
33991
|
+
if (/\b(invalid_client|unauthorized_client)\b/.test(message)) {
|
|
33992
|
+
return new LinkedProviderCredentialError("invalid_client", "configuration", "The provider connection is misconfigured. Contact support.", error2);
|
|
33993
|
+
}
|
|
33994
|
+
return new LinkedProviderCredentialError("refresh_failed", "retry", "The provider could not refresh the connection. Try again.", error2);
|
|
33995
|
+
};
|
|
33996
|
+
|
|
33973
33997
|
// src/linkedProviders/resolver.ts
|
|
33974
33998
|
var uniqueStrings = (values) => [...new Set(values)];
|
|
33975
33999
|
var getEffectiveScopes = (grant, binding) => {
|
|
@@ -34067,6 +34091,30 @@ var resolveBindingCredential = async (grantStore, binding, input) => {
|
|
|
34067
34091
|
}
|
|
34068
34092
|
return buildResolvedCredential(grant, binding);
|
|
34069
34093
|
};
|
|
34094
|
+
var refreshAndRecord = async (grant, input, refresh2, grantStore, now) => {
|
|
34095
|
+
let refreshed;
|
|
34096
|
+
try {
|
|
34097
|
+
const result = await refresh2(grant, input);
|
|
34098
|
+
if (!result)
|
|
34099
|
+
throw new Error("Linked provider access token refresh failed");
|
|
34100
|
+
refreshed = result;
|
|
34101
|
+
} catch (cause) {
|
|
34102
|
+
const error2 = credentialRefreshError(cause);
|
|
34103
|
+
await grantStore.saveGrant({
|
|
34104
|
+
...grant,
|
|
34105
|
+
lastRefreshError: error2.message,
|
|
34106
|
+
metadata: { ...grant.metadata, credentialFailureCode: error2.code, credentialRecovery: error2.recovery },
|
|
34107
|
+
status: "refresh_required",
|
|
34108
|
+
updatedAt: now()
|
|
34109
|
+
});
|
|
34110
|
+
throw error2;
|
|
34111
|
+
}
|
|
34112
|
+
const metadata = { ...refreshed.grant.metadata };
|
|
34113
|
+
delete metadata.credentialRecovery;
|
|
34114
|
+
delete metadata.credentialFailureCode;
|
|
34115
|
+
await grantStore.saveGrant({ ...refreshed.grant, lastRefreshError: undefined, metadata });
|
|
34116
|
+
return refreshed;
|
|
34117
|
+
};
|
|
34070
34118
|
var createLinkedProviderCredentialResolver = ({
|
|
34071
34119
|
grantStore,
|
|
34072
34120
|
bindingStore,
|
|
@@ -34096,11 +34144,7 @@ var createLinkedProviderCredentialResolver = ({
|
|
|
34096
34144
|
if (!refreshAccessTokenLease) {
|
|
34097
34145
|
throw new Error("Linked provider access token lease requires refresh");
|
|
34098
34146
|
}
|
|
34099
|
-
const refreshed = await
|
|
34100
|
-
if (!refreshed) {
|
|
34101
|
-
throw new Error("Linked provider access token refresh failed");
|
|
34102
|
-
}
|
|
34103
|
-
await grantStore.saveGrant(refreshed.grant);
|
|
34147
|
+
const refreshed = await refreshAndRecord(grant, input, refreshAccessTokenLease, grantStore, now);
|
|
34104
34148
|
({ lease } = refreshed);
|
|
34105
34149
|
}
|
|
34106
34150
|
if (!lease) {
|
|
@@ -34193,8 +34237,11 @@ var createOAuthLinkedProviderCredentialResolver = async ({
|
|
|
34193
34237
|
tokenType: grant.tokenType
|
|
34194
34238
|
} : null,
|
|
34195
34239
|
refreshAccessTokenLease: async (grant) => {
|
|
34196
|
-
if (!
|
|
34197
|
-
|
|
34240
|
+
if (!grant.refreshTokenCiphertext) {
|
|
34241
|
+
throw new LinkedProviderCredentialError("missing_refresh_token", "reconnect", "Authorization cannot renew automatically. Reconnect your account.");
|
|
34242
|
+
}
|
|
34243
|
+
if (!isValidProviderOption(grant.authProviderKey)) {
|
|
34244
|
+
throw new LinkedProviderCredentialError("unsupported_provider", "configuration", "This provider cannot renew the connection. Contact support.");
|
|
34198
34245
|
}
|
|
34199
34246
|
const providerKey = grant.authProviderKey;
|
|
34200
34247
|
const providerClientName = typeof grant.metadata?.providerClient === "string" && grant.metadata.providerClient.trim().length > 0 ? grant.metadata.providerClient.trim() : undefined;
|
|
@@ -34204,11 +34251,11 @@ var createOAuthLinkedProviderCredentialResolver = async ({
|
|
|
34204
34251
|
providersConfiguration
|
|
34205
34252
|
});
|
|
34206
34253
|
if ("error" in resolvedProviderClientConfiguration || !resolvedProviderClientConfiguration.config) {
|
|
34207
|
-
|
|
34254
|
+
throw new LinkedProviderCredentialError("provider_configuration", "configuration", "The provider connection is misconfigured. Contact support.");
|
|
34208
34255
|
}
|
|
34209
34256
|
const providerClient = await createOAuth2Client(providerKey, resolvedProviderClientConfiguration.config.credentials);
|
|
34210
34257
|
if (!providerClient || !isRefreshableOAuth2Client(providerKey, providerClient)) {
|
|
34211
|
-
|
|
34258
|
+
throw new LinkedProviderCredentialError("unsupported_refresh", "configuration", "This provider cannot renew the connection. Contact support.");
|
|
34212
34259
|
}
|
|
34213
34260
|
const tokenResponse2 = await providerClient.refreshAccessToken(grant.refreshTokenCiphertext);
|
|
34214
34261
|
const refreshedAt = Date.now();
|
|
@@ -41145,6 +41192,7 @@ export {
|
|
|
41145
41192
|
createPostgresApiClientStore,
|
|
41146
41193
|
createPostgresApiKeyStore,
|
|
41147
41194
|
createPostgresAuditSink,
|
|
41195
|
+
createPostgresAuthSessionStore,
|
|
41148
41196
|
createPostgresAuthorizationCodeStore,
|
|
41149
41197
|
createPostgresBackchannelAuthStore,
|
|
41150
41198
|
createPostgresClientAssertionJtiStore,
|
|
@@ -41457,5 +41505,5 @@ export {
|
|
|
41457
41505
|
writeWarrant
|
|
41458
41506
|
};
|
|
41459
41507
|
|
|
41460
|
-
//# debugId=
|
|
41508
|
+
//# debugId=637E1C97D77705DC64756E2164756E21
|
|
41461
41509
|
//# sourceMappingURL=index.js.map
|