@@ -2,7 +2,7 @@ import { NextRequest, NextResponse } from "next/server";
22import { auth } from "@/auth" ;
33import jwt from "jsonwebtoken" ;
44
5- const { APP_SECRET } = process . env ;
5+ const { APP_SECRET , TRUSTED_DOMAINS } = process . env ;
66
77const cspLinks = [
88 "'self'" ,
@@ -45,8 +45,64 @@ export async function proxy(request: NextRequest) {
4545 ] ;
4646 const isPublicApiRoute = publicApiRoutes . some ( route => currentPath . startsWith ( route ) ) ;
4747
48- // If it's an API route (not public), check for Bearer token if provided
48+ // If it's an API route (not public), check for trusted domains first, then Bearer token
4949 if ( isApiRoute && ! isPublicApiRoute ) {
50+ // Check if request is from a trusted domain
51+ const origin = request . headers . get ( 'origin' ) ;
52+ const referer = request . headers . get ( 'referer' ) ;
53+
54+ if ( TRUSTED_DOMAINS ) {
55+ const trustedDomains = TRUSTED_DOMAINS . split ( ',' ) . map ( d => d . trim ( ) ) ;
56+ const requestDomain = origin || ( referer ? new URL ( referer ) . origin : null ) ;
57+
58+ if ( requestDomain && trustedDomains . includes ( requestDomain ) ) {
59+
60+ // Generate automatic API token for trusted domain with rights level 3
61+ try {
62+ const trustedToken = jwt . sign (
63+ {
64+ type : 'api_access' ,
65+ uuid : 'trusted-domain-user' ,
66+ email : 'trusted@domain.auto' ,
67+ rights : 3 ,
68+ name : 'Trusted Domain User' ,
69+ trusted_domain : requestDomain ,
70+ iat : Math . floor ( Date . now ( ) / 1000 ) ,
71+ } ,
72+ APP_SECRET || 'fallback-secret-key' ,
73+ {
74+ expiresIn : '1h' , // Short-lived token for security
75+ audience : 'sdg-innovation-commons' ,
76+ issuer : 'sdg-innovation-commons' ,
77+ }
78+ ) ;
79+
80+ // Add trusted user info to headers for API routes to use
81+ const requestHeaders = new Headers ( request . headers ) ;
82+ requestHeaders . set ( 'x-api-user-uuid' , 'trusted-domain-user' ) ;
83+ requestHeaders . set ( 'x-api-user-email' , 'trusted@domain.auto' ) ;
84+ requestHeaders . set ( 'x-api-user-rights' , '3' ) ;
85+ requestHeaders . set ( 'x-api-user-name' , 'Trusted Domain User' ) ;
86+ requestHeaders . set ( 'x-api-authenticated' , 'true' ) ;
87+ requestHeaders . set ( 'x-api-trusted-domain' , requestDomain ) ;
88+ requestHeaders . set ( 'x-api-auto-generated' , 'true' ) ;
89+
90+ console . log ( `✅ Auto-generated token for trusted domain: ${ requestDomain } with rights level 3` ) ;
91+
92+ const response = NextResponse . next ( {
93+ request : {
94+ headers : requestHeaders ,
95+ } ,
96+ } ) ;
97+
98+ return response ;
99+ } catch ( error ) {
100+ console . error ( 'Error generating trusted domain token:' , error ) ;
101+ // Continue to regular token validation if auto-generation fails
102+ }
103+ }
104+ }
105+
50106 const authHeader = request . headers . get ( 'authorization' ) ;
51107
52108 // Check for token in multiple places: header, query params, or body
0 commit comments