OIDC 登录 + 访问资源完整流程

QWEN 的回复


一、场景设定(生活化背景)

你是一个家庭用户,家里有:

  • 一台私有服务器
  • 安装了 Nextcloud(网盘)、Jellyfin(影音库)、Portainer(Docker管理)
  • 你想用 Google 账号登录这些服务,不用再记一堆密码

于是你搭建了一个身份系统:
👉 Google 是“身份认证中心”(OIDC 提供商)
👉 Nextcloud 等是“你要访问的服务”(客户端)
👉 中间有一个“门卫”——Authelia 或直接由服务对接 Google

现在,你打开浏览器,想进入 Nextcloud。


二、完整流程:一步一步讲清楚(共8步)

步骤 1:你访问 Nextcloud

你输入网址:

https://nextcloud.yourdomain.com

但你还没登录。
→ Nextcloud 检查你的浏览器 Cookie,发现:“咦?这个人没登录过。”

步骤 2:Nextcloud 把你“赶”去 Google 登录

Nextcloud 不会自己让你注册账号,它说:

“我不是管身份的,我只管文件。你要登录?去找 Google 证明你是谁!”

于是它把你重定向到一个特殊链接:

https://accounts.google.com/o/oauth2/auth?
  client_id=your-nextcloud-client-id&
  redirect_uri=https://nextcloud.yourdomain.com/auth/openid/callback&
  response_type=code&
  scope=openid email profile

⚠️ 注意这里的 scope=openid email profile —— 这就是 OIDC 的标志,表示:“我要验证身份,不只是授权”。

步骤 3:你看到 Google 登录页

你被带到 Google 的登录界面,看到:

  • 输入邮箱:zhangsan@gmail.com
  • 输入密码
  • 可能还要输验证码或刷脸(2FA)

你填完信息 → 点“下一步”

步骤 4:Google 验证你是谁(认证阶段)

Google 收到你的用户名和密码后:

  • 它不关心你是不是要上传文件
  • 它只做一件事:确认你确实是张三本人

→ 它检查:

  • 密码对不对?
  • 是否开启了双重验证?
  • 邮箱是否真实有效?

确认无误 → Google 生成一个数字身份证(ID Token),内容像这样(简化版):

{
  "sub": "115762983746583476521",   // 唯一用户ID
  "email": "zhangsan@gmail.com",
  "name": "张三",
  "email_verified": true,
  "iss": "https://accounts.google.com",  // 签发者
  "aud": "your-nextcloud-client-id",     // 给谁用的
  "exp": 1717000000                      // 有效期
}

这个 ID Token 是加密签名的 JWT,只有 Google 和 Nextcloud 能验证真伪。

同时,Google 还生成一个临时访问码(Authorization Code):

code=abc123xyz

然后,Google 把你送回 Nextcloud,带着这两个东西:

https://nextcloud.yourdomain.com/auth/openid/callback?code=abc123xyz

步骤 5:Nextcloud 拿着“临时码”去换“正式通行证”

Nextcloud 看到 code=abc123xyz,知道这是 Google 发来的“入场券”,但它不能直接用。

于是它悄悄地(在后台,不经过你)向 Google 发起一个秘密请求

POST https://oauth2.googleapis.com/token
Content-Type: application/x-www-form-urlencoded

client_id=your-nextcloud-client-id&
client_secret=your-secret-key-here&
grant_type=authorization_code&
code=abc123xyz&
redirect_uri=https://nextcloud.yourdomain.com/auth/openid/callback

这里用了 client_secret —— 这是 Nextcloud 和 Google 事先约定好的“暗号”,别人不知道。

步骤 6:Google 返回两个“令牌”

Google 验证了:

  • 这个请求来自合法的 Nextcloud(因为 secret 对得上)
  • 这个 code 是刚刚发出去的,还没用过

