UNPKG

@raddiamond/nexauth-core

Version:

Core authentication plugin supporting Local, AD authentication

94 lines (93 loc) 3.13 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.TenantManager = void 0; const Tenant_1 = require("../entities/Tenant"); /** * Manages tenant contexts and client secret generation using the database */ class TenantManager { constructor(db) { this.db = db; } /** * Register a new tenant in the database */ async registerTenant(tenantData) { const repo = this.db.getRepository(Tenant_1.Tenant); let tenant = await repo.findOne({ where: { tenantId: tenantData.tenantId } }); if (!tenant) { tenant = repo.create(tenantData); await repo.save(tenant); } return tenant; } /** * Get a tenant by tenantId */ async getTenant(tenantId) { const repo = this.db.getRepository(Tenant_1.Tenant); return await repo.findOne({ where: { tenantId } }) || undefined; } /** * Validate client credentials for a tenant */ async validateClientCredentials(tenantId, clientId) { const tenant = await this.getTenant(tenantId); if (!tenant) return false; if (tenant.clientId !== clientId) return false; return true; } /** * Generate a client secret for a tenant (utility) */ async generateClientSecret(tenantId) { const repo = this.db.getRepository(Tenant_1.Tenant); const tenant = await repo.findOne({ where: { tenantId } }); if (!tenant) { throw new Error(`Tenant ${tenantId} not found`); } // Generate a random secret const clientSecret = require('crypto').randomBytes(32).toString('hex'); tenant.clientSecret = clientSecret; await repo.save(tenant); return clientSecret; } /** * Configure UI provider for a tenant */ async configureUIProvider(tenantId, clientId, redirectUrl, allowedOrigins) { const repo = this.db.getRepository(Tenant_1.Tenant); let tenant = await repo.findOne({ where: { tenantId } }); if (!tenant) { tenant = repo.create({ tenantId, clientId, identityProviderType: 'ui', redirectUrl, allowedOrigins, clientSecret: require('crypto').randomBytes(32).toString('hex'), }); await repo.save(tenant); } else { // Update fields if needed tenant.clientId = clientId; tenant.identityProviderType = 'ui'; tenant.redirectUrl = redirectUrl; tenant.allowedOrigins = allowedOrigins; if (!tenant.clientSecret) { tenant.clientSecret = require('crypto').randomBytes(32).toString('hex'); } await repo.save(tenant); } return { clientId: tenant.clientId, clientSecret: tenant.clientSecret, redirectUrl: tenant.redirectUrl, allowedOrigins: tenant.allowedOrigins || [], }; } } exports.TenantManager = TenantManager;