京东用微信登录时,幕后到底发生了什么?

从一个6亿人都在用的功能说起

“微信一键登录”——这可能是你每天都会用到的功能。

用京东购物,点一下“微信登录”,就能自动识别你是谁。但你有没有想过一个看似矛盾的问题:

京东怎么拿到你的微信头像和昵称的?它知道你的微信密码吗?

答案是:京东永远不知道你的微信密码。

那它是怎么做到的?这背后,就是今天的主角——OAuth 2.0 授权码模式

本文会用“京东App用微信授权登录”这个真实场景,从头到尾拆解每一步发生了什么。读完你会彻底理解这个互联网最核心的授权协议。


一、四个角色,一台好戏

在正式开讲之前,先认识一下 OAuth 2.0 里的四位主角。在“京东用微信登录”这个场景中,他们分别是:

角色 对应实体 职责
资源拥有者 你(用户) 你拥有微信账号、头像、昵称的所有权
客户端 京东App 想获取你微信信息的第三方应用
授权服务器 微信开放平台登录系统 验证你的身份,颁发授权码和令牌
资源服务器 微信用户信息数据库 存储你的头像、昵称等数据

这四者之间如何配合?我们一步步来看。


二、整体流程概览:三步走

整个过程可以总结为三个阶段:

  1. 申请“临时访客条”——用户在微信侧完成授权,拿到授权码(code)
  2. 后台换“门禁卡”——京东后台用授权码换取 access_token
  3. 刷卡进门——用 access_token 获取用户信息,完成登录

下面我们来拆解每一个环节的细节。


三、第一步:在微信的地盘拿“临时访客条”

这一步最关键的原则是:你的微信密码,京东绝对碰不到。

1. 发起授权请求

你在京东App登录页面,点了那个绿色的“微信登录”按钮。

京东App随即向微信开放平台发起一个精心构造的HTTP请求:

GET https://open.weixin.qq.com/connect/oauth2/authorize?
    appid=wx_jd_app_id_123456&
    redirect_uri=https%3A%2F%2Fjd.com%2Fcallback&
    response_type=code&
    scope=snsapi_userinfo&
    state=random_string_abc123

每个参数都不可或缺,我们逐一解释:

参数 含义 示例值
appid 京东在微信开放平台注册得到的唯一身份ID wx_jd_app_id_123456
redirect_uri 授权完成后,微信把用户送回哪里 https://jd.com/callback
response_type 指定授权模式,code 代表授权码模式 code
scope 请求的权限范围 snsapi_userinfo(获取详细用户信息)
state 防止CSRF攻击的随机字符串,京东会校验收到的值 random_string_abc123

2. 用户亲眼确认授权

你的手机屏幕会从京东跳转到微信(或弹起微信授权页面),上面清晰地写着:

京东 申请获得以下权限:

  • 获得你的公开信息(昵称、头像、地区等)

你必须亲自点击“同意”,这一步没人能代替。

3. 拿到一次性授权码

你点完“同意”后,微信不会直接把你的信息扔给京东,而是做了一件事:

微信的服务器告诉你的手机:“好,现在回京东去。” 你的手机按照京东之前给的 redirect_uri,把页面跳转回去,但在地址栏后面,微信偷偷塞了一个东西:

GET https://jd.com/callback?code=081x7cFa1xxxxx&state=random_string_abc123

这个 code 就是授权码

它的特点是:

  • 一次性:用完即废
  • 短有效期:通常只有几分钟
  • 暴露在前端也无妨:因为仅凭一个 code 做不了任何事

四、第二步:后台用“条”换“门禁卡”

这是整个流程中最关键的安全防线

4. 前端把 code 传给后台

京东App的前端拿到了 code,但它自己不能用。它把这个 code 通过网络请求,交给了京东自己的后台服务器

为什么要交给后台?
因为待会儿要用到一个叫 AppSecret 的东西——这是京东存在自己服务器上的“核心机密”,绝对不能出现在前端代码里。否则任何人拿到都能伪装成京东App。

5. 后台发起令牌请求

京东后台服务器拿着 code,连同自己的凭证,向微信的另一个接口发起请求:

POST https://api.weixin.qq.com/sns/oauth2/access_token?
    appid=wx_jd_app_id_123456&
    secret=jd_wechat_app_secret_xyz&
    code=081x7cFa1xxxxx&
    grant_type=authorization_code

注意这里多出来的三个关键信息:

参数 含义
secret 京东在微信开放平台拿到的 AppSecret,绝密,必须放后台
code 刚才拿到的临时授权码
grant_type 授权模式,填 authorization_code

微信开放平台的服务器收到请求后,会做三层校验:

  • appidsecret 是否匹配?
  • code 是否有效且未过期?
  • code 是否属于这个 appid 签发?

