@@ -5,14 +5,25 @@ import { createServer } from "./server.js";
55const CORS_ORIGIN = "*" ;
66const CORS_METHODS = "GET, POST, DELETE, OPTIONS" ;
77const CORS_ALLOWED_HEADERS =
8- "Content-Type, Authorization, X-Honcho-User-Name, X-Honcho- Workspace-ID, X-Honcho-Assistant-Name " ;
8+ "Content-Type, Authorization, X-Honcho-Workspace-ID" ;
99
1010const CORS_HEADERS = {
1111 "Access-Control-Allow-Origin" : CORS_ORIGIN ,
1212 "Access-Control-Allow-Methods" : CORS_METHODS ,
1313 "Access-Control-Allow-Headers" : CORS_ALLOWED_HEADERS ,
14+ "Access-Control-Expose-Headers" : "WWW-Authenticate" ,
1415} ;
1516
17+ const PROTECTED_RESOURCE_PATH = "/.well-known/oauth-protected-resource" ;
18+
19+ function resourceUrl ( request : Request ) : string {
20+ return new URL ( request . url ) . origin ;
21+ }
22+
23+ function authorizationServer ( env : Env ) : string {
24+ return env . HONCHO_API_URL ?. trim ( ) || "https://api.honcho.dev" ;
25+ }
26+
1627export default {
1728 async fetch (
1829 request : Request ,
@@ -23,15 +34,34 @@ export default {
2334 return new Response ( null , { status : 204 , headers : CORS_HEADERS } ) ;
2435 }
2536
37+ // Protected Resource Metadata (RFC 9728) — served without auth so clients
38+ // can discover the authorization server.
39+ if ( new URL ( request . url ) . pathname === PROTECTED_RESOURCE_PATH ) {
40+ return Response . json (
41+ {
42+ resource : resourceUrl ( request ) ,
43+ authorization_servers : [ authorizationServer ( env ) ] ,
44+ bearer_methods_supported : [ "header" ] ,
45+ } ,
46+ { headers : CORS_HEADERS } ,
47+ ) ;
48+ }
49+
2650 let config ;
2751 try {
2852 config = parseConfig ( request , env ) ;
2953 } catch ( e ) {
3054 const message =
3155 e instanceof Error ? e . message : "Invalid request" ;
56+ // WWW-Authenticate points clients at the metadata so they start the OAuth flow.
57+ const resourceMetadata = `${ resourceUrl ( request ) } ${ PROTECTED_RESOURCE_PATH } ` ;
3258 return new Response ( JSON . stringify ( { error : message } ) , {
3359 status : 401 ,
34- headers : { "Content-Type" : "application/json" , ...CORS_HEADERS } ,
60+ headers : {
61+ "Content-Type" : "application/json" ,
62+ "WWW-Authenticate" : `Bearer resource_metadata="${ resourceMetadata } "` ,
63+ ...CORS_HEADERS ,
64+ } ,
3565 } ) ;
3666 }
3767
0 commit comments