Google OAuth 是让用户登录你应用最省力的方式。用户点击一个按钮,Google 负责处理凭证,你的应用拿回一个经过验证的邮箱和稳定的用户 ID。Google Cloud Console 里只需一次性配置,运行时只需几行代码。
每个有用户的应用都必须回答一个问题:用户如何证明自己是自己?传统答案——邮箱加密码——也是代价最高的方案。你得负责密码存储(哈希、加盐,最好别自己造轮子)、密码重置流程(基于邮件、有令牌过期时间、有速率限制)、"忘记密码"界面,以及永无止境的"我登不进去"支持请求。大多数消费类应用有一半的支持工单都源于密码问题,但这些工作对你的产品没有任何附加价值。
OAuth 通过将身份验证委托给现有的身份提供商(这里是 Google)来绕开上述所有问题。你的用户已经登录了 Google,他们点击"使用 Google 登录",Google 只询问一次"是否允许该应用查看你的邮箱",用户点击同意,你的应用便拿到一个包含其邮箱和稳定用户 ID 的 JWT。你永远看不到他们的密码,也永远不需要存储密码,"忘记密码"从此与你无关。
整个实现分为两个部分:枯燥的部分——在 Google 注册应用、获取 client ID 和 client secret、配置授权重定向 URL;有趣的部分——在代码中处理重定向流程、用临时授权码换取真实令牌、查找或创建用户记录。本教程两部分都会覆盖,并重点说明首次接入 OAuth 最容易踩坑的地方。
当用户点击"使用 Google 登录"时,发生了什么:
client secret 永远不会离开你的服务器。授权码是一次性的。会话 cookie 是你的应用后续使用的凭证。每个环节都有其特定的安全属性。
登录 Google Cloud Console,创建一个新项目(左上角"选择项目" → "新建项目"),用你的应用名称命名。该项目是你在 Google Cloud 上所有相关资源的容器。
使用 OAuth 无需开启计费——只有付费的 Google API 才需要绑定账单。登录功能是免费的。
在项目中,进入 APIs & Services → OAuth consent screen,选择 External 用户类型(Internal 仅适用于 Google Workspace 域名)。需要配置:
yourapp.com)。email、profile 和 openid,不要申请超出实际需要的权限。初始状态下应用处于测试模式——只有在同意屏幕设置中列为测试用户的邮箱才能登录,最多可添加 100 个测试用户。上线时需切换到"正式发布"状态(见第 8 步)。
APIs & Services → Credentials → Create Credentials → OAuth client ID。
http://localhost:3000,生产环境填 https://yourapp.com,所有环境都要添加。http://localhost:3000/api/auth/callback/google,生产环境是 https://yourapp.com/api/auth/callback/google。必须完全匹配——末尾斜杠、http 与 https、端口号,一个都不能差。点击创建。Google 会显示你的 Client ID(以 .apps.googleusercontent.com 结尾的长字符串)和 Client Secret(较短,以 GOCSPX- 开头)。将两者复制到你的后端 env 文件中:
GOOGLE_CLIENT_ID=...apps.googleusercontent.com
GOOGLE_CLIENT_SECRET=GOCSPX-...
www 的版本)都加上。
你可以手写 HTTP 调用来实现 OAuth,但几乎没有必要这样做。标准库已经处理了 state 参数(防 CSRF)、JWT 验证、会话管理以及大量边界情况。针对常见技术栈:
next-auth(即 Auth.js),在一个文件里配置好 provider 就行。passport-google-oauth20 策略。以 Next.js 中的 Auth.js 为例,配置大致如下:
import GoogleProvider from "next-auth/providers/google";
export const authOptions = {
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
}),
],
};
加上标准的 Auth.js 路由处理器就够了——二十行代码,一个可用的登录按钮。
OAuth 回调成功后,你拿到了一个经过验证的邮箱和 Google 用户 ID。处理逻辑如下:
将 Google 用户 ID 与邮箱分开存储。邮箱地址在 Google 端理论上可能变更,但 Google ID 永远不变。
同意屏幕处于测试状态时,只有添加到测试用户列表中的邮箱才能登录。将你自己的 Google 账号添加进去,就可以在本地开发服务器上点击"使用 Google 登录"并完成整个流程。
Google 首次呈现的同意屏幕会显示你的应用名称、申请的权限范围,以及"此应用未经验证"的警告(测试模式下)。点击"高级 → 转到 AppName(不安全)"即可继续。正式发布后真实用户不会看到这条警告;在此之前,每个测试用户都会看到。
要为真实用户去掉"未经验证"的警告,需要提交应用进行验证。在 OAuth 同意屏幕页面,点击发布应用 → 提交验证。Google 会审查你的主页、隐私政策以及申请的权限范围。
对于基础权限范围(email、profile、openid),验证通常是自动完成的,往往立即生效。对于敏感权限范围(Gmail 访问、Drive 访问等),验证可能需要数周时间,并需通过安全评估。除非有真实的产品需求,否则坚持使用基础权限范围即可。
验证通过后,"不安全"警告消失,100 个测试用户的上限解除,全球任何 Google 用户都可以登录。