一切无误,微信返回一段JSON:

{
  "access_token": "47_ABcDeFgHiJkLmNoPqRsTuVwXyZ",
  "expires_in": 7200,
  "refresh_token": "48_ReFrEsHtOkEnHeReXyZaBcD",
  "openid": "o6_bmjrPTlm6_1a2b3c4d5e6f7g8h9i0j",
  "scope": "snsapi_userinfo"
}

这四样东西分别是什么?

字段 含义 类比
access_token 访问令牌,拿用户信息的凭证 写字楼门禁卡,用它才能进门拿数据
expires_in access_token 有效期,单位秒 门禁卡有效期,微信的是 7200秒(2小时)
refresh_token 刷新令牌,用来换新的 access_token 续卡凭证,卡过期了用它换新卡,无需你重新授权
openid 你在这个应用下的唯一标识 你在这栋楼的专属编号

💡 关于 openid 的一个重要特性:同一个微信号,在不同应用里的 openid 是不同的。 你在京东下的 openid 和在美团下的 openid 完全不一样。微信用这个机制保护你的隐私,防止跨平台追踪。

6. 为什么这一步要放后台?

我们回顾一下,整个过程最怕什么?

攻击者拿到 access_token,就能冒充用户。

而要拿到 access_token,需要 appid + secret + code

如果把 secret 写在前端代码里,任何一个懂点技术的人,都能用浏览器的开发者工具拿到它。从此攻击者可以随意伪造你的App。

所以,凡是用到 AppSecret 的步骤,必须在后台服务器完成。


五、第三步:用“门禁卡”获取信息

7. 获取用户信息

京东后台现在有了 access_tokenopenid

它再次向微信发起请求,这次是去资源服务器拿真实数据:

GET https://api.weixin.qq.com/sns/userinfo?
    access_token=47_ABcDeFgHiJkLmNoPqRsTuVwXyZ&
    openid=o6_bmjrPTlm6_1a2b3c4d5e6f7g8h9i0j

微信资源服务器验证 access_token 有效后,返回:

{
  "openid": "o6_bmjrPTlm6_1a2b3c4d5e6f7g8h9i0j",
  "nickname": "张三",
  "headimgurl": "http://wx.qlogo.cn/mmopen/xxx",
  "sex": 1,
  "province": "广东",
  "city": "深圳"
}

8. 完成登录绑定

京东后台拿到 openid 后,去查自己的数据库:

  • 如果 openid 已存在:说明这个微信号之前绑定过京东账号,直接提取对应用户,完成登录。
  • 如果 openid 不存在:说明是新用户。京东用微信返回的头像、昵称,帮你快速创建一个京东账号,并将 openid 与这个账号绑定。下次再用微信登录,就能直接识别。

接着,京东后台生成自己的登录会话(session),返回给京东App。京东App刷新页面,你看到“欢迎回来,张三”。

整个过程到此结束。


六、一张图总结全流程

为了加深印象,这里用一张序列图呈现完整的交互过程:

微信开放平台 京东后台 京东App 微信开放平台 京东后台 京东App 1. 点击“微信登录” 2. 发起授权请求(带上appid、redirect_uri等) 3. 弹出授权页面 4. 确认授权 5. 带着授权码code重定向回来 6. 将code传给后台 7. appid+secret+code 换取token 8. 返回 access_token+openid 9. access_token+openid 请求用户信息 10. 返回昵称、头像等 11. 绑定/查询内部账号,返回登录成功 12. 看到“欢迎回来”

七、写在最后

OAuth 2.0 授权码模式,看起来步骤不少,但核心理念很简单:

把密码交给最值得信任的地方,把敏感凭证的交换放在最安全的环境。

这也解释了为什么“微信登录”可以做到既方便又安全:

  • 方便:用户一键授权,无需填密码
  • 安全:第三方应用永远碰不到你的密码

下次再在某个App里看到“微信登录”的按钮,你心里应该能马上浮现出这张交互图了。

理解了这一套流程,不只是微信登录,GitHub登录、Google登录、微博登录……几乎所有第三方登录背后的原理,你都懂了。因为它们都遵循同一个协议:OAuth 2.0 授权码模式

把密码交给最值得信任的地方,把敏感凭证的交换放在最安全的环境。

这也解释了为什么“微信登录”可以做到既方便又安全:

  • 方便:用户一键授权,无需填密码
  • 安全:第三方应用永远碰不到你的密码

下次再在某个App里看到“微信登录”的按钮,你心里应该能马上浮现出这张交互图了。

理解了这一套流程,不只是微信登录,GitHub登录、Google登录、微博登录……几乎所有第三方登录背后的原理,你都懂了。因为它们都遵循同一个协议:OAuth 2.0 授权码模式

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