于是它返回两个重要东西:

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...xxx",  // 准入卡
  "id_token": "eyJzdWIiOiIxMTU3NjI5ODM3NDY1ODM0NzY1MjEiLCJlbWFpbCI6InpoYW5nc2FuQGdtYWlsLmNvbSJ9...yyy",  // 身份证
  "expires_in": 3600,
  "token_type": "Bearer"
}

Access Token:你可以在接下来 1 小时内用来访问 Google API(比如获取头像)
ID Token:这才是关键!里面包含了你的姓名、邮箱、唯一 ID

步骤 7:Nextcloud 解析你的“身份证”(ID Token)

Nextcloud 拿到 id_token 后,做了四件事:

  1. 解码 JWT:把 Base64 编码的内容转成 JSON
  2. 验证签名:用 Google 的公开密钥,确认这个 ID Token 真的是 Google 签发的,不是伪造的
  3. 核对信息
    • iss 是不是 https://accounts.google.com?→ ✔️ 是
    • aud 是不是我的 Client ID?→ ✔️ 是
    • email_verified 是不是 true?→ ✔️ 是(说明不是钓鱼邮箱)
  4. 提取身份:从 email: zhangsan@gmail.comsub: 115762983746583476521 得知 → 你就是张三

🧠 此时,Nextcloud 心里说:“好,这个人确实是我认识的张三,他用自己的 Google 账号登录了,可信!”

步骤 8:Nextcloud 自动为你创建会话,登录成功!

Nextcloud 做了最后一步:

  • 在自己的数据库里,创建一个本地账户(如果之前没有):
    • 用户名:zhangsan@gmail.com
    • 显示名:张三
    • 来源:OIDC(通过 Google)
  • 设置一个本地登录 Session(就像你以前输密码登录那样)
  • 把你自动带入主界面

🎉 你现在看到的是:

“欢迎回来,张三!你有 23 个文件待整理。”

而你,什么密码都没输,也没注册账号,就进来了!


三、之后还能干什么?访问资源!

你点开“相册” → Nextcloud 想从 Google Drive 里拉取你之前上传的照片。

这时,它就用 Access Token 去调用 Google 的 API:

GET https://www.googleapis.com/drive/v3/files
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...xxx

Google 看到这个 Access Token:

  • 验证它还有效
  • 查看它的权限范围(scope):https://www.googleapis.com/auth/drive.readonly
  • 确认:“哦,这个 token 是张三授权给 Nextcloud 的,允许读取文件”

→ Google 返回照片列表
→ Nextcloud 展示给你看

这就是 OAuth 2.0 的作用:在你授权的前提下,让一个应用帮你访问另一个应用的数据


四、总结:整个流程一句话记住

你用 Google 登录 Nextcloud,不是“把密码告诉 Nextcloud”,而是:
1. Google 验证你是谁 → 给你一张带签名的“身份证”(ID Token);
2. Nextcloud 拿身份证确认你身份 → 自动让你登录;
3. 如果你想看 Google 里的照片,Nextcloud 再拿“访问卡”(Access Token)去借数据。


终极口诀(背下来,终身不忘)

问题 答案
为什么要有 ID Token? 因为它告诉你“你是谁”——没有它,系统不知道该不该让你登录
为什么要有 Access Token? 因为它告诉你“你能做什么”——没有它,你登录了也不能用功能
ID Token 和 Access Token 谁更重要? ID Token 更重要! 没有它,连登录都做不到
我能只用 Access Token 登录吗? ❌ 不行!那叫“冒充”,不是“登录”
这和输用户名密码有什么区别? 以前是你告诉服务“我是张三”,现在是 Google 告诉服务“他是张三”——更安全

最后一句金句:

OIDC 不是让你“登录一个网站”,而是让你“用一个身份,登录所有网站”。
你不再需要为每个服务设密码 —— 你只需要相信 Google、GitHub 或 Keycloak,它们替你证明:“这个人,是真的。”


如果你现在看完这段文字,脑海里能浮现:

“啊,原来 ID Token 是身份证,Access Token 是钥匙,Google 是公安局,Nextcloud 是小区物业…”

那你已经彻底理解了 OIDC 的本质。

上一篇
下一篇