首页 > 其他分享 >【鉴权】深入理解 OAuth 2.0 授权流程

【鉴权】深入理解 OAuth 2.0 授权流程

时间:2024-11-05 23:44:12浏览次数:7  
标签:令牌 用户 访问 服务器 OAuth 授权 2.0 鉴权 客户端

目录

引言

OAuth 2.0 是一种广泛采用的授权框架,旨在使第三方应用能够在不暴露用户敏感凭证(如用户名和密码)的情况下,安全地访问用户的受保护资源。与传统的身份验证方式不同,OAuth 2.0 通过引入授权码、访问令牌和刷新令牌等机制,提供了一种灵活、可扩展且高效的授权流程。这一机制广泛应用于现代互联网应用,尤其是在社交媒体、金融服务和云计算等领域,它允许用户授权第三方应用访问他们的数据,而无需将自己的账户信息交给这些应用。

OAuth 2.0 的授权流程涉及多个关键角色,包括授权服务器、客户端应用、资源服务器和用户。这些角色通过一系列交互,确保了用户数据的安全性和隐私性。本文将详细讲解 OAuth 2.0 的授权流程,通过对 OAuth 2.0 授权流程的详细解析,我们可以更好地理解其工作原理,并有效地在实际应用中实现安全的身份验证和资源访问控制。

OAuth 2.0 授权流程概览

OAuth 2.0 授权流程主要分为以下几个步骤:

  1. 用户访问客户端应用
    用户打开并访问客户端应用,可能会被要求登录。

  2. 客户端请求授权码
    客户端应用将用户重定向到授权服务器,发起授权请求,要求授权服务器返回授权码。

  3. 授权服务器展示授权页面
    授权服务器展示授权页面,用户进行登录,并同意或拒绝客户端应用的访问请求。

  4. 用户同意授权
    如果用户同意授权,授权服务器会生成授权码,并将其返回给客户端应用。

  5. 客户端使用授权码换取访问令牌
    客户端应用将获得的授权码与客户端的凭证(如客户端ID和客户端密钥)一起发送到授权服务器,换取访问令牌和刷新令牌。

  6. 授权服务器返回访问令牌和刷新令牌
    授权服务器返回访问令牌(Access Token)和刷新令牌(Refresh Token)。访问令牌用于访问受保护的资源,刷新令牌则用于在访问令牌过期时获取新的访问令牌。

  7. 客户端使用令牌访问资源
    客户端应用将访问令牌附加在请求头中,发送请求到资源服务器,访问受保护的资源。

  8. 资源服务器返回受保护资源
    资源服务器验证访问令牌的有效性,如果令牌有效,则返回请求的受保护资源;如果令牌无效,则返回错误信息。

  9. 客户端展示数据
    客户端将返回的受保护资源展示给用户。

  10. 访问令牌过期,使用刷新令牌获取新令牌
    如果访问令牌过期,客户端使用刷新令牌请求授权服务器获取新的访问令牌。刷新令牌通常不受短时间限制,允许客户端在不需要用户干预的情况下自动获取新的访问令牌。

  11. 授权服务器返回新的访问令牌(及可选的刷新令牌)
    授权服务器验证刷新令牌,若有效,则返回新的访问令牌。如果授权服务器采用滚动刷新策略,也可能返回新的刷新令牌。

  12. 客户端使用新的访问令牌访问资源
    客户端再次使用新的访问令牌访问资源服务器,获取数据并展示给用户。

以下是 OAuth 2.0 授权流程的示意图,帮助我们更清晰地理解整个过程:

用户 客户端应用 授权服务器 资源服务器 CSDN @ 2136 访问客户端应用 请求授权码 用户授权同意 提交授权 返回授权码 使用授权码换取令牌 返回访问令牌 使用令牌访问资源 返回受保护资源 展示数据 CSDN @ 2136 使用刷新令牌获取新令牌 返回新访问令牌和刷新令牌 使用新令牌访问资源 返回受保护资源 展示数据 CSDN @ 2136 alt [访问令牌过期] 用户 客户端应用 授权服务器 资源服务器

1. 用户访问客户端应用

在 OAuth 2.0 流程的第一步,用户通过浏览器或其他客户端应用访问一个服务。假设这个服务是一个需要用户身份验证的应用,客户端应用需要用户授权才能访问其受保护的数据。

