Graphical PDS migrator for AT Protocol
1import { oauthClient } from "../../../lib/oauth/client.ts";
2import { getOauthSession } from "../../../lib/oauth/sessions.ts";
3import { define } from "../../../utils.ts";
4
5export const handler = define.handlers({
6 async GET(ctx) {
7 const req = ctx.req;
8 const url = new URL(req.url);
9 const params = url.searchParams;
10 const baseUrl = `${url.protocol}//${url.host}`;
11
12 // Log incoming parameters for debugging
13 console.log("OAuth callback received params:", {
14 state: params.get("state"),
15 iss: params.get("iss"),
16 code: params.get("code"),
17 });
18
19 try {
20 if (!params.get("code")) {
21 throw new Error("No code parameter received");
22 }
23
24 // Get the oauth session first
25 const { session } = await oauthClient.callback(params);
26
27 if (!session?.did) {
28 throw new Error("No DID received in session");
29 }
30
31 // Create response with session cookie
32 const response = new Response(null, {
33 status: 302,
34 headers: new Headers({
35 "Location": "/login/callback",
36 }),
37 });
38
39 // Create and save our client session
40 const clientSession = await getOauthSession(req, response);
41 clientSession.did = session.did;
42 await clientSession.save();
43
44 // Log success with cookie details
45 console.info(
46 `OAuth callback successful for DID: ${session.did}, redirecting to /login/callback`,
47 {
48 cookies: response.headers.get("Set-Cookie"),
49 },
50 );
51
52 return response;
53 } catch (error: unknown) {
54 // Log detailed error information
55 const err = error instanceof Error ? error : new Error(String(error));
56
57 console.error({
58 error: err.message,
59 stack: err.stack,
60 params: Object.fromEntries(params.entries()),
61 }, "OAuth callback failed");
62
63 return Response.redirect(`${baseUrl}/login/callback?error=auth`);
64 }
65 },
66});