OAuth 2.0以及它的工作过程工作过程

news/2024/10/21 9:13:05

这里可以看阮一峰老师关于 OAuth 2.0 的介绍:
理解OAuth 2.0:https://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
OAuth 2.0 的一个简单解释: https://www.ruanyifeng.com/blog/2019/04/oauth_design.html
OAuth 2.0 的四种方式:https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

OAuth 2.0 是一种用于访问授权的开放标准协议,它允许应用程序在无需暴露用户凭据(如用户名和密码)的情况下安全地访问其他应用程序的资源。OAuth 2.0 的设计目标是解决跨平台或跨应用之间的授权问题,它允许第三方应用程序代表用户访问资源,而无需直接向第三方暴露用户的密码。

一、OAuth 2.0 的背景与问题

在现代网络应用中,用户常常需要授权第三方应用程序访问自己在某些服务提供商(如Google、Facebook等)上的资源。例如,一个用户希望授权某个社交媒体应用程序访问他在Google Drive上的照片,而不希望将自己的Google账户密码交给这个社交媒体应用程序。在这种情况下,传统的凭据分享方式存在严重的安全风险:

  1. 凭据共享风险:用户需要将自己的用户名和密码提供给第三方,这增加了密码被滥用或泄露的风险。
  2. 权限过度:一旦用户共享了自己的凭据,第三方可以获得对用户所有资源的访问权限,超出用户的预期。
  3. 凭据无法撤销:如果用户想要撤销对某个应用的授权,他不得不更改自己的密码,从而影响其他已授权的服务。

为了解决这些问题,OAuth 2.0 引入了一种安全、可靠且灵活的方式来管理授权和访问。

二、OAuth 2.0 解决了什么问题?

  1. 分离身份验证与授权:OAuth 2.0 允许第三方应用程序(也称为客户端应用)在用户授权的情况下访问资源,而无需直接获取用户的凭据。

  2. 精细化权限控制:通过OAuth 2.0,用户可以授权应用程序访问特定的资源或执行特定的操作,而无需开放所有权限。

  3. 可撤销性:用户可以随时通过资源提供商(如Google)的设置界面撤销某个应用程序的授权,而无需更改密码。

  4. 减少用户密码暴露的风险:应用程序不再直接处理用户的密码,授权流程通过访问令牌控制,确保用户凭据的安全。

三、OAuth 2.0 的角色

在OAuth 2.0的架构中,主要涉及四个角色:

  1. 资源所有者(Resource Owner):通常是用户,拥有需要访问的资源。例如,用户的Google Drive上的文件。

  2. 客户端(Client):请求访问资源的应用程序。它可以是一个Web应用、移动应用或桌面应用。

  3. 授权服务器(Authorization Server):负责认证资源所有者的身份,并在获得授权后,颁发访问令牌(Access Token)。授权服务器通常由资源服务器同一实体管理(例如,Google 的授权服务器可以为Google Drive的资源提供授权)。

  4. 资源服务器(Resource Server):提供保护资源的服务器,例如Google Drive。资源服务器通过验证访问令牌来确定客户端是否有权限访问资源。

四、OAuth 2.0 的工作流程

OAuth 2.0 的授权流程分为几个步骤,涉及令牌(Token)交换等关键过程。它可以通过多种授权方式完成,其中最常用的是授权码授权(Authorization Code Grant)流程。下面是OAuth 2.0的完整工作过程:

1. 资源所有者向客户端发起操作

用户(资源所有者)在客户端应用中进行某项操作,该操作需要访问资源服务器上的资源。客户端会跳转至授权服务器的认证页面,让用户授权。

2. 客户端向授权服务器请求授权

客户端将用户重定向到授权服务器的授权页面,URL中通常包含以下信息:

  • client_id:客户端应用的唯一标识符。
  • redirect_uri:授权成功后重定向的地址(客户端提供)。
  • response_type:通常为 code,表示客户端期望获取授权码。
  • scope:请求访问的资源范围(如读取邮件、访问文件等)。
  • state:用于防止CSRF攻击的随机字符串。

示例授权请求:

GET /authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&response_type=code&scope=email&state=STATE

3. 用户认证与授权

资源所有者会被授权服务器(如Google的OAuth页面)要求进行身份验证(如果尚未登录)。登录后,授权服务器会向用户展示授权页面,用户可以选择是否授权客户端访问指定的资源范围(scope)。

4. 授权服务器返回授权码

如果用户同意授权,授权服务器会生成一个临时的授权码(Authorization Code),并将其通过redirect_uri重定向到客户端。返回的URL中包含以下信息:

  • code:授权码,客户端可以用它换取访问令牌。
  • state:与最初请求中的 state 值匹配,以防止CSRF攻击。

示例返回:

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

5. 客户端使用授权码向授权服务器请求访问令牌

客户端收到授权码后,会向授权服务器的令牌端点(Token Endpoint)发出POST请求,换取访问令牌(Access Token)。该请求通常包含以下参数:

  • grant_type:授权类型,authorization_code 表示使用授权码模式。
  • code:步骤4中获得的授权码。
  • redirect_uri:与前面授权请求中使用的 redirect_uri 一致。
  • client_idclient_secret:客户端的标识符和密钥,用于证明客户端的身份。

示例POST请求:

POST /token
Host: https://authorization-server.com
Content-Type: application/x-www-form-urlencodedgrant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=REDIRECT_URI&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

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

授权服务器验证授权码和客户端身份后,会返回一个访问令牌(Access Token),有时还会返回一个刷新令牌(Refresh Token),用于获取新的访问令牌。

示例返回:

