【OAuth2】OAuth2概述及使用GitHub登录第三方网站
文章目录
0. 导言
我们在浏览器上可以访问成百上千个网站,使用每个网站的服务一般都要先注册账号,那么我们为了更好地记忆,一般都会在多个网站使用相同的账号和密码进行注册。那么问题就来了,如果在你注册的网站中有某些个网站的系统设计不够严谨和安全,数据库的用户信息使用明文存储,那么一旦这个网站遭到攻击或者是数据泄露,那么一些不怀好意的人就可能通过使用这些泄露的数据“撞库”,刚好就登录了你使用相同账号密码注册的其他网站。那么你的权益就有可能会受到损害。
由此行内大佬们便提出了 OAuth。
1. OAuth2 简介
OAuth 是一个开放的非常重要的认证标准/协议,允许用户授权第三方应用访问其存储在其他网站上资源,而无需将用户名密码提供给第三方网站的开放标准/协议。OAuth2 是 OAuth 的最新版本,同时也是被广泛应用的一个版本。我们在网站上常见的QQ登录,微信扫码登录,GitHub 授权登录就是基于 OAuth2.0 实现的。
官方文档:点击跳转
2. OAuth2 认证授权总体流程
整体认证授权流程如下:

从这张图中我们可以看出,整个 OAuth2 的认证授权流程中有4个不同角色:
- Client:客户端,也就是第三方网站(相对于认证网站来说)。
- Resource Owner:资源拥有者,也就是“我”。
- Authorization Server:认证服务器或者说授权服务器。
- Resource Server:资源服务器。
3. OAuth2 标准接口
-
/oauth/authorize:授权端点 -
/oauth/token:获取令牌端点 -
/oauth/confirm_access:用户确认授权提交端点
-
/oauth/error:授权服务错误信息端点
-
/oauth/check_token:用于资源服务访问的令牌解析端点
-
/oauth/token_key:提供公有密匙的端点,如果使用JWT令牌的话
4. OAuth2 四种授权模式
4.1 授权码模式
授权码模式(Authorization Code):这是最常用的授权模式。在模式下,用户通过将重定向到授权服务器来进行身份验证,并获一个授权码。然后,应程序使用授权码与授权服务器进行交互,以获取访问牌和刷新令牌。访问令牌用于问受保护的资源,而刷新令牌用于获取新的访问令牌。微信扫码登录就是典型的授权码模式。
授权码模式的授权流程如下图所示:

具体流程如下:
-
(A)用户访问第三方应用,第三方应用通过浏览器导向认证服务器。
-
(B)用户选择是否给予客户端授权。
-
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
-
(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
-
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。
核心参数(假设第三方网站的地址为:wx.com):
https://wx.com/oauth/authorize?response_type=token&client_id=CLIENT_ID&redirect_uri=http://www.baidu.com&scope=read
| 字段 | 描述 |
|---|---|
| client_id | 授权服务器注册应用后的唯一标识 |
| response_type | 必须 固定值 在授权码中必须为 token |
| redirect_uri | 必须 通过客户端注册的重定向URL |
| scope | 必须 令牌可以访问资源权限 |
| state | 可选 存在原样返回客户端 用来防止 CSRF跨站攻击 |
申请令牌的请求示例(地址栏中的client表示client_id,secret表示密钥值):

刷新令牌请求示例:

4.2 简化模式
简化模式(Implicit Grant):简化模式不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。其具体的授权流程如图所示

OAuth2是一种开放标准,允许用户让第三方应用访问其存储在另一服务提供者的资源,而无需分享用户名和密码。文章详细介绍了OAuth2的四种授权模式,包括授权码模式、简化模式、密码模式和客户端模式,并以GitHub授权登录为例,展示了如何在实际开发中应用OAuth2。
最低0.47元/天 解锁文章
1152

被折叠的 条评论
为什么被折叠?



