· Research AI
Research AI 的 Google OAuth:登录流程到底怎么工作
Research AI 允许游客免费使用已缓存的学习主题。Gmail 登录后,可以解锁不限次数的实时 AI research。
在 UI 上,这只是一个按钮:Sign in with Google。但在系统里,至少有四个部分必须对齐:
- Google Cloud 管 OAuth client。
- Vercel 管生产环境变量。
- Auth.js / NextAuth 管 callback route。
- Research AI 管产品规则:登录用户跳过 demo 实时次数限制。
任何一环不对,用户看到的通常只是一个笼统的登录失败。
先建立心智模型
OAuth 不是把 Google 密码交给我们的 app。它是一个 redirect 握手流程。
用户
-> Research AI /login
-> Auth.js 生成 Google 授权 URL
-> Google 让用户确认授权
-> Google redirect 回 Research AI callback URL
-> Auth.js 用 GOOGLE_CLIENT_SECRET 换取 token
-> Research AI 建立 session
最关键的是 callback:
https://research.xingai.app/api/auth/callback/google
这条 URI 必须出现在 Google Cloud 的 Authorized redirect URIs 里。协议、域名、路径、末尾斜杠都必须完全一致。
每个变量负责什么
GOOGLE_CLIENT_ID 用来标识这个 OAuth 应用。它不是特别敏感,但必须来自 Google Cloud 里同一个 OAuth client。
GOOGLE_CLIENT_SECRET 用来证明服务器有权限使用这个 OAuth client 去交换授权码。它是敏感信息,只应该放在服务端环境,比如 Vercel Production env 或本地 .env.local。
AUTH_SECRET 用来签名 Auth.js cookie 和 session token。
AUTH_URL 和 NEXTAUTH_URL 告诉 Auth.js 生产环境的标准域名。Research AI 使用:
AUTH_URL=https://research.xingai.app
NEXTAUTH_URL=https://research.xingai.app
Google Cloud 怎么设置
打开:
https://console.cloud.google.com/apis/credentials
然后:
- 选择拥有这个 OAuth client 的 Google Cloud project。
- 进入 Credentials。
- 在 OAuth 2.0 Client IDs 下,打开 Research AI 使用的 Web client。
- 确认 Application type 是 Web application。
- 在 Authorized JavaScript origins 里添加:
https://research.xingai.app
- 在 Authorized redirect URIs 里添加:
https://research.xingai.app/api/auth/callback/google
- 保存,并等待 Google 生效。通常几十秒到几分钟。
本地开发可以额外添加:
http://localhost:3000/api/auth/callback/google
Vercel 怎么设置
在 Vercel Production 环境变量里添加:
AUTH_SECRET=<32+ character random string>
AUTH_URL=https://research.xingai.app
NEXTAUTH_URL=https://research.xingai.app
GOOGLE_CLIENT_ID=<Google OAuth web client id>
GOOGLE_CLIENT_SECRET=<Google OAuth web client secret>
Vercel env 改完后,必须重新部署。旧 deployment 不会自动读取新 env。
cd /Users/xing/Desktop/ai-projects-work-space/xingai-research-ai
vercel deploy --prod --yes --force
部署完成后应该看到:
readyState: READY
Aliased: https://research.xingai.app
Research AI 里的实现位置
Research AI 使用 Auth.js / NextAuth。
关键文件:
auth.ts
lib/oauth-credentials.ts
lib/auth-config.ts
app/api/auth/[...nextauth]/route.ts
app/actions/auth.ts
app/login/page.tsx
OAuth client 会从这些变量里读取:
GOOGLE_CLIENT_ID
GOOGLE_CLIENT_SECRET
AUTH_GOOGLE_ID
AUTH_GOOGLE_SECRET
AUTH_GOOGLE_CLIENT_ID
AUTH_GOOGLE_CLIENT_SECRET
只需要一组有效的 id/secret。不要把一个 Google Cloud OAuth client 的 id 和另一个 client 的 secret 混用。
Research AI 如何使用登录身份
产品规则不是“先登录才能用”。规则是:
已缓存主题免费。
匿名用户每天有限次实时 AI research。
Gmail / @xingai.app 登录用户跳过实时次数限制。
前端在服务端解析 session 后,把验证过的身份传给 API;API 不能信任它无法验证的身份。缓存命中的主题读取不受登录影响。
常见失败
1. 登录页提示添加 GOOGLE_CLIENT_ID / SECRET
说明当前 active deployment 没有读到完整 auth 配置。
先看:
vercel env ls
然后重新部署:
vercel deploy --prod --yes --force
2. 登录页显示 “Sign-in failed”
说明 app 已经有部分 auth 配置,但 Google 拒绝了 OAuth 握手。
最常见原因:
- Google Cloud 没有添加 Authorized redirect URI。
- redirect URI 用了
http,生产环境应该是https。 - 生产环境 redirect URI 仍然是 localhost。
GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET来自不同 OAuth client。- Vercel env 改了,但没有重新 deploy。
research.xingai.app还 alias 到旧 deployment。
3. curl 直接 POST 出现 MissingCSRF
这是正常的。Auth.js 的 sign-in endpoint 需要先拿 CSRF token 和 cookie。
浏览器点击按钮时会自动处理。
4. Vercel 已 Ready,但域名还是旧页面
检查 deployment:
vercel inspect <deployment-url>
确认 aliases 包含:
https://research.xingai.app
如果没有,手动绑定:
vercel alias set <deployment-url> research.xingai.app
Smoke Test
重新部署后:
curl -I https://research.xingai.app/login
预期:
HTTP/2 200
x-matched-path: /login
然后在浏览器测试:
- 打开
https://research.xingai.app/login。 - 点击 Sign in with Google。
- 应该进入 Google account chooser。
- 授权后回到 Research AI 首页。
经验总结
OAuth 失败看起来像 UI bug,但大多数时候是配置契约不一致。
Research AI 的契约是:
Google Cloud redirect URI
== Auth.js callback route
== Vercel production domain
== active deployment alias
这四件事一致以后,Google 登录就应该变得很无聊。无聊,就是生产系统最好的状态。