@acorex-platform/framework-server 0.0.33 → 0.0.38
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/background-job/src/lib/schedule/background-job-schedule-scanner.service.d.ts.map +1 -1
- package/background-job/src/lib/schedule/background-job-schedule-scanner.service.js +29 -2
- package/background-job/src/lib/schedule/background-job-schedule-scanner.service.js.map +1 -1
- package/core/src/lib/runtime/runtime-authz.guard.d.ts +3 -2
- package/core/src/lib/runtime/runtime-authz.guard.d.ts.map +1 -1
- package/core/src/lib/runtime/runtime-authz.guard.js +7 -6
- package/core/src/lib/runtime/runtime-authz.guard.js.map +1 -1
- package/domain/seed/src/lib/category-companion-entity.builder.d.ts +1 -1
- package/domain/seed/src/lib/category-companion-entity.builder.d.ts.map +1 -1
- package/domain/seed/src/lib/category-companion-entity.builder.js +64 -0
- package/domain/seed/src/lib/category-companion-entity.builder.js.map +1 -1
- package/jql/schema/src/lib/generated/widget-data-types.bootstrap.js +1 -1
- package/jql/schema/src/lib/generated/widget-data-types.bootstrap.js.map +1 -1
- package/package.json +2 -2
- package/realtime/src/lib/auth/auth-security-alert-realtime.listener.d.ts +18 -0
- package/realtime/src/lib/auth/auth-security-alert-realtime.listener.d.ts.map +1 -0
- package/realtime/src/lib/auth/auth-security-alert-realtime.listener.js +90 -0
- package/realtime/src/lib/auth/auth-security-alert-realtime.listener.js.map +1 -0
- package/realtime/src/lib/delivery/socket-io-realtime.delivery.d.ts.map +1 -1
- package/realtime/src/lib/delivery/socket-io-realtime.delivery.js +9 -4
- package/realtime/src/lib/delivery/socket-io-realtime.delivery.js.map +1 -1
- package/realtime/src/lib/gateway/realtime-ws-auth.d.ts +1 -1
- package/realtime/src/lib/gateway/realtime-ws-auth.d.ts.map +1 -1
- package/realtime/src/lib/gateway/realtime-ws-auth.js +4 -2
- package/realtime/src/lib/gateway/realtime-ws-auth.js.map +1 -1
- package/realtime/src/lib/gateway/realtime.gateway.d.ts +1 -0
- package/realtime/src/lib/gateway/realtime.gateway.d.ts.map +1 -1
- package/realtime/src/lib/gateway/realtime.gateway.js +9 -2
- package/realtime/src/lib/gateway/realtime.gateway.js.map +1 -1
- package/realtime/src/lib/realtime.module.d.ts.map +1 -1
- package/realtime/src/lib/realtime.module.js +2 -0
- package/realtime/src/lib/realtime.module.js.map +1 -1
- package/realtime/src/lib/rooms/realtime-rooms.util.d.ts +8 -0
- package/realtime/src/lib/rooms/realtime-rooms.util.d.ts.map +1 -1
- package/realtime/src/lib/rooms/realtime-rooms.util.js +22 -0
- package/realtime/src/lib/rooms/realtime-rooms.util.js.map +1 -1
- package/realtime/src/lib/services/realtime-publisher.service.d.ts.map +1 -1
- package/realtime/src/lib/services/realtime-publisher.service.js +7 -1
- package/realtime/src/lib/services/realtime-publisher.service.js.map +1 -1
- package/realtime/src/lib/topics/realtime-topics.d.ts +1 -0
- package/realtime/src/lib/topics/realtime-topics.d.ts.map +1 -1
- package/realtime/src/lib/topics/realtime-topics.js +2 -1
- package/realtime/src/lib/topics/realtime-topics.js.map +1 -1
- package/realtime/src/lib/types/realtime.types.d.ts +19 -0
- package/realtime/src/lib/types/realtime.types.d.ts.map +1 -1
- package/realtime/src/lib/types/realtime.types.js.map +1 -1
- package/security/src/index.d.ts +4 -0
- package/security/src/index.d.ts.map +1 -1
- package/security/src/index.js +5 -0
- package/security/src/index.js.map +1 -1
- package/security/src/lib/auth/auth-cookie-response.util.d.ts.map +1 -1
- package/security/src/lib/auth/auth-cookie-response.util.js +4 -1
- package/security/src/lib/auth/auth-cookie-response.util.js.map +1 -1
- package/security/src/lib/auth/auth-cookie.service.d.ts +2 -0
- package/security/src/lib/auth/auth-cookie.service.d.ts.map +1 -1
- package/security/src/lib/auth/auth-cookie.service.js +17 -0
- package/security/src/lib/auth/auth-cookie.service.js.map +1 -1
- package/security/src/lib/auth/auth-csrf.middleware.d.ts +14 -0
- package/security/src/lib/auth/auth-csrf.middleware.d.ts.map +1 -0
- package/security/src/lib/auth/auth-csrf.middleware.js +60 -0
- package/security/src/lib/auth/auth-csrf.middleware.js.map +1 -0
- package/security/src/lib/auth/auth-identity-provider.source.d.ts +11 -0
- package/security/src/lib/auth/auth-identity-provider.source.d.ts.map +1 -1
- package/security/src/lib/auth/auth-identity-provider.source.js +6 -1
- package/security/src/lib/auth/auth-identity-provider.source.js.map +1 -1
- package/security/src/lib/auth/auth-local-credentials.service.d.ts +8 -0
- package/security/src/lib/auth/auth-local-credentials.service.d.ts.map +1 -1
- package/security/src/lib/auth/auth-local-credentials.service.js +41 -16
- package/security/src/lib/auth/auth-local-credentials.service.js.map +1 -1
- package/security/src/lib/auth/auth-max-device-sessions-policy.d.ts +14 -0
- package/security/src/lib/auth/auth-max-device-sessions-policy.d.ts.map +1 -0
- package/security/src/lib/auth/auth-max-device-sessions-policy.js +48 -0
- package/security/src/lib/auth/auth-max-device-sessions-policy.js.map +1 -0
- package/security/src/lib/auth/auth-runtime.handlers.d.ts +15 -3
- package/security/src/lib/auth/auth-runtime.handlers.d.ts.map +1 -1
- package/security/src/lib/auth/auth-runtime.handlers.js +51 -3
- package/security/src/lib/auth/auth-runtime.handlers.js.map +1 -1
- package/security/src/lib/auth/auth.config.d.ts +7 -0
- package/security/src/lib/auth/auth.config.d.ts.map +1 -1
- package/security/src/lib/auth/auth.config.js +8 -1
- package/security/src/lib/auth/auth.config.js.map +1 -1
- package/security/src/lib/auth/auth.events.d.ts +22 -0
- package/security/src/lib/auth/auth.events.d.ts.map +1 -1
- package/security/src/lib/auth/auth.events.js +3 -1
- package/security/src/lib/auth/auth.events.js.map +1 -1
- package/security/src/lib/auth/auth.service.d.ts +65 -5
- package/security/src/lib/auth/auth.service.d.ts.map +1 -1
- package/security/src/lib/auth/auth.service.js +311 -10
- package/security/src/lib/auth/auth.service.js.map +1 -1
- package/security/src/lib/auth/auth.types.d.ts +36 -0
- package/security/src/lib/auth/auth.types.d.ts.map +1 -1
- package/security/src/lib/auth/auth.types.js.map +1 -1
- package/security/src/lib/auth/device-session.service.d.ts +59 -1
- package/security/src/lib/auth/device-session.service.d.ts.map +1 -1
- package/security/src/lib/auth/device-session.service.js +299 -28
- package/security/src/lib/auth/device-session.service.js.map +1 -1
- package/security/src/lib/auth/jwt-auth.guard.d.ts +2 -1
- package/security/src/lib/auth/jwt-auth.guard.d.ts.map +1 -1
- package/security/src/lib/auth/jwt-auth.guard.js +4 -2
- package/security/src/lib/auth/jwt-auth.guard.js.map +1 -1
- package/security/src/lib/auth/login-attempt.service.d.ts +14 -3
- package/security/src/lib/auth/login-attempt.service.d.ts.map +1 -1
- package/security/src/lib/auth/login-attempt.service.js +35 -10
- package/security/src/lib/auth/login-attempt.service.js.map +1 -1
- package/security/src/lib/auth/request-meta.util.js +64 -11
- package/security/src/lib/auth/request-meta.util.js.map +1 -1
- package/security/src/lib/auth/token-revocation.constants.d.ts +9 -0
- package/security/src/lib/auth/token-revocation.constants.d.ts.map +1 -0
- package/security/src/lib/auth/token-revocation.constants.js +14 -0
- package/security/src/lib/auth/token-revocation.constants.js.map +1 -0
- package/security/src/lib/auth/token.service.d.ts +26 -1
- package/security/src/lib/auth/token.service.d.ts.map +1 -1
- package/security/src/lib/auth/token.service.js +105 -4
- package/security/src/lib/auth/token.service.js.map +1 -1
- package/security/src/lib/oauth/connect.controller.d.ts +81 -7
- package/security/src/lib/oauth/connect.controller.d.ts.map +1 -1
- package/security/src/lib/oauth/connect.controller.js +264 -36
- package/security/src/lib/oauth/connect.controller.js.map +1 -1
- package/security/src/lib/oauth/oauth-bff.util.d.ts +9 -0
- package/security/src/lib/oauth/oauth-bff.util.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-bff.util.js +30 -0
- package/security/src/lib/oauth/oauth-bff.util.js.map +1 -0
- package/security/src/lib/oauth/oauth-claims.util.d.ts +6 -0
- package/security/src/lib/oauth/oauth-claims.util.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-claims.util.js +36 -0
- package/security/src/lib/oauth/oauth-claims.util.js.map +1 -0
- package/security/src/lib/oauth/oauth-client-registry.service.d.ts +25 -0
- package/security/src/lib/oauth/oauth-client-registry.service.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-client-registry.service.js +201 -0
- package/security/src/lib/oauth/oauth-client-registry.service.js.map +1 -0
- package/security/src/lib/oauth/oauth-connect.exception-filter.d.ts +10 -0
- package/security/src/lib/oauth/oauth-connect.exception-filter.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-connect.exception-filter.js +59 -0
- package/security/src/lib/oauth/oauth-connect.exception-filter.js.map +1 -0
- package/security/src/lib/oauth/oauth-error.util.d.ts +23 -0
- package/security/src/lib/oauth/oauth-error.util.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-error.util.js +114 -0
- package/security/src/lib/oauth/oauth-error.util.js.map +1 -0
- package/security/src/lib/oauth/oauth-grant-store.interface.d.ts +16 -0
- package/security/src/lib/oauth/oauth-grant-store.interface.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-grant-store.interface.js +14 -0
- package/security/src/lib/oauth/oauth-grant-store.interface.js.map +1 -0
- package/security/src/lib/oauth/oauth-issuer.util.d.ts +7 -0
- package/security/src/lib/oauth/oauth-issuer.util.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-issuer.util.js +25 -0
- package/security/src/lib/oauth/oauth-issuer.util.js.map +1 -0
- package/security/src/lib/oauth/oauth-op.service.d.ts +35 -0
- package/security/src/lib/oauth/oauth-op.service.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-op.service.js +152 -0
- package/security/src/lib/oauth/oauth-op.service.js.map +1 -0
- package/security/src/lib/oauth/oauth-op.types.d.ts +73 -0
- package/security/src/lib/oauth/oauth-op.types.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-op.types.js +5 -0
- package/security/src/lib/oauth/oauth-op.types.js.map +1 -0
- package/security/src/lib/oauth/oauth-provider-hint.util.d.ts +8 -0
- package/security/src/lib/oauth/oauth-provider-hint.util.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-provider-hint.util.js +24 -0
- package/security/src/lib/oauth/oauth-provider-hint.util.js.map +1 -0
- package/security/src/lib/oauth/oauth-redis-oidc-adapter.d.ts +27 -0
- package/security/src/lib/oauth/oauth-redis-oidc-adapter.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-redis-oidc-adapter.js +159 -0
- package/security/src/lib/oauth/oauth-redis-oidc-adapter.js.map +1 -0
- package/security/src/lib/oauth/oauth-rp.service.d.ts +53 -0
- package/security/src/lib/oauth/oauth-rp.service.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-rp.service.js +371 -0
- package/security/src/lib/oauth/oauth-rp.service.js.map +1 -0
- package/security/src/lib/oauth/oauth-rp.types.d.ts +25 -0
- package/security/src/lib/oauth/oauth-rp.types.d.ts.map +1 -0
- package/security/src/lib/oauth/oauth-rp.types.js +5 -0
- package/security/src/lib/oauth/oauth-rp.types.js.map +1 -0
- package/security/src/lib/oauth/oidc-provider-engine.service.d.ts +25 -0
- package/security/src/lib/oauth/oidc-provider-engine.service.d.ts.map +1 -0
- package/security/src/lib/oauth/oidc-provider-engine.service.js +208 -0
- package/security/src/lib/oauth/oidc-provider-engine.service.js.map +1 -0
- package/security/src/lib/oauth/platform-oauth.service.d.ts +43 -14
- package/security/src/lib/oauth/platform-oauth.service.d.ts.map +1 -1
- package/security/src/lib/oauth/platform-oauth.service.js +177 -170
- package/security/src/lib/oauth/platform-oauth.service.js.map +1 -1
- package/security/src/lib/oauth/platform-oauth.types.d.ts +11 -3
- package/security/src/lib/oauth/platform-oauth.types.d.ts.map +1 -1
- package/security/src/lib/oauth/platform-oauth.types.js.map +1 -1
- package/security/src/lib/oauth/redis-oauth-grant-store.service.d.ts +22 -0
- package/security/src/lib/oauth/redis-oauth-grant-store.service.d.ts.map +1 -0
- package/security/src/lib/oauth/redis-oauth-grant-store.service.js +132 -0
- package/security/src/lib/oauth/redis-oauth-grant-store.service.js.map +1 -0
- package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.d.ts +14 -0
- package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.d.ts.map +1 -0
- package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.js +46 -0
- package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.js.map +1 -0
- package/security/src/lib/oauth/testing/jest-empty-module.d.ts +4 -0
- package/security/src/lib/oauth/testing/jest-empty-module.d.ts.map +1 -0
- package/security/src/lib/oauth/testing/jest-empty-module.js +11 -0
- package/security/src/lib/oauth/testing/jest-empty-module.js.map +1 -0
- package/security/src/lib/oauth/testing/mock-oidc-provider.d.ts +49 -0
- package/security/src/lib/oauth/testing/mock-oidc-provider.d.ts.map +1 -0
- package/security/src/lib/oauth/testing/mock-oidc-provider.js +158 -0
- package/security/src/lib/oauth/testing/mock-oidc-provider.js.map +1 -0
- package/security/src/lib/security.module.d.ts.map +1 -1
- package/security/src/lib/security.module.js +31 -0
- package/security/src/lib/security.module.js.map +1 -1
- package/security/src/lib/session/backend-session.types.d.ts +2 -0
- package/security/src/lib/session/backend-session.types.d.ts.map +1 -1
- package/security/src/lib/session/backend-session.types.js.map +1 -1
- package/security/src/lib/session/optional-jwt-session.middleware.d.ts +6 -4
- package/security/src/lib/session/optional-jwt-session.middleware.d.ts.map +1 -1
- package/security/src/lib/session/optional-jwt-session.middleware.js +18 -7
- package/security/src/lib/session/optional-jwt-session.middleware.js.map +1 -1
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OAuthOpService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const common_1 = require("@nestjs/common");
|
|
6
|
+
const core_1 = require("@nestjs/core");
|
|
7
|
+
const crypto_1 = require("crypto");
|
|
8
|
+
const auth_identity_provider_source_1 = require("../auth/auth-identity-provider.source");
|
|
9
|
+
const oauth_client_registry_service_1 = require("./oauth-client-registry.service");
|
|
10
|
+
const oauth_rp_service_1 = require("./oauth-rp.service");
|
|
11
|
+
const oauth_grant_store_interface_1 = require("./oauth-grant-store.interface");
|
|
12
|
+
const platform_oauth_config_1 = require("./platform-oauth.config");
|
|
13
|
+
const oauth_error_util_1 = require("./oauth-error.util");
|
|
14
|
+
//#region ---- OAuth OP (Authorization Server) service ----
|
|
15
|
+
let OAuthOpService = class OAuthOpService {
|
|
16
|
+
constructor(grants, rp, clients, moduleRef) {
|
|
17
|
+
this.grants = grants;
|
|
18
|
+
this.rp = rp;
|
|
19
|
+
this.clients = clients;
|
|
20
|
+
this.moduleRef = moduleRef;
|
|
21
|
+
this.authorizationCodeTtlMs = platform_oauth_config_1.PLATFORM_OAUTH_CODE_TTL_MS;
|
|
22
|
+
}
|
|
23
|
+
async beginAuthorization(request) {
|
|
24
|
+
this.assertSupportedAuthorizeRequest(request);
|
|
25
|
+
const providerKey = request.provider.trim();
|
|
26
|
+
if (!providerKey) {
|
|
27
|
+
throw (0, oauth_error_util_1.oauthInvalidRequest)('identity_provider (or acr_values) is required.');
|
|
28
|
+
}
|
|
29
|
+
const broker = await this.requireBrokerConfig(providerKey);
|
|
30
|
+
const codeVerifier = request.codeVerifier?.trim() ||
|
|
31
|
+
(await this.grants.consumePkceVerifier(request.codeChallenge.trim())) ||
|
|
32
|
+
undefined;
|
|
33
|
+
const externalState = (0, crypto_1.randomBytes)(16).toString('hex');
|
|
34
|
+
const nonce = (0, crypto_1.randomBytes)(16).toString('hex');
|
|
35
|
+
await this.saveExternalState(externalState, {
|
|
36
|
+
codeChallenge: request.codeChallenge,
|
|
37
|
+
codeChallengeMethod: request.codeChallengeMethod,
|
|
38
|
+
codeVerifier,
|
|
39
|
+
redirectUri: request.redirectUri,
|
|
40
|
+
clientId: request.clientId,
|
|
41
|
+
provider: providerKey,
|
|
42
|
+
issuer: request.issuer.replace(/\/$/, ''),
|
|
43
|
+
nonce,
|
|
44
|
+
expiresAt: Date.now() + this.authorizationCodeTtlMs,
|
|
45
|
+
});
|
|
46
|
+
const callbackUrl = `${request.issuer.replace(/\/$/, '')}/connect/callback/${encodeURIComponent(providerKey)}`;
|
|
47
|
+
const externalUrl = this.rp.buildAuthorizationUrl(broker, callbackUrl, externalState, nonce);
|
|
48
|
+
return { externalState, externalUrl };
|
|
49
|
+
}
|
|
50
|
+
async issueCode(input) {
|
|
51
|
+
const code = (0, crypto_1.randomBytes)(24).toString('hex');
|
|
52
|
+
const expiresAt = input.expiresAt ?? Date.now() + this.authorizationCodeTtlMs;
|
|
53
|
+
await this.grants.saveCode(code, {
|
|
54
|
+
...input,
|
|
55
|
+
expiresAt,
|
|
56
|
+
}, this.authorizationCodeTtlMs);
|
|
57
|
+
return code;
|
|
58
|
+
}
|
|
59
|
+
async consumeCode(input) {
|
|
60
|
+
const record = await this.grants.consumeCode(input.code);
|
|
61
|
+
if (!record || record.expiresAt < Date.now()) {
|
|
62
|
+
throw (0, oauth_error_util_1.oauthInvalidGrant)('Invalid or expired authorization code.');
|
|
63
|
+
}
|
|
64
|
+
this.clients.assertRedirectUri(input.clientId, input.redirectUri);
|
|
65
|
+
if (record.clientId !== input.clientId || record.redirectUri !== input.redirectUri) {
|
|
66
|
+
throw (0, oauth_error_util_1.oauthInvalidGrant)('Authorization code does not match client or redirect URI.');
|
|
67
|
+
}
|
|
68
|
+
const codeVerifier = input.codeVerifier?.trim() || record.codeVerifier?.trim();
|
|
69
|
+
if (!codeVerifier) {
|
|
70
|
+
throw (0, oauth_error_util_1.oauthInvalidGrant)('PKCE code_verifier is required.');
|
|
71
|
+
}
|
|
72
|
+
if (!this.verifyPkce(codeVerifier, record.codeChallenge, record.codeChallengeMethod)) {
|
|
73
|
+
throw (0, oauth_error_util_1.oauthInvalidGrant)('Invalid PKCE code verifier.');
|
|
74
|
+
}
|
|
75
|
+
return record;
|
|
76
|
+
}
|
|
77
|
+
async saveExternalState(state, record) {
|
|
78
|
+
const ttlMs = Math.max(1, record.expiresAt - Date.now());
|
|
79
|
+
await this.grants.saveState(state, record, ttlMs);
|
|
80
|
+
}
|
|
81
|
+
async consumeExternalState(state) {
|
|
82
|
+
const record = await this.grants.consumeState(state);
|
|
83
|
+
if (!record || record.expiresAt < Date.now()) {
|
|
84
|
+
throw (0, oauth_error_util_1.oauthInvalidGrant)('Invalid or expired OAuth state.');
|
|
85
|
+
}
|
|
86
|
+
return record;
|
|
87
|
+
}
|
|
88
|
+
async stagePkceVerifier(codeChallenge, codeVerifier) {
|
|
89
|
+
await this.grants.savePkceVerifier(codeChallenge, codeVerifier, this.authorizationCodeTtlMs);
|
|
90
|
+
}
|
|
91
|
+
async requireBrokerConfig(key) {
|
|
92
|
+
const catalog = this.resolveIdentityProviderCatalog();
|
|
93
|
+
const broker = catalog ? await catalog.getBrokerConfig(key) : null;
|
|
94
|
+
if (!broker) {
|
|
95
|
+
throw new common_1.ServiceUnavailableException({
|
|
96
|
+
statusCode: 503,
|
|
97
|
+
message: `Identity provider "${key}" is not enabled or is missing broker config ` +
|
|
98
|
+
'(clientId, clientSecret, authorizationUrl, tokenUrl). ' +
|
|
99
|
+
'Configure it under Security → Identity Providers.',
|
|
100
|
+
error: 'IdentityProviderNotConfigured',
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return broker;
|
|
104
|
+
}
|
|
105
|
+
resolveIdentityProviderCatalog() {
|
|
106
|
+
try {
|
|
107
|
+
return this.moduleRef.get(auth_identity_provider_source_1.AUTH_IDENTITY_PROVIDER_CATALOG, { strict: false });
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
assertSupportedAuthorizeRequest(request) {
|
|
114
|
+
if (request.responseType !== 'code') {
|
|
115
|
+
throw (0, oauth_error_util_1.oauthInvalidRequest)('Only response_type=code is supported.');
|
|
116
|
+
}
|
|
117
|
+
this.clients.assertClientId(request.clientId);
|
|
118
|
+
this.clients.assertRedirectUri(request.clientId, request.redirectUri);
|
|
119
|
+
this.clients.assertScopes(request.clientId, request.scope);
|
|
120
|
+
if (!request.redirectUri?.trim()) {
|
|
121
|
+
throw (0, oauth_error_util_1.oauthInvalidRequest)('redirect_uri is required.');
|
|
122
|
+
}
|
|
123
|
+
if (!request.issuer?.trim()) {
|
|
124
|
+
throw (0, oauth_error_util_1.oauthInvalidRequest)('issuer is required.');
|
|
125
|
+
}
|
|
126
|
+
if (!request.codeChallenge?.trim() || request.codeChallengeMethod !== 'S256') {
|
|
127
|
+
throw (0, oauth_error_util_1.oauthInvalidRequest)('PKCE S256 code_challenge is required.');
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
verifyPkce(codeVerifier, codeChallenge, method) {
|
|
131
|
+
if (method !== 'S256') {
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
const digest = (0, crypto_1.createHash)('sha256').update(codeVerifier).digest('base64url');
|
|
135
|
+
try {
|
|
136
|
+
return (0, crypto_1.timingSafeEqual)(Buffer.from(digest), Buffer.from(codeChallenge));
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
exports.OAuthOpService = OAuthOpService;
|
|
144
|
+
exports.OAuthOpService = OAuthOpService = tslib_1.__decorate([
|
|
145
|
+
(0, common_1.Injectable)(),
|
|
146
|
+
tslib_1.__metadata("design:paramtypes", [oauth_grant_store_interface_1.OAuthGrantStore,
|
|
147
|
+
oauth_rp_service_1.OAuthRpService,
|
|
148
|
+
oauth_client_registry_service_1.OAuthClientRegistryService,
|
|
149
|
+
core_1.ModuleRef])
|
|
150
|
+
], OAuthOpService);
|
|
151
|
+
//#endregion
|
|
152
|
+
//# sourceMappingURL=oauth-op.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-op.service.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-op.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { VerifiedExternalOidcProfile } from './oauth-rp.types';
|
|
2
|
+
/**
|
|
3
|
+
* Internal record stored per issued authorization code.
|
|
4
|
+
* Must be safe for multi-instance deployments (no in-memory Map in final shape).
|
|
5
|
+
*/
|
|
6
|
+
export interface OAuthCodeRecord {
|
|
7
|
+
codeChallenge: string;
|
|
8
|
+
codeChallengeMethod: string;
|
|
9
|
+
/** Server-side PKCE verifier (BFF); optional when SPA sends verifier at token exchange. */
|
|
10
|
+
codeVerifier?: string;
|
|
11
|
+
redirectUri: string;
|
|
12
|
+
clientId: string;
|
|
13
|
+
userId: string;
|
|
14
|
+
/**
|
|
15
|
+
* User/display data needed to mint tokens without re-calling the external IdP.
|
|
16
|
+
* (Kept intentionally because the legacy implementation stores it in the
|
|
17
|
+
* in-process authorization-code record.)
|
|
18
|
+
*/
|
|
19
|
+
userName: string;
|
|
20
|
+
userTitle: string;
|
|
21
|
+
userEmail?: string;
|
|
22
|
+
userPicture?: string;
|
|
23
|
+
provider: string;
|
|
24
|
+
/**
|
|
25
|
+
* Token/ID-token replay protection context.
|
|
26
|
+
*/
|
|
27
|
+
nonce?: string;
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Absolute expiration timestamp (epoch ms).
|
|
31
|
+
*/
|
|
32
|
+
expiresAt: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* State stored during browser redirect to an external IdP.
|
|
36
|
+
*/
|
|
37
|
+
export interface OAuthExternalStateRecord {
|
|
38
|
+
codeChallenge: string;
|
|
39
|
+
codeChallengeMethod: string;
|
|
40
|
+
/** Server-side PKCE verifier when generated by `/connect/authorize/init`. */
|
|
41
|
+
codeVerifier?: string;
|
|
42
|
+
redirectUri: string;
|
|
43
|
+
clientId: string;
|
|
44
|
+
provider: string;
|
|
45
|
+
issuer: string;
|
|
46
|
+
nonce?: string;
|
|
47
|
+
expiresAt: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Registered OAuth/OIDC client definition.
|
|
51
|
+
* Seeded via tenant/application configuration in a later step.
|
|
52
|
+
*/
|
|
53
|
+
export interface OAuthRegisteredClient {
|
|
54
|
+
clientId: string;
|
|
55
|
+
/**
|
|
56
|
+
* Whether the client is allowed to use PKCE public client flow only.
|
|
57
|
+
* Confidential/public determination is required by OAuth/OIDC metadata.
|
|
58
|
+
*/
|
|
59
|
+
publicClient: boolean;
|
|
60
|
+
/** Required for confidential clients at the token endpoint (`client_secret`). */
|
|
61
|
+
clientSecret?: string;
|
|
62
|
+
redirectUris: string[];
|
|
63
|
+
postLogoutRedirectUris: string[];
|
|
64
|
+
allowedScopes: string[];
|
|
65
|
+
allowedGrantTypes: Array<'authorization_code' | 'refresh_token'>;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Normalized output from RP-side verified federation.
|
|
69
|
+
* This is kept as a separate alias so OP can consume RP output cleanly.
|
|
70
|
+
*/
|
|
71
|
+
export interface VerifiedExternalProfileForLinking extends VerifiedExternalOidcProfile {
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=oauth-op.types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-op.types.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-op.types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,KAAK,CAAC,oBAAoB,GAAG,eAAe,CAAC,CAAC;CAClE;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAkC,SAAQ,2BAA2B;CAAG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-op.types.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-op.types.ts"],"names":[],"mappings":";AAAA,yDAAyD;;AAqFzD,YAAY"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the external IdP routing hint from authorize/init parameters.
|
|
3
|
+
*
|
|
4
|
+
* `identity_provider` is the canonical provider routing hint.
|
|
5
|
+
* `acr_values` is accepted only as a legacy alias when `identity_provider` is absent.
|
|
6
|
+
*/
|
|
7
|
+
export declare function resolveOAuthProviderHint(input: Record<string, string | undefined>): string | undefined;
|
|
8
|
+
//# sourceMappingURL=oauth-provider-hint.util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider-hint.util.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-provider-hint.util.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACxC,MAAM,GAAG,SAAS,CAapB"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//#region ---- OAuth provider hint resolution ----
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.resolveOAuthProviderHint = resolveOAuthProviderHint;
|
|
5
|
+
/**
|
|
6
|
+
* Resolves the external IdP routing hint from authorize/init parameters.
|
|
7
|
+
*
|
|
8
|
+
* `identity_provider` is the canonical provider routing hint.
|
|
9
|
+
* `acr_values` is accepted only as a legacy alias when `identity_provider` is absent.
|
|
10
|
+
*/
|
|
11
|
+
function resolveOAuthProviderHint(input) {
|
|
12
|
+
const identityProvider = input['identity_provider']?.trim();
|
|
13
|
+
if (identityProvider) {
|
|
14
|
+
return identityProvider;
|
|
15
|
+
}
|
|
16
|
+
const legacyAcr = input['acr_values']?.trim();
|
|
17
|
+
if (legacyAcr) {
|
|
18
|
+
return legacyAcr;
|
|
19
|
+
}
|
|
20
|
+
const provider = input['provider']?.trim();
|
|
21
|
+
return provider || undefined;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
//# sourceMappingURL=oauth-provider-hint.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-provider-hint.util.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-provider-hint.util.ts"],"names":[],"mappings":";AAAA,kDAAkD;;AAQlD,4DAeC;AArBD;;;;;GAKG;AACH,SAAgB,wBAAwB,CACtC,KAAyC;IAEzC,MAAM,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO,QAAQ,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED,YAAY"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type OidcAdapterPayload = Record<string, unknown> & {
|
|
2
|
+
consumed?: unknown;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Redis-backed oidc-provider adapter (multi-instance safe).
|
|
6
|
+
* Falls back to in-memory Map when Redis is unavailable (dev single instance).
|
|
7
|
+
*/
|
|
8
|
+
export declare class OAuthRedisOidcAdapter {
|
|
9
|
+
private readonly redis;
|
|
10
|
+
private readonly localStore;
|
|
11
|
+
private readonly modelName;
|
|
12
|
+
constructor(name: string);
|
|
13
|
+
private key;
|
|
14
|
+
/** Secondary index: Session (and similar) `uid` → primary id. */
|
|
15
|
+
private uidKey;
|
|
16
|
+
private grantKey;
|
|
17
|
+
upsert(id: string, payload: OidcAdapterPayload, expiresIn: number): Promise<void>;
|
|
18
|
+
find(id: string): Promise<OidcAdapterPayload | undefined>;
|
|
19
|
+
findByUserCode(_userCode: string): Promise<OidcAdapterPayload | undefined>;
|
|
20
|
+
findByUid(uid: string): Promise<OidcAdapterPayload | undefined>;
|
|
21
|
+
private ensureRedis;
|
|
22
|
+
consume(id: string): Promise<void>;
|
|
23
|
+
destroy(id: string): Promise<void>;
|
|
24
|
+
revokeByGrantId(grantId: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=oauth-redis-oidc-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-redis-oidc-adapter.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-redis-oidc-adapter.ts"],"names":[],"mappings":"AAIA,KAAK,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAyB3E;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE,MAAM;IAcxB,OAAO,CAAC,GAAG;IAIX,iEAAiE;IACjE,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAIV,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAgBzD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAI1E,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;YAqBvD,WAAW;IASnB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAetD"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//#region ---- oidc-provider Redis storage adapter ----
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.OAuthRedisOidcAdapter = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
|
|
7
|
+
function resolveOauthRedisConnection() {
|
|
8
|
+
const url = process.env['REDIS_URL']?.trim();
|
|
9
|
+
if (url) {
|
|
10
|
+
return { url };
|
|
11
|
+
}
|
|
12
|
+
const host = process.env['REDIS_HOST']?.trim();
|
|
13
|
+
const portRaw = Number(process.env['REDIS_PORT'] ?? 6379);
|
|
14
|
+
if (host) {
|
|
15
|
+
return { host, port: Number.isFinite(portRaw) ? portRaw : 6379 };
|
|
16
|
+
}
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const GETDEL_SCRIPT = `
|
|
20
|
+
local v = redis.call('GET', KEYS[1])
|
|
21
|
+
if v then
|
|
22
|
+
redis.call('DEL', KEYS[1])
|
|
23
|
+
end
|
|
24
|
+
return v
|
|
25
|
+
`;
|
|
26
|
+
/**
|
|
27
|
+
* Redis-backed oidc-provider adapter (multi-instance safe).
|
|
28
|
+
* Falls back to in-memory Map when Redis is unavailable (dev single instance).
|
|
29
|
+
*/
|
|
30
|
+
class OAuthRedisOidcAdapter {
|
|
31
|
+
constructor(name) {
|
|
32
|
+
this.localStore = new Map();
|
|
33
|
+
this.modelName = name;
|
|
34
|
+
const connection = resolveOauthRedisConnection();
|
|
35
|
+
if (!connection) {
|
|
36
|
+
this.redis = null;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
this.redis =
|
|
40
|
+
'url' in connection
|
|
41
|
+
? new ioredis_1.default(connection.url, { maxRetriesPerRequest: null, lazyConnect: true })
|
|
42
|
+
: new ioredis_1.default({ ...connection, maxRetriesPerRequest: null, lazyConnect: true });
|
|
43
|
+
}
|
|
44
|
+
key(id) {
|
|
45
|
+
return `axp:oidc:${this.modelName}:${id}`;
|
|
46
|
+
}
|
|
47
|
+
/** Secondary index: Session (and similar) `uid` → primary id. */
|
|
48
|
+
uidKey(uid) {
|
|
49
|
+
return `axp:oidc:${this.modelName}:uid:${uid}`;
|
|
50
|
+
}
|
|
51
|
+
grantKey(grantId) {
|
|
52
|
+
return `axp:oidc:grant:${grantId}:${this.modelName}`;
|
|
53
|
+
}
|
|
54
|
+
async upsert(id, payload, expiresIn) {
|
|
55
|
+
const key = this.key(id);
|
|
56
|
+
const value = JSON.stringify(payload);
|
|
57
|
+
const ttlMs = Math.max(1, expiresIn * 1000);
|
|
58
|
+
if (!this.redis) {
|
|
59
|
+
this.localStore.set(key, value);
|
|
60
|
+
if (typeof payload['uid'] === 'string' && payload['uid'].trim()) {
|
|
61
|
+
this.localStore.set(this.uidKey(payload['uid'].trim()), id);
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
await this.ensureRedis();
|
|
66
|
+
await this.redis.set(key, value, 'PX', ttlMs);
|
|
67
|
+
if (typeof payload['uid'] === 'string' && payload['uid'].trim()) {
|
|
68
|
+
await this.redis.set(this.uidKey(payload['uid'].trim()), id, 'PX', ttlMs);
|
|
69
|
+
}
|
|
70
|
+
const grantId = typeof payload['grantId'] === 'string' ? payload['grantId'] : null;
|
|
71
|
+
if (grantId) {
|
|
72
|
+
await this.redis.sadd(this.grantKey(grantId), key);
|
|
73
|
+
await this.redis.pexpire(this.grantKey(grantId), ttlMs);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async find(id) {
|
|
77
|
+
const key = this.key(id);
|
|
78
|
+
if (this.redis) {
|
|
79
|
+
await this.ensureRedis();
|
|
80
|
+
}
|
|
81
|
+
const raw = this.redis
|
|
82
|
+
? (await this.redis.get(key))
|
|
83
|
+
: (this.localStore.get(key) ?? null);
|
|
84
|
+
if (!raw) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
return JSON.parse(raw);
|
|
88
|
+
}
|
|
89
|
+
async findByUserCode(_userCode) {
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
async findByUid(uid) {
|
|
93
|
+
const normalized = uid.trim();
|
|
94
|
+
if (!normalized) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const indexKey = this.uidKey(normalized);
|
|
98
|
+
if (this.redis) {
|
|
99
|
+
await this.ensureRedis();
|
|
100
|
+
}
|
|
101
|
+
const id = this.redis
|
|
102
|
+
? (await this.redis.get(indexKey))
|
|
103
|
+
: (this.localStore.get(indexKey) ?? null);
|
|
104
|
+
if (!id) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
return this.find(id);
|
|
108
|
+
}
|
|
109
|
+
async ensureRedis() {
|
|
110
|
+
if (!this.redis) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
if (this.redis.status === 'wait') {
|
|
114
|
+
await this.redis.connect();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
async consume(id) {
|
|
118
|
+
const record = await this.find(id);
|
|
119
|
+
if (!record) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
record.consumed = Math.floor(Date.now() / 1000);
|
|
123
|
+
const key = this.key(id);
|
|
124
|
+
const value = JSON.stringify(record);
|
|
125
|
+
if (!this.redis) {
|
|
126
|
+
this.localStore.set(key, value);
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const ttl = await this.redis.pttl(key);
|
|
130
|
+
if (ttl > 0) {
|
|
131
|
+
await this.redis.set(key, value, 'PX', ttl);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async destroy(id) {
|
|
135
|
+
const key = this.key(id);
|
|
136
|
+
if (!this.redis) {
|
|
137
|
+
this.localStore.delete(key);
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
await this.redis.del(key);
|
|
141
|
+
}
|
|
142
|
+
async revokeByGrantId(grantId) {
|
|
143
|
+
if (!this.redis) {
|
|
144
|
+
for (const [key] of this.localStore) {
|
|
145
|
+
if (key.includes(grantId)) {
|
|
146
|
+
this.localStore.delete(key);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const keys = await this.redis.smembers(this.grantKey(grantId));
|
|
152
|
+
if (keys.length > 0) {
|
|
153
|
+
await this.redis.del(...keys, this.grantKey(grantId));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.OAuthRedisOidcAdapter = OAuthRedisOidcAdapter;
|
|
158
|
+
//#endregion
|
|
159
|
+
//# sourceMappingURL=oauth-redis-oidc-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-redis-oidc-adapter.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-redis-oidc-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { AuthIdentityProviderBrokerConfig } from '../auth/auth-identity-provider.source';
|
|
2
|
+
import type { VerifiedExternalOidcProfile } from './oauth-rp.types';
|
|
3
|
+
export declare class OAuthRpService {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
private readonly jwksCache;
|
|
6
|
+
private readonly jwksTtlMs;
|
|
7
|
+
/**
|
|
8
|
+
* Builds external IdP authorization URL.
|
|
9
|
+
* This service is RP-only: no session/token issuance.
|
|
10
|
+
*/
|
|
11
|
+
buildAuthorizationUrl(broker: AuthIdentityProviderBrokerConfig, callbackUrl: string, state: string, nonce?: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Exchanges external authorization code for token response.
|
|
14
|
+
* Returns raw id_token (if present) and access_token (for UserInfo fallback).
|
|
15
|
+
*/
|
|
16
|
+
exchangeCode(broker: AuthIdentityProviderBrokerConfig, code: string, callbackUrl: string): Promise<{
|
|
17
|
+
idToken?: string;
|
|
18
|
+
accessToken: string;
|
|
19
|
+
}>;
|
|
20
|
+
/**
|
|
21
|
+
* Verifies external id_token using external JWKS (fetched from issuer).
|
|
22
|
+
* Validates audience + nonce (when expectedNonce is provided) and returns normalized profile.
|
|
23
|
+
* When JWKS is unreachable for Google (common corporate/geo blocks on
|
|
24
|
+
* `www.googleapis.com/.../certs`), falls back to Google `tokeninfo` over
|
|
25
|
+
* `oauth2.googleapis.com` which still cryptographically validates the JWT.
|
|
26
|
+
*/
|
|
27
|
+
verifyAndNormalizeIdToken(rawJwt: string, _broker: AuthIdentityProviderBrokerConfig, expectedNonce?: string, expectedAudience?: string): Promise<VerifiedExternalOidcProfile>;
|
|
28
|
+
private verifyIdTokenWithJwks;
|
|
29
|
+
/**
|
|
30
|
+
* Google tokeninfo validates the ID Token when local JWKS download is blocked
|
|
31
|
+
* (e.g. 403 on www.googleapis.com/oauth2/v3/certs).
|
|
32
|
+
* Prefer POST body so long JWTs are not truncated in the query string.
|
|
33
|
+
*/
|
|
34
|
+
private verifyGoogleIdTokenViaTokenInfo;
|
|
35
|
+
private assertNonce;
|
|
36
|
+
fetchUserInfo(accessToken: string, userInfoUrl: string): Promise<Partial<VerifiedExternalOidcProfile>>;
|
|
37
|
+
/**
|
|
38
|
+
* Resolves the OIDC issuer to compare against ID Token `iss`.
|
|
39
|
+
* Prefer configured `issuerUrl` — token endpoint origin is often wrong
|
|
40
|
+
* (Google: token at oauth2.googleapis.com, iss = accounts.google.com).
|
|
41
|
+
*/
|
|
42
|
+
private resolveExpectedIssuer;
|
|
43
|
+
/**
|
|
44
|
+
* Google historically issues both `https://accounts.google.com` and `accounts.google.com`.
|
|
45
|
+
*/
|
|
46
|
+
private issuersMatch;
|
|
47
|
+
private normalizeIssuerUrl;
|
|
48
|
+
private isGoogleIssuer;
|
|
49
|
+
private fetchJwksWithRotation;
|
|
50
|
+
private fetchJwks;
|
|
51
|
+
private fetchJwksFromUrl;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=oauth-rp.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-rp.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-rp.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AA4BpE,qBACa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkE;IAE5F;;;OAGG;IACH,qBAAqB,CACnB,MAAM,EAAE,gCAAgC,EACxC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,MAAM;IAkBT;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,gCAAgC,EACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAkCrD;;;;;;OAMG;IACG,yBAAyB,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gCAAgC,EACzC,aAAa,CAAC,EAAE,MAAM,EACtB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,2BAA2B,CAAC;YAoEzB,qBAAqB;IAoDnC;;;;OAIG;YACW,+BAA+B;IA+E7C,OAAO,CAAC,WAAW;IASb,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAuB5G;;;;OAIG;YACW,qBAAqB;IAwCnC;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;YAIR,qBAAqB;YA+BrB,SAAS;YA6BT,gBAAgB;CA0B/B"}
|