OAuth2 的原理介绍
一、OAuth2是什么
一句话概括OAuth 2.0 是一个授权框架,它允许第三方应用在用户授权的前提下,获得访问用户在某服务(如微信 、GitHub、Google)上存储的特定资源(如头像、昵称、照片)的权限,而无需将用户的用户名和密码提供给第三方应用。
核心思想: 引入一个授权层(Authorization Layer),将第三方应用与资源所有者(用户)区分开来。第三方应用通过获取一个访问令牌(Access Token) 而非用户的密码来访问资源
二、为什么需要 OAuth 2.0?—— 解决痛点
想象一个没有 OAuth 的时代:
你想让一个“云打印”应用帮你打印存在微信云盘 里的照片。你不得不:
在“云打印”应用里输入你的微信账号和密码。
“云打印”应用用你的账号密码登录微信云盘,下载照片。
这样做存在巨大风险:
-
密码泄露:“云打印”应用会拿到你的明文密码,它可能恶意盗用或存储不当导致泄露。
-
权限过大:“云打印”应用获得了你微信账号的全部权限(可以看所有照片、好友列表、甚至发消息),而你只希望它打印一张照片。
-
无法收回权限:除非你修改密码,否则无法阻止该应用继续访问你的账号。
OAuth 2.0 完美解决了这些问题:
-
不共享密码:第三方应用永远拿不到你的密码。
-
权限最小化:第三方应用只能获得你明确授权的特定权限(例如:只读访问某一张照片)。
-
权限可撤销:你可以随时在授权方(微信)撤销对某个第三方应用的授权,使其令牌立刻失效
三、核心角色(4个)
在 OAuth 2.0 的流程中,主要包含四个角色:
-
资源所有者 (Resource Owner): 就是用户本人,拥有授权权限。
-
客户端 (Client): 想要访问用户资源的第三方应用(比如上面的“云打印”应用)。
-
授权服务器 (Authorization Server): 服务提供商(如微信、GitHub)专门用来处理授权/令牌的服务器。负责验证用户身份、征得用户同意后颁发令牌
-
资源服务器 (Resource Server): 服务提供商(如微信、GitHub)存放用户受保护资源的服务器。它接收并验证访问令牌,然后返回对应的资源。(注:授权服务器和资源服务器可以是同一台,也可以是分开的,从概念上区分开即可)
四、核心原理与授权流程(以授权码模式为例)
OAuth 2.0 有几种不同的授权模式(Grant Type ),适用于不同的场景。授权码模式是最常用、最安全的一种,主要用于有后端的 Web 应用。
整个过程的核心步骤分解:
-
用户发起授权请求:用户在第三方应用(Client)点击“使用微信登录”。
-
跳转到授权服务器:第三方应用将用户浏览器重定向到微信的授权服务器(Authorization Server)。这个请求会带上第三方应用的身份(client_id)、请求的权限范围(scope)以及一个回调地址(redirect_uri)。
-
用户认证与同意授权:用户在微信的页面上输入账号密码登录(确保密码只输给微信),并看到一个授权页面,询问“应用XXX请求获得你的头像和昵称,是否同意?”。用户点击“同意”。
-
颁发授权码:微信授权服务器将用户浏览器重定向回第三步中提供的回调地址(redirect_uri),并在URL中附带一个授权码(Authorization Code)。
-
用授权码换令牌:第三方应用的后端服务器收到授权码后,用自己的身份(client_id)和密钥(client_secret)连同授权码一起,直接向后端发送请求给微信的授权服务器,请求换取访问令牌(Access Token)。这一步非常关键,因为通信是后端对后端,client_secret 不会暴露给浏览器。
-
颁发访问令牌:微信授权服务器验证所有信息无误后,返回一个访问令牌(Access Token) 和一个可选的刷新令牌(Refresh Token)。
-
访问资源:第三方应用的后端或前端(根据场景)即可使用这个访问令牌,去请求微信资源服务器(Resource Server)的 API(例如获取用户信息的接口)。
-
返回资源:微信资源服务器验证令牌有效后,返回请求的资源(如用户的昵称、头像链接)
五、其他授权模式(Grant Type)
除了最标准的授权码模式,还有其他几种模式适用于特定场景:
-
隐式模式 (Implicit):适用于纯前端应用(如单页面应用 SPA),没有后端服务器。跳过授权码步骤,直接返回令牌到前端。安全性低于授权码模式,因为令牌可能暴露在浏览器历史记录中。
-
密码模式 (Resource Owner Password Credentials):用户直接将用户名和密码交给第三方应用(必须是高度可信的应用,如官方客户端)。第三方应用直接用密码换令牌。应尽量避免使用,除非你完全信任该应用。
-
客户端凭证模式 (Client Credentials):适用于客户端访问自己在资源服务器上的资源,而不是用户的资源。即机器对机器的通信。直接用应用的 client_id 和 client_secret 换令牌
六、如何使用 OAuth 2.0?(开发视角)
作为一名开发者,如果要使用 OAuth 2.0,通常需要做两件事:
1.作为第三方应用(Client )接入其他平台
例如,让你的网站支持“微信登录”:
-
注册应用:去微信开放平台注册你的应用,获得 client_id 和 client_secret。
-
集成 SDK:根据微信提供的文档,在你的网站前端和后端集成对应的 OAuth 2.0 登录流程(通常是授权码模式)。
-
配置回调地址:在微信开放平台配置你的回调地址 redirect_uri。
-
实现流程:按照上述授权码模式的步骤,编写代码实现跳转、接收授权码、换令牌、获取用户信息等逻辑。
2. 作为服务提供商(Provider)提供 OAuth 2.0 服务
例如,让你自己的平台(如你的SaaS服务)也能被其他第三方应用接入:
-
搭建授权和资源服务器:你需要搭建这两类服务
-
实现端点:
授权端点:
/oauth/authorize- 处理初始授权请求,展示同意界面。令牌端点:
/oauth/token- 处理用授权码换令牌的请求
3. 管理客户端:提供一个界面让其他开发者来注册他们的应用,获得 client_id 和 client_secret。
4. 实现令牌的签发与验证:使用 JWT 等技术生成和验证访问令牌。
| 特性 | 描述 |
| 本质 | 一个授权框架,而非认证协议(但常被用于认证,如“社交登录”) |
| 核心 | 通过访问令牌代替用户密码,实现安全的第三方授权。 |
| 最安全模式 | 授权码模式,尤其适用于有后端的 Web 应用 |
| 关键安全点 | client_secret 必须保密,通信尽量使用 HTTPS,令牌有效期应尽可能短 |
| 与 OAuth 1.0 | OAuth 2.0 更简单、更灵活,不向后兼容 OAuth 1.0。 |
简单来说,OAuth 2.0 是现代互联网授权的基石,它让我们可以安全、方便地“用微信登录XXX”、“授权YYY应用访问我的GitHub 仓库”,而无需担心密码泄露的问题。
更多推荐




所有评论(0)