1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| // src/app/api/auth/google/route.ts
export async function GET() {
const state = generateState();
const codeVerifier = generateCodeVerifier();
const url = google.createAuthorizationURL(state, codeVerifier, [
"openid",
"email",
"profile",
]);
// 存储 state 和 codeVerifier 到 Cookie
const response = new Response(null, {
status: 302,
headers: { Location: url.toString() },
});
setCookie(response, "google_oauth_state", state, { httpOnly: true });
setCookie(response, "google_code_verifier", codeVerifier, { httpOnly: true });
return response;
}
// src/app/api/auth/google/callback/route.ts
export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const code = searchParams.get("code");
const state = searchParams.get("state");
// 验证 state
const storedState = getCookie(request, "google_oauth_state");
if (state !== storedState) {
return new Response("Invalid state", { status: 400 });
}
// 换取 token
const tokens = await google.validateAuthorizationCode(code, codeVerifier);
const googleUser = await getGoogleUser(tokens.accessToken);
// 查找或创建用户
let user = await db.query.userTable.findFirst({
where: eq(userTable.googleAccountId, googleUser.sub),
});
if (!user) {
user = await createUserFromGoogle(googleUser);
}
// 创建 Session
const sessionId = await createSession(user.id);
await setSessionCookie(sessionId);
return redirect("/dashboard");
}
|