用户请求的步骤:

  1. 用户打开浏览器,输入某个网站或应用的 URL。
  2. 客户端应用接收到用户请求,可能会要求用户登录,或者直接跳转到授权服务器进行认证。

请求示例:

GET /index.html HTTP/1.1
Host: client.example.com

注释:

  • GET /index.html:客户端应用请求访问首页,通常首页会展示登录或授权页面。

2. 客户端请求授权码

OAuth 2.0 使用 授权码模式(Authorization Code Flow)来实现第三方应用访问用户资源的机制。在这一阶段,客户端应用会向授权服务器发起请求,要求授权码。授权码是一种临时的令牌,只有在用户同意授权的情况下,才会返回给客户端。

授权请求 URL 示例:

GET /authorize?response_type=code&client_id=CLIENT_ID&redirect_uri=https://client.example.com/callback&scope=read%20write&state=xyz
Host: authserver.example.com

参数解释:

参数描述
response_type固定为 code,表示请求授权码。
client_id客户端的唯一标识符。
redirect_uri授权码返回的回调地址,必须与申请时的注册信息一致。
scope请求的权限范围(例如:read write)。
state防止 CSRF 攻击的随机字符串。授权码请求后会原样返回,确保请求是合法的。

请求授权码流程图

用户 客户端 授权服务器 CSDN @ 2136 访问客户端 发起授权请求 用户授权或拒绝 CSDN @ 2136 提交授权 返回授权码 使用授权码换取令牌 返回访问令牌 用户 客户端 授权服务器

解释:

  • 用户访问客户端(User -> Client)。
  • 客户端向授权服务器发起授权请求(Client -> AuthServer)。
  • 授权服务器将用户授权或拒绝请求返回给用户(AuthServer -> User)。
  • 用户授权后,授权信息返回给授权服务器(User -> AuthServer)。
  • 授权服务器返回授权码给客户端(AuthServer -> Client)。
  • 客户端使用授权码向授权服务器请求访问令牌(Client -> AuthServer)。
  • 授权服务器返回访问令牌给客户端(AuthServer -> Client)。

3. 授权服务器展示授权页面

当客户端请求授权时,授权服务器会展示一个页面,询问用户是否允许客户端访问其数据。如果用户同意,授权服务器就会将用户重定向回客户端,并附上授权码。如果用户拒绝,授权服务器会返回一个错误响应。

示例授权页面 HTML:

<form action="https://authserver.example.com/authorize" method="post">
  <h2>应用请求权限</h2>
  <p>允许此应用访问你的资源吗?</p>
  <button type="submit">允许</button>
  <button type="button">拒绝</button>
</form>

4. 用户同意授权

用户在授权页面上点击 允许 按钮后,授权服务器会重定向用户的浏览器回到客户端应用指定的 redirect_uri,并附上授权码。此时客户端可以继续流程,使用授权码获取访问令牌。

重定向 URL 示例:

HTTP/1.1 302 Found
Location: https://client.example.com/callback?code=AUTHORIZATION_CODE&state=xyz

5. 客户端使用授权码换取访问令牌

在这一步,客户端应用会使用授权码向授权服务器请求访问令牌。访问令牌是客户端用来访问用户受保护资源的凭证。授权码是临时的,仅在有效期内有效。

请求示例:

POST /token HTTP/1.1
Host: authserver.example.com
Content-Type: application/x-www-form-urlencoded

client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
code=AUTHORIZATION_CODE&
redirect_uri=https://client.example.com/callback&
grant_type=authorization_code

参数解释:

参数描述
client_id客户端的唯一标识符。
client_secret客户端的密钥,用于验证客户端身份。
code授权服务器返回的授权码。
redirect_uri客户端在授权时指定的回调地址,必须与请求时一致。
grant_type授权类型,固定为 authorization_code

6. 授权服务器返回访问令牌

当授权服务器验证客户端的请求并且授权码有效时,会返回访问令牌以及相关的元数据(如令牌类型、过期时间等)。访问令牌是客户端访问受保护资源的凭证。

响应示例:

{
  "access_token": "ACCESS_TOKEN",
  "token_type": "bearer",
  "expires_in": 3600,
  "refresh_token": "REFRESH_TOKEN",
  "scope": "read write"
}

字段解释:

