44 type UserinfoResponse ,
55 type TokenSet ,
66 custom ,
7+ generators ,
78} from "openid-client" ;
9+ import type { RequestEvent } from "@sveltejs/kit" ;
810import { addHours , addWeeks , differenceInMinutes , subMinutes } from "date-fns" ;
911import { config } from "$lib/server/config" ;
1012import { sha256 } from "$lib/utils/sha256" ;
@@ -54,7 +56,7 @@ export const OIDConfig = z
5456 } )
5557 . parse ( JSON5 . parse ( config . OPENID_CONFIG || "{}" ) ) ;
5658
57- export const loginEnabled = ! ! OIDConfig . CLIENT_ID && ! ! OIDConfig . CLIENT_SECRET ;
59+ export const loginEnabled = ! ! OIDConfig . CLIENT_ID ;
5860
5961const sameSite = z
6062 . enum ( [ "lax" , "none" , "strict" ] )
@@ -264,8 +266,8 @@ async function getOIDCClient(settings: OIDCSettings, url: URL): Promise<BaseClie
264266 } ;
265267
266268 if ( OIDConfig . CLIENT_ID === "__CIMD__" ) {
267- OIDConfig . CLIENT_ID = new URL (
268- " /.well-known/oauth-cimd" ,
269+ client_config . client_id = new URL (
270+ ` ${ base } /.well-known/oauth-cimd` ,
269271 config . PUBLIC_ORIGIN || url . origin
270272 ) . toString ( ) ;
271273 }
@@ -281,7 +283,7 @@ async function getOIDCClient(settings: OIDCSettings, url: URL): Promise<BaseClie
281283
282284export async function getOIDCAuthorizationUrl (
283285 settings : OIDCSettings ,
284- params : { sessionId : string ; next ?: string ; url : URL }
286+ params : { sessionId : string ; next ?: string ; url : URL ; cookies : Cookies }
285287) : Promise < string > {
286288 const client = await getOIDCClient ( settings , params . url ) ;
287289 const csrfToken = await generateCsrfToken (
@@ -290,7 +292,20 @@ export async function getOIDCAuthorizationUrl(
290292 sanitizeReturnPath ( params . next )
291293 ) ;
292294
295+ const codeVerifier = generators . codeVerifier ( ) ;
296+ const codeChallenge = generators . codeChallenge ( codeVerifier ) ;
297+
298+ params . cookies . set ( "hfChat-codeVerifier" , codeVerifier , {
299+ path : "/" ,
300+ sameSite,
301+ secure,
302+ httpOnly : true ,
303+ expires : addHours ( new Date ( ) , 1 ) ,
304+ } ) ;
305+
293306 return client . authorizationUrl ( {
307+ code_challenge_method : "S256" ,
308+ code_challenge : codeChallenge ,
294309 scope : OIDConfig . SCOPES ,
295310 state : csrfToken ,
296311 resource : OIDConfig . RESOURCE || undefined ,
@@ -300,11 +315,19 @@ export async function getOIDCAuthorizationUrl(
300315export async function getOIDCUserData (
301316 settings : OIDCSettings ,
302317 code : string ,
318+ codeVerifier : string ,
303319 iss : string | undefined ,
304320 url : URL
305321) : Promise < OIDCUserInfo > {
306322 const client = await getOIDCClient ( settings , url ) ;
307- const token = await client . callback ( settings . redirectURI , { code, iss } ) ;
323+ const token = await client . callback (
324+ settings . redirectURI ,
325+ {
326+ code,
327+ iss,
328+ } ,
329+ { code_verifier : codeVerifier }
330+ ) ;
308331 const userData = await client . userinfo ( token ) ;
309332
310333 return { token, userData } ;
@@ -514,14 +537,7 @@ export async function authenticateRequest(
514537 return { user : undefined , sessionId, secretSessionId, isAdmin : false } ;
515538}
516539
517- export async function triggerOauthFlow ( {
518- url,
519- locals,
520- } : {
521- request : Request ;
522- url : URL ;
523- locals : App . Locals ;
524- } ) : Promise < Response > {
540+ export async function triggerOauthFlow ( { url, locals, cookies } : RequestEvent ) : Promise < Response > {
525541 // const referer = request.headers.get("referer");
526542 // let redirectURI = `${(referer ? new URL(referer) : url).origin}${base}/login/callback`;
527543 let redirectURI = `${ url . origin } ${ base } /login/callback` ;
@@ -551,7 +567,7 @@ export async function triggerOauthFlow({
551567
552568 const authorizationUrl = await getOIDCAuthorizationUrl (
553569 { redirectURI } ,
554- { sessionId : locals . sessionId , next, url }
570+ { sessionId : locals . sessionId , next, url, cookies }
555571 ) ;
556572
557573 throw redirect ( 302 , authorizationUrl ) ;
0 commit comments