OAuth 2.0是什么
OAuth 2.0是什么
OAuth 2.0 是一个授权框架,它允许一个应用程序(例如“知乎”)在征得你的同意后,安全地访问你在另一个服务(例如“微信”)上的资源(例如你的微信头像和昵称),而无需将你的微信密码告诉知乎。
比较多的应用场景就是三方登入
OAuth 2.0解决了什么问题
在 OAuth 2.0 出现之前,要完成上述场景,通常有以下几种不安全或笨拙的方式:
-
密码反模式:
-
做法:知乎直接让你输入微信的用户名和密码,然后用你的密码去微信获取数据。
-
问题:
-
极度危险:知乎会看到并可能存储你的微信密码。
-
权限过大:知乎不仅能拿到你的头像昵称,还能以你的身份做任何事,比如查看私信、发朋友圈等。
-
无法撤销:除非你修改微信密码,否则无法阻止知乎继续访问。
-
密码泄漏:如果知乎被黑客攻击,你的微信密码就泄露了。
-
-
-
其他笨拙方式
- 手动导出数据再上传,过程繁琐,用户体验极差。
所以,OAuth 2.0 的核心就是解决“安全地委托授权”这个问题。 它确保了:
-
应用(知乎)无法拿到你的密码。
-
授权是受限的(知乎只能获取你同意的特定信息,比如头像和昵称,而不能看你的私信)。
-
授权是可撤销的(你可以随时在微信的设置里取消对知乎的授权)。
一个生动的比喻:酒店房卡
想象一下你去一家酒店入住:
-
你(资源所有者) 在前台办理入住,想进入 你的房间(受保护的资源,在微信上)。
-
前台(授权服务器,由微信运营) 验证你的身份(通过身份证和预订信息)。
-
验证通过后,前台不会给你一把能打开所有房间的 万能钥匙(你的微信密码),而是给你一张 房卡(访问令牌 Access Token)。
-
这张房卡是 有特定权限的:只能打开你指定的那间房(只能访问头像和昵称),并且通常有有效期(比如住几天)。
-
你使用这张房卡就可以开门进入房间(知乎使用令牌访问你的微信数据)。
-
退房时(撤销授权),房卡就失效了。
在这个比喻中,OAuth 2.0 就是这套发放和管理“房卡”的标准流程。
OAuth 2.0 的核心角色与流程
为了理解它是如何工作的,我们需要了解其中的四个关键角色:
-
资源所有者:就是你,拥有数据并有权授予访问权限的用户。
-
客户端:想要访问你数据的第三方应用(例如“知乎”)。
-
授权服务器:负责验证你的身份并颁发令牌(Access Token)的服务(由“微信”提供)。这是你点击“同意授权”按钮时面对的界面。
-
资源服务器:存储你受保护数据的API服务器(由“微信”提供)。它接收并验证令牌,然后返回请求的数据。
总结:OAuth 2.0 的优势
-
安全性:用户密码永远不会暴露给第三方应用。
-
可控性:用户可以清晰地看到并管理授权给每个应用哪些权限,并且可以随时撤销。
-
灵活性:适用于 Web 应用、移动应用、单页应用、桌面应用等多种场景。
-
标准化:提供了一个行业标准框架,简化了开发者的集成工作。
一个常见的误解:OAuth 2.0 ≠ 认证
OAuth 2.0 是关于 授权,而不是 认证。
-
授权:是关于 权限(这个应用被允许做什么?)。
-
认证:是关于 身份(用户是谁?)。
在上面的例子中,OAuth 2.0 流程让知乎获得了访问你微信头像的 权限。
但知乎如何知道这个权限背后对应的 用户身份(你的知乎账号)呢?
这通常需要结合另一个协议 OpenID Connect,它在 OAuth 2.0 之上增加了一个身份层,专门用于解决认证问题。
我们常说的“第三方登录”其实是 OAuth 2.0 + OpenID Connect 共同实现的。
我进需要接入三方登入,不需要给三方授权,需要 OAuth 2.0吗
需要
比如我们想要接入微信登入。这时候的角色定义
-
资源所有者:你的用户
-
资源服务器:微信(它存着用户的头像、昵称等数据)
-
客户端:你的网站
-
授权服务器:也是微信(它负责问用户是否同意授权)
你的网站是 OAuth 2.0 流程中的“客户端”,而不是授权方。你需要实现的是 OAuth 2.0 的客户端逻辑,而不是服务器端逻辑。
这个过程可以分解为以下几个必须由你的网站完成的步骤:
1. 发起授权请求
你的网站需要在“使用微信登录”按钮后面生成一个符合 OAuth 2.0 标准的 URL,并将用户重定向到微信的授权页面。
https://open.weixin.qq.com/connect/oauth2/authorize?
appid=你的APPID
&redirect_uri=你的回调地址
&response_type=code
&scope=snsapi_login
&state=随机防CSRF字符串
2. 处理授权回调
用户在微信上点击“同意”后,微信会带着一个临时的 授权码(code) 跳转回你事先在微信开放平台注册好的回调地址(Redirect URI)。
你的网站必须有一个接口(比如 /oauth/wechat/callback)来接收这个请求,并从中提取出 code。如果这一步你不做,你就拿不到这个关键的 code。
3. 用授权码交换访问令牌
你的网站后端需要拿着这个code 以及你的AppSecret,再向微信的服务器发起一个后端到后端的请求,去交换最终的访问令牌(Access Token)
POST https://api.weixin.qq.com/sns/oauth2/access_token?
appid=你的APPID
&secret=你的APPSECRET
&code=上一步拿到的code
&grant_type=authorization_code
4. 使用访问令牌获取用户信息
最后,你的网站再用这个 Access Token 去调用微信的 API(例如 https://api.weixin.qq.com/sns/userinfo?access_token=...),才能安全地拿到用户的昵称、头像等基本信息,并完成在你网站上的登录或注册流程。