字段描述
access_token访问令牌,客户端用来访问受保护资源。
token_type令牌类型,通常是 bearer
expires_in访问令牌的有效期,单位为秒。过期后需要使用刷新令牌刷新。
refresh_token刷新令牌,用于获取新的访问令牌。
scope客户端被授权的权限范围。

7. 客户端使用令牌访问资源

拥有了访问令牌后,客户端可以使用它向资源服务器发起请求,访问用户的受保护资源。请求时,令牌通常会放在 HTTP 请求的 Authorization 头中。

请求示例:

GET /resource HTTP/1.1
Host: resourceserver.example.com
Authorization: Bearer ACCESS_TOKEN

8. 资源服务器返回受保护资源

资源服务器接收到请求后,验证访问令牌。如果令牌有效,资源服务器就会返回受保护的资源给客户端。如果令牌无效或过期,资源服务器会返回相应的错误信息。

响应示例:

{
  "data": "这是受保护的资源"
}

9. 客户端展示数据

客户端收到资源服务器返回的数据后,会将其展示给用户。此时用户可以看到自己被授权访问的受保护的资源。这个过程使得用户无需透露自己的密码,且能够安全地让第三方应用访问他们的数据。

客户端展示数据示例:

<!DOCTYPE html>
<html>
<head>
    <title>受保护资源</title>
</head>
<body>
    <h1>欢迎回来,用户!</h1>
    <p>这里是您的受保护数据:<span id="protected-data"></span></p>

    <script>
        // 假设资源已经通过 API 获取到
        fetch('https://resourceserver.example.com/resource', {
            method: 'GET',
            headers: {
                'Authorization': 'Bearer ACCESS_TOKEN'
            }
        })
        .then(response => response.json())
        .then(data => {
            document.getElementById('protected-data').textContent = data.data;
        })
        .catch(error => console.error('无法加载资源:', error));
    </script>
</body>
</html>

在这个 HTML 示例中,客户端通过 JavaScript 向资源服务器发起 API 请求,获取并展示用户的受保护资源。

10. 访问令牌过期,使用刷新令牌获取新令牌

在 OAuth 2.0 的授权流程中,访问令牌通常有一定的有效期(如 1 小时或 30 分钟)。当客户端发现访问令牌已经过期时,它可以使用之前获得的 刷新令牌 来请求新的访问令牌,而无需再次进行用户认证或授权。

步骤

  • 客户端 检查当前的访问令牌是否过期,通常可以通过检查访问令牌的有效期来确定。
  • 如果令牌过期,客户端刷新令牌(通常存储在客户端的本地存储或安全存储中)发送给 授权服务器
  • 这个请求的内容通常是:
    • grant_type=refresh_token,指明这是刷新令牌的请求。
    • refresh_token,需要提供刷新令牌的值。
    • client_idclient_secret(如果需要),用于验证客户端的身份。

为什么刷新令牌有用

  • 减少用户干预:刷新令牌允许客户端在访问令牌过期时自动获取新的令牌,而无需用户再次登录授权。
  • 长期授权:通过刷新令牌,客户端可以长期使用访问资源,而不需要用户每次都提供授权。

11. 授权服务器返回新的访问令牌

在 OAuth 2.0 中,访问令牌通常是有时效性的,过期后用户就需要重新授权。为了避免频繁的用户干预,OAuth 2.0 提供了 刷新令牌 机制,使得客户端可以在令牌过期时,使用刷新令牌来获取新的访问令牌。

客户端授权服务器 发送包含刷新令牌的请求时,授权服务器会验证该刷新令牌的有效性。

授权服务器的处理流程

  • 验证刷新令牌:授权服务器首先验证收到的刷新令牌是否有效。例如,验证令牌是否过期、是否被吊销或是否与请求的客户端匹配。
  • 检查客户端身份:授权服务器还会检查发送请求的客户端身份是否正确,以防止恶意应用滥用刷新令牌。
  • 返回新的访问令牌:如果刷新令牌有效且客户端身份通过验证,授权服务器将生成一个新的访问令牌并返回给客户端。新的访问令牌会带有新的有效期。
  • 可选的刷新令牌:如果授权服务器采用 滚动刷新策略,除了返回新的访问令牌外,还可能会同时返回新的刷新令牌。这样,客户端每次刷新时,都会获得一个新的刷新令牌,增强了安全性。

刷新令牌请求示例

当访问令牌过期后,客户端可以使用刷新令牌来请求一个新的访问令牌:

