fix(19): WR-02+WR-04 centralize OIDC config (env-or-app_config) and discover auth endpoint
This commit is contained in:
+19
-15
@@ -41,6 +41,7 @@ import {
|
||||
CredentialValidationError,
|
||||
} from '../broker/credentialSync.js';
|
||||
import { hashPassword, verifyPassword } from '../auth/localCredentials.js';
|
||||
import { resolveOidcConfig, discoverAuthorizationEndpoint } from '../auth/oidcConfig.js';
|
||||
// Side-effect import: brings in the ContextVariableMap augmentation for c.get('user')
|
||||
import '../auth/devBypass.js';
|
||||
|
||||
@@ -324,22 +325,25 @@ meRouter.post('/link-oidc', async (c) => {
|
||||
'HS256',
|
||||
);
|
||||
|
||||
// Build the OIDC authorization URL if OIDC is configured (else return null — PWA disables button)
|
||||
const issuer = process.env.OIDC_ISSUER ?? null;
|
||||
const clientId = process.env.OIDC_CLIENT_ID ?? null;
|
||||
const redirectUri = process.env.OIDC_REDIRECT_URI ?? null;
|
||||
|
||||
// Build the OIDC authorization URL if OIDC is configured (else return null — PWA disables button).
|
||||
// WR-04: resolve issuer/clientId/redirectUri from env-OR-app_config (single source of truth,
|
||||
// consistent with /api/auth/mode and the OIDC fallback middleware) so a wizard-configured
|
||||
// instance does not report oidcEnabled:true while returning authorizationUrl:null here.
|
||||
// WR-02: discover the authorization_endpoint from the provider's discovery document instead
|
||||
// of hardcoding Authelia's /api/oidc/authorization path.
|
||||
let authorizationUrl: string | null = null;
|
||||
if (issuer && clientId && redirectUri) {
|
||||
// Construct the authorization URL. plan 19-03 will handle the full PKCE flow;
|
||||
// for now encode the signed state so the callback can read linkUserId.
|
||||
const url = new URL(`${issuer.replace(/\/$/, '')}/api/oidc/authorization`);
|
||||
url.searchParams.set('response_type', 'code');
|
||||
url.searchParams.set('client_id', clientId);
|
||||
url.searchParams.set('redirect_uri', redirectUri);
|
||||
url.searchParams.set('scope', 'openid profile email');
|
||||
url.searchParams.set('state', signedState);
|
||||
authorizationUrl = url.toString();
|
||||
const oidc = await resolveOidcConfig();
|
||||
if (oidc) {
|
||||
const authEndpoint = await discoverAuthorizationEndpoint(oidc.issuer);
|
||||
if (authEndpoint) {
|
||||
const url = new URL(authEndpoint);
|
||||
url.searchParams.set('response_type', 'code');
|
||||
url.searchParams.set('client_id', oidc.clientId);
|
||||
url.searchParams.set('redirect_uri', oidc.redirectUri);
|
||||
url.searchParams.set('scope', 'openid profile email');
|
||||
url.searchParams.set('state', signedState);
|
||||
authorizationUrl = url.toString();
|
||||
}
|
||||
}
|
||||
|
||||
return c.json({ signedState, authorizationUrl }, 200);
|
||||
|
||||
Reference in New Issue
Block a user