@@ -138,26 +138,23 @@ export async function POST(request: NextRequest) {
138138 pkce : pkce ?? true ,
139139 }
140140
141- const hasExplicitEndpoints = authorizationEndpoint && tokenEndpoint && jwksEndpoint
141+ oidcConfig . authorizationEndpoint = authorizationEndpoint
142+ oidcConfig . tokenEndpoint = tokenEndpoint
143+ oidcConfig . userInfoEndpoint = userInfoEndpoint
144+ oidcConfig . jwksEndpoint = jwksEndpoint
142145
143- if ( hasExplicitEndpoints ) {
144- oidcConfig . authorizationEndpoint = authorizationEndpoint
145- oidcConfig . tokenEndpoint = tokenEndpoint
146- oidcConfig . userInfoEndpoint = userInfoEndpoint
147- oidcConfig . jwksEndpoint = jwksEndpoint
146+ const needsDiscovery =
147+ ! oidcConfig . authorizationEndpoint || ! oidcConfig . tokenEndpoint || ! oidcConfig . jwksEndpoint
148148
149- logger . info ( 'Using explicitly provided OIDC endpoints' , {
150- providerId,
151- issuer,
152- authorizationEndpoint : oidcConfig . authorizationEndpoint ,
153- tokenEndpoint : oidcConfig . tokenEndpoint ,
154- userInfoEndpoint : oidcConfig . userInfoEndpoint ,
155- jwksEndpoint : oidcConfig . jwksEndpoint ,
156- } )
157- } else {
149+ if ( needsDiscovery ) {
158150 const discoveryUrl = `${ issuer . replace ( / \/ $ / , '' ) } /.well-known/openid-configuration`
159151 try {
160- logger . info ( 'Fetching OIDC discovery document' , { discoveryUrl } )
152+ logger . info ( 'Fetching OIDC discovery document for missing endpoints' , {
153+ discoveryUrl,
154+ hasAuthEndpoint : ! ! oidcConfig . authorizationEndpoint ,
155+ hasTokenEndpoint : ! ! oidcConfig . tokenEndpoint ,
156+ hasJwksEndpoint : ! ! oidcConfig . jwksEndpoint ,
157+ } )
161158
162159 const discoveryResponse = await fetch ( discoveryUrl , {
163160 headers : { Accept : 'application/json' } ,
@@ -170,39 +167,21 @@ export async function POST(request: NextRequest) {
170167 } )
171168 return NextResponse . json (
172169 {
173- error : `Failed to fetch OIDC discovery document from ${ discoveryUrl } . Status: ${ discoveryResponse . status } ` ,
170+ error : `Failed to fetch OIDC discovery document from ${ discoveryUrl } . Status: ${ discoveryResponse . status } . Provide all endpoints explicitly or verify the issuer URL. ` ,
174171 } ,
175172 { status : 400 }
176173 )
177174 }
178175
179176 const discovery = await discoveryResponse . json ( )
180177
181- if (
182- ! discovery . authorization_endpoint ||
183- ! discovery . token_endpoint ||
184- ! discovery . jwks_uri
185- ) {
186- logger . error ( 'OIDC discovery document missing required endpoints' , {
187- hasAuthEndpoint : ! ! discovery . authorization_endpoint ,
188- hasTokenEndpoint : ! ! discovery . token_endpoint ,
189- hasJwksUri : ! ! discovery . jwks_uri ,
190- } )
191- return NextResponse . json (
192- {
193- error :
194- 'OIDC discovery document is missing required endpoints (authorization_endpoint, token_endpoint, jwks_uri)' ,
195- } ,
196- { status : 400 }
197- )
198- }
199-
200- oidcConfig . authorizationEndpoint = discovery . authorization_endpoint
201- oidcConfig . tokenEndpoint = discovery . token_endpoint
202- oidcConfig . userInfoEndpoint = discovery . userinfo_endpoint
203- oidcConfig . jwksEndpoint = discovery . jwks_uri
178+ oidcConfig . authorizationEndpoint =
179+ oidcConfig . authorizationEndpoint || discovery . authorization_endpoint
180+ oidcConfig . tokenEndpoint = oidcConfig . tokenEndpoint || discovery . token_endpoint
181+ oidcConfig . userInfoEndpoint = oidcConfig . userInfoEndpoint || discovery . userinfo_endpoint
182+ oidcConfig . jwksEndpoint = oidcConfig . jwksEndpoint || discovery . jwks_uri
204183
205- logger . info ( 'Successfully fetched OIDC endpoints from discovery' , {
184+ logger . info ( 'Merged OIDC endpoints (user-provided + discovery) ' , {
206185 providerId,
207186 issuer,
208187 authorizationEndpoint : oidcConfig . authorizationEndpoint ,
@@ -217,11 +196,44 @@ export async function POST(request: NextRequest) {
217196 } )
218197 return NextResponse . json (
219198 {
220- error : `Failed to fetch OIDC discovery document from ${ discoveryUrl } . Please verify the issuer URL is correct.` ,
199+ error : `Failed to fetch OIDC discovery document from ${ discoveryUrl } . Please verify the issuer URL is correct or provide all endpoints explicitly .` ,
221200 } ,
222201 { status : 400 }
223202 )
224203 }
204+ } else {
205+ logger . info ( 'Using explicitly provided OIDC endpoints (all present)' , {
206+ providerId,
207+ issuer,
208+ authorizationEndpoint : oidcConfig . authorizationEndpoint ,
209+ tokenEndpoint : oidcConfig . tokenEndpoint ,
210+ userInfoEndpoint : oidcConfig . userInfoEndpoint ,
211+ jwksEndpoint : oidcConfig . jwksEndpoint ,
212+ } )
213+ }
214+
215+ if (
216+ ! oidcConfig . authorizationEndpoint ||
217+ ! oidcConfig . tokenEndpoint ||
218+ ! oidcConfig . jwksEndpoint
219+ ) {
220+ const missing : string [ ] = [ ]
221+ if ( ! oidcConfig . authorizationEndpoint ) missing . push ( 'authorizationEndpoint' )
222+ if ( ! oidcConfig . tokenEndpoint ) missing . push ( 'tokenEndpoint' )
223+ if ( ! oidcConfig . jwksEndpoint ) missing . push ( 'jwksEndpoint' )
224+
225+ logger . error ( 'Missing required OIDC endpoints after discovery merge' , {
226+ missing,
227+ authorizationEndpoint : oidcConfig . authorizationEndpoint ,
228+ tokenEndpoint : oidcConfig . tokenEndpoint ,
229+ jwksEndpoint : oidcConfig . jwksEndpoint ,
230+ } )
231+ return NextResponse . json (
232+ {
233+ error : `Missing required OIDC endpoints: ${ missing . join ( ', ' ) } . Please provide these explicitly or verify the issuer supports OIDC discovery.` ,
234+ } ,
235+ { status : 400 }
236+ )
225237 }
226238
227239 providerConfig . oidcConfig = oidcConfig
0 commit comments