POST /token HTTP/1.1
Host: authserver.example.com
Content-Type: application/x-www-form-urlencoded

client_id=CLIENT_ID&
client_secret=CLIENT_SECRET&
refresh_token=REFRESH_TOKEN&
grant_type=refresh_token

示例响应
如果刷新令牌有效,授权服务器会返回新的访问令牌和刷新令牌:

{
  "access_token": "new_access_token_value",
  "token_type": "bearer",
  "expires_in": 3600,  // 新的有效期(秒)
  "refresh_token": "new_refresh_token_value",  // 如果采用滚动刷新策略,返回新的刷新令牌
  "scope": "read write"  // 令牌的权限范围
}

刷新令牌的有效性

  • 刷新令牌一般没有短期有效期,但有时授权服务器可能会设置有效期限或单次使用限制。
  • 在一些情况下,如果刷新令牌过期或被撤销,授权服务器可能会要求客户端重新进行用户授权。

12. 客户端使用新的访问令牌访问资源

一旦 客户端 获得了新的访问令牌,它可以继续使用新的令牌访问 资源服务器 提供的受保护资源。客户端通过将新的访问令牌附加在请求的 Authorization 头部,来请求访问资源。

步骤

  1. 客户端将新的 访问令牌 添加到 HTTP 请求的 Authorization 头部,通常格式为:

    Authorization: Bearer new_access_token_value
    
  2. 资源服务器接收到带有新的访问令牌的请求后,会:

    • 验证令牌是否有效。
    • 检查令牌是否有足够的权限来访问特定的资源(如读取数据、写入数据等)。
  3. 如果令牌有效且有足够的权限,资源服务器将返回请求的受保护资源(如用户数据、API 数据等)。

  4. 客户端将获取到的数据展示给用户。

示例请求

GET /protected/resource HTTP/1.1
Host: api.example.com
Authorization: Bearer new_access_token_value

资源服务器响应

{
  "data": "This is the protected resource data"
}

为什么使用新的访问令牌重要

  • 新的访问令牌允许客户端继续无缝地访问受保护的资源,而不需要用户重新授权。
  • 这提高了用户体验,因为用户无需每次都进行登录授权。

OAuth 2.0 安全性考虑

虽然 OAuth 2.0 提供了一种方便的授权机制,但在实现时需要特别注意以下安全性考虑:

  1. 使用 HTTPS

为了防止令牌被中间人攻击者窃取,所有的 OAuth 2.0 流程(包括获取授权码、访问令牌、访问受保护资源等)都应该通过 HTTPS 协议进行加密传输。确保数据在传输过程中不会被窃取或篡改。

  1. 防止 CSRF 攻击

OAuth 2.0 中使用了 state 参数来防止跨站请求伪造(CSRF)攻击。客户端应该生成一个随机的 state 参数,并在授权请求和响应中验证它,以确保授权请求的合法性。

  1. 短期访问令牌

为了最大限度地降低风险,访问令牌应该设置为短期有效的,并且结合刷新令牌使用。如果访问令牌过期,则可以通过刷新令牌获得新的访问令牌。这样可以减少令牌被盗用的风险。

  1. 权限最小化

客户端在请求授权时应该明确声明所需的最小权限范围(scope)。例如,如果应用只需要读取用户的基本信息,就不应该请求 write 权限。这样可以减少对用户数据的潜在风险。

  1. 保护客户端密钥

在授权码流程中,客户端通常会使用 client_secret 来验证自己的身份。客户端密钥必须保密,不能被公开或泄漏。若密钥被盗,恶意用户可以伪造客户端请求,从而获得访问令牌。

  1. 令牌吊销机制

授权服务器应该提供令牌吊销的机制,当用户撤销授权或其他安全事件发生时,可以立即撤销相关的访问令牌和刷新令牌。

总结

OAuth 2.0 提供了一种高效、安全的授权机制,允许用户在不暴露用户名和密码的情况下,授权第三方应用访问其受保护的资源。通过将身份验证与授权过程分离,OAuth 2.0 提供了更高的灵活性和安全性,尤其适用于大型应用和多方集成场景。在其授权流程中,核心步骤包括用户授权、客户端请求令牌、令牌交换以及资源访问等,确保了数据的安全传输和访问控制。

