教程 搜索 / 后端集成 / 使用 Google 登录(OAuth)
📝 文字 ● 中级 更新于 2026-05-13

使用 Google 登录(OAuth)

Google OAuth 是让用户登录你应用最省力的方式。用户点击一个按钮,Google 负责处理凭证,你的应用拿回一个经过验证的邮箱和稳定的用户 ID。Google Cloud Console 里只需一次性配置,运行时只需几行代码。

每个有用户的应用都必须回答一个问题:用户如何证明自己是自己?传统答案——邮箱加密码——也是代价最高的方案。你得负责密码存储(哈希、加盐,最好别自己造轮子)、密码重置流程(基于邮件、有令牌过期时间、有速率限制)、"忘记密码"界面,以及永无止境的"我登不进去"支持请求。大多数消费类应用有一半的支持工单都源于密码问题,但这些工作对你的产品没有任何附加价值。

OAuth 通过将身份验证委托给现有的身份提供商(这里是 Google)来绕开上述所有问题。你的用户已经登录了 Google,他们点击"使用 Google 登录",Google 只询问一次"是否允许该应用查看你的邮箱",用户点击同意,你的应用便拿到一个包含其邮箱和稳定用户 ID 的 JWT。你永远看不到他们的密码,也永远不需要存储密码,"忘记密码"从此与你无关。

整个实现分为两个部分:枯燥的部分——在 Google 注册应用、获取 client ID 和 client secret、配置授权重定向 URL;有趣的部分——在代码中处理重定向流程、用临时授权码换取真实令牌、查找或创建用户记录。本教程两部分都会覆盖,并重点说明首次接入 OAuth 最容易踩坑的地方。

你将学到

第 1 步:用白话理解整个流程

1

四个角色:用户、浏览器、你的服务器、Google

当用户点击"使用 Google 登录"时,发生了什么:

  1. 你的服务器将浏览器重定向到一个带有你的 client ID 和回调 URL 的 Google 链接。
  2. Google 询问用户"是否允许该应用查看你的邮箱?"用户点击允许。
  3. Google 将浏览器重定向回你的回调 URL,并附带一个临时的授权码
  4. 你的服务器拿到这个授权码,携带 client secret 向 Google 发送 POST 请求,换回一个ID token——一个包含用户邮箱、姓名、Google 用户 ID 等信息的 JWT。
  5. 你的服务器验证 JWT 签名(证明它确实来自 Google),创建会话,设置 cookie,重定向到你的应用。

client secret 永远不会离开你的服务器。授权码是一次性的。会话 cookie 是你的应用后续使用的凭证。每个环节都有其特定的安全属性。

第 2 步:创建 Google Cloud 项目

2

console.cloud.google.com

登录 Google Cloud Console,创建一个新项目(左上角"选择项目" → "新建项目"),用你的应用名称命名。该项目是你在 Google Cloud 上所有相关资源的容器。

使用 OAuth 无需开启计费——只有付费的 Google API 才需要绑定账单。登录功能是免费的。

第 3 步:配置 OAuth 同意屏幕

3

用户授权时看到的界面

在项目中,进入 APIs & Services → OAuth consent screen,选择 External 用户类型(Internal 仅适用于 Google Workspace 域名)。需要配置:

  • App name:用户看到的名称(如"登录到 AppName")。
  • User support email:一个你会实际查看的真实邮箱地址。
  • Authorized domains:你的生产域名(例如 yourapp.com)。
  • Developer contact email:通常填你自己的邮箱。
  • Scopes:基础登录只需申请 emailprofileopenid,不要申请超出实际需要的权限。

初始状态下应用处于测试模式——只有在同意屏幕设置中列为测试用户的邮箱才能登录,最多可添加 100 个测试用户。上线时需切换到"正式发布"状态(见第 8 步)。

第 4 步:创建 OAuth 客户端凭证

4

获取 client ID 和 client secret

APIs & Services → Credentials → Create Credentials → OAuth client ID

  • Application type:选 Web application。
  • Name:仅供内部识别,用户不可见。
  • Authorized JavaScript origins:你的应用 URL。开发环境填 http://localhost:3000,生产环境填 https://yourapp.com,所有环境都要添加。
  • Authorized redirect URIs:Google 回传授权码的地址。开发环境通常是 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-...
重定向 URI 不匹配是最常见的错误。如果你的代码发送的重定向 URI 与授权列表中的任何一条不完全匹配,Google 会返回"redirect_uri_mismatch"——没有模糊匹配,也没有任何有用的提示。提前把所有会用到的变体(开发、预发布、生产环境,以及带不带 www 的版本)都加上。

第 5 步:实现流程(或使用现成库)

5

NextAuth / Auth.js / Passport / Clerk——选一个

你可以手写 HTTP 调用来实现 OAuth,但几乎没有必要这样做。标准库已经处理了 state 参数(防 CSRF)、JWT 验证、会话管理以及大量边界情况。针对常见技术栈:

  • Next.js:next-auth(即 Auth.js),在一个文件里配置好 provider 就行。
  • Express / Node:Passport.js 配合 passport-google-oauth20 策略。
  • Django:django-allauth。
  • Rails:omniauth + omniauth-google-oauth2。
  • 任何现代框架:Clerk、Auth0、Supabase Auth——Auth 即服务,支持 Google 及其他十多个 provider。

以 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 路由处理器就够了——二十行代码,一个可用的登录按钮。

第 6 步:处理用户记录

6

首次登录创建记录,后续登录查找记录

OAuth 回调成功后,你拿到了一个经过验证的邮箱和 Google 用户 ID。处理逻辑如下:

  1. 按 Google ID 在数据库中查找用户。如果找到,该用户即为当前会话用户。
  2. 如果没找到,按邮箱查找。如果找到,将 Google 账号关联到该用户(这处理了"先用邮箱密码注册、后来改用 Google 登录"的情况)。
  3. 如果两者都没有匹配,则用该邮箱、姓名和 Google ID 创建新用户记录。

将 Google 用户 ID 与邮箱分开存储。邮箱地址在 Google 端理论上可能变更,但 Google ID 永远不变。

第 7 步:在本地测试

7

开发阶段使用测试用户列表

同意屏幕处于测试状态时,只有添加到测试用户列表中的邮箱才能登录。将你自己的 Google 账号添加进去,就可以在本地开发服务器上点击"使用 Google 登录"并完成整个流程。

Google 首次呈现的同意屏幕会显示你的应用名称、申请的权限范围,以及"此应用未经验证"的警告(测试模式下)。点击"高级 → 转到 AppName(不安全)"即可继续。正式发布后真实用户不会看到这条警告;在此之前,每个测试用户都会看到。

第 8 步:正式上线验证

8

"不安全"警告仅在测试阶段出现

要为真实用户去掉"未经验证"的警告,需要提交应用进行验证。在 OAuth 同意屏幕页面,点击发布应用 → 提交验证。Google 会审查你的主页、隐私政策以及申请的权限范围。

对于基础权限范围(emailprofileopenid),验证通常是自动完成的,往往立即生效。对于敏感权限范围(Gmail 访问、Drive 访问等),验证可能需要数周时间,并需通过安全评估。除非有真实的产品需求,否则坚持使用基础权限范围即可。

验证通过后,"不安全"警告消失,100 个测试用户的上限解除,全球任何 Google 用户都可以登录。

一个项目管理所有环境。使用单个 Google Cloud 项目,一次性把所有重定向 URI(开发、预发布、生产)都加进去,而不是为每个环境单独创建项目。这样更易管理,所有环境共用同一个 client ID,验证开销也更小。

接下来