京东用微信登录时,幕后到底发生了什么?
京东微信登录的幕后流程基于OAuth 2.0授权码模式,通过四个角色协作完成:用户(资源拥有者)、京东App(客户端)、微信授权服务器和微信资源服务器。整个过程分为三步:首先京东引导用户在微信完成授权并获取临时授权码;然后京东后台用授权码和AppSecret换取访问令牌;最后用令牌获取用户信息。关键安全设计在于敏感操作(如换取令牌)必须由后台完成,确保微信密码和AppSecret永不暴露。这种机制
京东用微信登录时,幕后到底发生了什么?
从一个6亿人都在用的功能说起
“微信一键登录”——这可能是你每天都会用到的功能。
用京东购物,点一下“微信登录”,就能自动识别你是谁。但你有没有想过一个看似矛盾的问题:
京东怎么拿到你的微信头像和昵称的?它知道你的微信密码吗?
答案是:京东永远不知道你的微信密码。
那它是怎么做到的?这背后,就是今天的主角——OAuth 2.0 授权码模式。
本文会用“京东App用微信授权登录”这个真实场景,从头到尾拆解每一步发生了什么。读完你会彻底理解这个互联网最核心的授权协议。
一、四个角色,一台好戏
在正式开讲之前,先认识一下 OAuth 2.0 里的四位主角。在“京东用微信登录”这个场景中,他们分别是:
| 角色 | 对应实体 | 职责 |
|---|---|---|
| 资源拥有者 | 你(用户) | 你拥有微信账号、头像、昵称的所有权 |
| 客户端 | 京东App | 想获取你微信信息的第三方应用 |
| 授权服务器 | 微信开放平台登录系统 | 验证你的身份,颁发授权码和令牌 |
| 资源服务器 | 微信用户信息数据库 | 存储你的头像、昵称等数据 |
这四者之间如何配合?我们一步步来看。
二、整体流程概览:三步走
整个过程可以总结为三个阶段:
- 申请“临时访客条”——用户在微信侧完成授权,拿到授权码(code)
- 后台换“门禁卡”——京东后台用授权码换取 access_token
- 刷卡进门——用 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 |
微信开放平台的服务器收到请求后,会做三层校验:
appid和secret是否匹配?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_token 和 openid。
它再次向微信发起请求,这次是去资源服务器拿真实数据:
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刷新页面,你看到“欢迎回来,张三”。
整个过程到此结束。
六、一张图总结全流程
为了加深印象,这里用一张序列图呈现完整的交互过程:
七、写在最后
OAuth 2.0 授权码模式,看起来步骤不少,但核心理念很简单:
把密码交给最值得信任的地方,把敏感凭证的交换放在最安全的环境。
这也解释了为什么“微信登录”可以做到既方便又安全:
- 方便:用户一键授权,无需填密码
- 安全:第三方应用永远碰不到你的密码
下次再在某个App里看到“微信登录”的按钮,你心里应该能马上浮现出这张交互图了。
理解了这一套流程,不只是微信登录,GitHub登录、Google登录、微博登录……几乎所有第三方登录背后的原理,你都懂了。因为它们都遵循同一个协议:OAuth 2.0 授权码模式。
把密码交给最值得信任的地方,把敏感凭证的交换放在最安全的环境。
这也解释了为什么“微信登录”可以做到既方便又安全:
- 方便:用户一键授权,无需填密码
- 安全:第三方应用永远碰不到你的密码
下次再在某个App里看到“微信登录”的按钮,你心里应该能马上浮现出这张交互图了。
理解了这一套流程,不只是微信登录,GitHub登录、Google登录、微博登录……几乎所有第三方登录背后的原理,你都懂了。因为它们都遵循同一个协议:OAuth 2.0 授权码模式。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)