然而,在实现 OAuth 2.0 时,必须特别关注安全性问题,如使用 HTTPS 协议保障数据传输安全、实现 CSRF 防护以及合理管理令牌的有效期。通过深入理解 OAuth 2.0 的原理与流程,开发者可以有效地设计并实施安全的授权机制,既能提供便捷的用户体验,又能确保用户数据的安全与隐私。


标签:令牌,用户,访问,服务器,OAuth,授权,2.0,鉴权,客户端
From: https://blog.csdn.net/Stromboli/article/details/143530826

相关文章

  • PCIe系列专题之二:2.0 Transaction layer事务层概述
    一、故事前传上回我们对PCIe的一些基础概念作了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-basedlayeredprotocol),主要包括事务层(Transactionlayer),数据链路层(Datalinklayer)和物理层(Physicallayer)。较为详细解释请见之前的文章:PCIe技术概述;二、事务层概述......
  • EasyQBlog .NET 8 + Q-Blog 2.0博客模板 + easyweb iframe后台模板 开发的个人博客
    EasyAdmin介绍.NET8+Q-Blog2.0博客模板+easywebiframe后台模板开发的个人博客演示地址:https://www.baocaige.top暂不开源,需要滴滴!!!项目截图 ......
  • 代码随想录第四天|链表part02--24. 两两交换链表中的节点、19.删除链表的倒数第N个节
    资源引用:leetcode题目:24.两两交换链表中的节点(24.两两交换链表中的节点-力扣(LeetCode))19.删除链表的倒数第N个结点(19.删除链表的倒数第N个结点-力扣(LeetCode))面试题02.07.链表相交(面试题02.07.链表相交-力扣(LeetCode))142.环形链表Ⅱ(142.环形链表II-力扣(Leet......
  • Dify 中的 Bearer Token 与 API-Key 鉴权方式
    本文使用Difyv0.10.2版本,在Dify中包括BearerToken与API-Key鉴权这2种方式。console(URL前缀/console/api)和web(URL前缀/api)蓝图使用的是BearerToken鉴权方式,而service_api(URL前缀/v1)蓝图使用的是API-Key鉴权方式。console蓝图通过login_required装饰......
  • HeaderFile 2.0 | tool.h
    Download字符串处理部分substr()定义(一)conststringsubstr(conststring&x,stringexpr="")引自python的字符串切片功能传入的两个参数,第一个参数为被切片的字符串,第二个参数为限定参数当限定参数为空时返回原字符串第一参数:返回的子串的开始位置,为空或为\(0\)则从......
  • Ubuntu 22.04 镜像源仓库
    1.先备份cp/etc/apt/sources.listcp/etc/apt/sources.list.bak2.配置文件gedit/etc/apt/sources.list3.替换文本#aliyundebhttp://mirrors.aliyun.com/ubuntu/lunarmainrestricteduniversemultiversedeb-srchttp://mirrors.aliyun.com/ubuntu/lunarmainrest......
  • 继承和多态2.0
    1.1多态定义具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。1.2多态实现条件1.必须在继承体系下2.子类必须要对父类中方法进行重写3.通过父类的引用调用重写的方法多态体现:在代码运行时,当传递不同类对象时,会调用对应类中的方法publicclas......
  • uniapp - 运行打包出现警告报错The legacy JS API is deprecated and will be removed
    问题描述在uniapp项目运行打包时警告提示ThelegacyJSAPIisdeprecatedandwillberemovedinDartSass2.0.0,另外还有可能存在其他sass错误或报错警告,uniapp正常运行项目也可能会提示此错误,无论是Hbuilder升级还是降级都不行(还有更坑的是就是升级完hbuilder才报的),详......
  • HDK Fileheader Download(2.0)
    HDKFileheaderLibraryDownload2.0Download1.13|1.13.1|1.13.2|1.13.3|1.13.4Download1.12|1.12.1|1.12.2Download1.11Download1.10|1.10.1Download1.9Download1.8|ForLinuxDownload1.7|1.7.1|1.7.2Download1.6Download1.5Downloa......
  • OAuth2 原理与机制详解及应用案例
    一、OAuth2简介1.1什么是OAuth2?定义:OAuth2(OpenAuthorization)是一种用于安全授权的开放标准协议。作用:允许第三方应用安全地访问用户资源,而无需暴露用户的身份凭证。1.2OAuth2的基本概念ResourceOwner(资源拥有者):通常是用户。Client(客户端):需要访问用户资源的应用程......