Skip to content

Commit aaece55

Browse files
committed
feat: decode state and pass targetOrigin in callback handler
- Decode the OAuth state parameter to extract original domain - Add backward compatibility for old state format - Pass targetOrigin to all error and success responses in handleCallback - Ensure postMessage communication is restricted to the originating domain
1 parent 3e551ee commit aaece55

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

src/index.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,11 +195,24 @@ const handleCallback = async (request, env) => {
195195
});
196196
}
197197

198-
if (!csrfToken || state !== csrfToken) {
198+
// Decode the state to get CSRF token and original domain
199+
let stateData;
200+
let originalOrigin = origin;
201+
202+
try {
203+
stateData = JSON.parse(atob(state));
204+
originalOrigin = stateData.origin || origin;
205+
} catch {
206+
// Fallback to old behavior if state is not base64 JSON
207+
stateData = { csrf: state };
208+
}
209+
210+
if (!csrfToken || stateData.csrf !== csrfToken) {
199211
return outputHTML({
200212
provider,
201213
error: 'Potential CSRF attack detected. Authentication flow aborted.',
202214
errorCode: 'CSRF_DETECTED',
215+
targetOrigin: originalOrigin,
203216
});
204217
}
205218

@@ -222,6 +235,7 @@ const handleCallback = async (request, env) => {
222235
provider,
223236
error: 'OAuth app client ID or secret is not configured.',
224237
errorCode: 'MISCONFIGURED_CLIENT',
238+
targetOrigin: originalOrigin,
225239
});
226240
}
227241

@@ -239,6 +253,7 @@ const handleCallback = async (request, env) => {
239253
provider,
240254
error: 'OAuth app client ID or secret is not configured.',
241255
errorCode: 'MISCONFIGURED_CLIENT',
256+
targetOrigin: originalOrigin,
242257
});
243258
}
244259

@@ -274,6 +289,7 @@ const handleCallback = async (request, env) => {
274289
provider,
275290
error: 'Failed to request an access token. Please try again later.',
276291
errorCode: 'TOKEN_REQUEST_FAILED',
292+
targetOrigin: originalOrigin,
277293
});
278294
}
279295

@@ -284,10 +300,11 @@ const handleCallback = async (request, env) => {
284300
provider,
285301
error: 'Server responded with malformed data. Please try again later.',
286302
errorCode: 'MALFORMED_RESPONSE',
303+
targetOrigin: originalOrigin,
287304
});
288305
}
289306

290-
return outputHTML({ provider, token, error });
307+
return outputHTML({ provider, token, error, targetOrigin: originalOrigin });
291308
};
292309

293310
export default {

0 commit comments

Comments
 (0)