{"access_token": "ACCESS_TOKEN","token_type": "Bearer","expires_in": 3600,"refresh_token": "REFRESH_TOKEN"
}
  • access_token:用于访问资源服务器的凭证。
  • expires_in:令牌有效期(秒)。
  • refresh_token:用于获取新的访问令牌,无需用户再次授权。

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

客户端持有访问令牌后,可以通过请求资源服务器的API来访问受保护的资源。客户端会将访问令牌放入HTTP请求的Authorization头中,作为Bearer令牌:

示例API请求:

GET /resource HTTP/1.1
Host: resource-server.com
Authorization: Bearer ACCESS_TOKEN

8. 资源服务器验证令牌并返回资源

资源服务器接收到访问令牌后,会向授权服务器验证令牌的有效性。如果令牌有效且权限足够,资源服务器会返回请求的资源。

五、OAuth 2.0 的授权模式

除了授权码模式(Authorization Code Grant),OAuth 2.0 还支持其他几种常见的授权模式,适用于不同场景:

  1. 隐式授权模式(Implicit Grant):主要用于单页应用(SPA)或移动应用,客户端直接在浏览器中接收访问令牌,无需通过服务器端换取授权码。这种模式不涉及刷新令牌,因为安全性较低,适用于短期使用场景。

  2. 密码授权模式(Resource Owner Password Credentials Grant):用户将其凭据(用户名和密码)直接提供给客户端应用,客户端再用这些凭据向授权服务器请求访问令牌。这种模式一般不建议使用,除非客户端是受信任的应用。

  3. 客户端凭据模式(Client Credentials Grant):客户端以自己的身份(而非用户的身份)请求访问受保护的资源。这通常用于应用程序间的服务(如微服务)之间的授权,而非用户授权。

  4. 刷新令牌(Refresh Token Grant):当访问令牌过期时,客户端可以使用刷新令牌获取新的访问令牌,而无需再次向用户请求授权。

六、OAuth 2.0 的优势

  1. 安全性增强:OAuth 2.0允许应用程序在不暴露用户凭据的情况下访问资源,降低了凭据泄露的风险。

  2. 用户体验好:用户只需授权一次,而无需每次都输入用户名和密码,极大提高了用户体验。

  3. 灵活的授权管理:用户可以控制授权的范围,并且随时可以撤销授权,保证了授权的灵活性和安全性。

  4. 跨平台支持:OAuth 2.0 可用于Web应用、移动应用、桌面应用等多种

环境,广泛支持。

七、总结

OAuth 2.0 是一种安全、灵活的授权协议,解决了在不同平台和服务之间安全地共享资源的问题。通过使用访问令牌,OAuth 2.0 可以确保第三方应用程序能够安全地访问用户的资源,同时用户对授权过程有充分的控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

10.14-10.20 总结

1234567890联考题解:https://www.cnblogs.com/british-union/p/liankao.html 如果忽略挂分,这周打的还可以。但是问题是挂了不少分导致实际得分远不如期望得分。 做题: 做了几道 Project Euler,有一道没想出来:588,638,457,307。 P10353:群论题 AGC012F 尝试枚举一下前…

C10-08-宽字节注入-mysql注入之getshell-sqlmap

一 宽字节注入 利用宽字节注入实现“库名-表名”的注入过程。 靶场环境:容器镜像:area39/pikachu 宽字节概念1、如果一个字符的大小是一个字节的,称为窄字节; 2、如果一个字符的大小是两个及以上字节的,称为宽字节; 像GB2312、GBK、GB18030、BIG5、Shift_JIS等编码都是常…

集成电路企业怎样进行红区绿区的跨网文件交换?

在集成电路企业中,红区与绿区的划分通常基于信息的安全性和敏感性。红区一般就是密级比较高的网络区域,绿区就是密级低一些的。划分不同安全区域后,不同区域之间需要进行跨网文件交换,才能实现业务数据的流转。红区: 涉及高度敏感的信息,如设计数据、知识产权、商业秘密等…

某存储项目RAID卡出现踢盘动作

描述:某项目分布式存储设备,OSD频繁掉线, 通过查看RAID串口日志发现slot3槽位之前出现过大量命令超时,且在10月17日1:47时出现过Removed动作查看盘在位情况,发现slot3已经掉线了解决方法: 更换slot3槽位的硬盘作者:杨灏 出处:http://www.cnblogs.com/HByang/

500强企业是如何进行数据安全建设的?看这篇就够了

500强企业对于数据安全的保护尤其重视,所以在数据安全建设方面通常采取多层次的策略,具体包括以下几个方面:风险评估与管理:定期进行全面的风险评估,识别数据安全风险,制定相应的管理策略。 安全政策与标准:制定并实施严格的数据安全政策和标准,确保所有员工和合作伙伴…

ChatGPT国内中文版镜像网站整理合集(2024/10/21)

ChatGPT 镜像站的用途 镜像站(Mirror Site)是指通过复制原始网站内容和结构,创建的备用网站。其主要目的是在原始网站无法访问时,提供相同或类似的服务和信息。​ 一、GPT中文镜像站 ① yixiaai.com 支持4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用全模型,支持文件读…

插件发布新特性,让运动适配更简单。

为了让广大开发者更好的适配各AI运动场景,我们的AI运动识别插件已经迭代了23个版本,最近又迎来了我们的1.5.5小版本更新,本次更新了2个新特性,新特性有助于大家更好的适配新运动,更轻松的开发健身、体育、体测、AR互动等AI运动场景场景;下面我们就来看看这两个新特性。一…

P1078

然而题单里就是有这题…… dij,照亮世界! #include<bits/stdc++.h> using namespace std; int n,k,m,s,t,a[105][105],wen[105]; int d[100005]; bool vis[100005]; int qi,mo,f; inline int read(){int x=0;char ch=getchar();while (ch>=0&&ch<=9){x=x…