这里可以看阮一峰老师关于 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账户密码交给这个社交媒体应用程序。在这种情况下,传统的凭据分享方式存在严重的安全风险:
- 凭据共享风险:用户需要将自己的用户名和密码提供给第三方,这增加了密码被滥用或泄露的风险。
- 权限过度:一旦用户共享了自己的凭据,第三方可以获得对用户所有资源的访问权限,超出用户的预期。
- 凭据无法撤销:如果用户想要撤销对某个应用的授权,他不得不更改自己的密码,从而影响其他已授权的服务。
为了解决这些问题,OAuth 2.0 引入了一种安全、可靠且灵活的方式来管理授权和访问。
二、OAuth 2.0 解决了什么问题?
-
分离身份验证与授权:OAuth 2.0 允许第三方应用程序(也称为客户端应用)在用户授权的情况下访问资源,而无需直接获取用户的凭据。
-
精细化权限控制:通过OAuth 2.0,用户可以授权应用程序访问特定的资源或执行特定的操作,而无需开放所有权限。
-
可撤销性:用户可以随时通过资源提供商(如Google)的设置界面撤销某个应用程序的授权,而无需更改密码。
-
减少用户密码暴露的风险:应用程序不再直接处理用户的密码,授权流程通过访问令牌控制,确保用户凭据的安全。
三、OAuth 2.0 的角色
在OAuth 2.0的架构中,主要涉及四个角色:
-
资源所有者(Resource Owner):通常是用户,拥有需要访问的资源。例如,用户的Google Drive上的文件。
-
客户端(Client):请求访问资源的应用程序。它可以是一个Web应用、移动应用或桌面应用。
-
授权服务器(Authorization Server):负责认证资源所有者的身份,并在获得授权后,颁发访问令牌(Access Token)。授权服务器通常由资源服务器同一实体管理(例如,Google 的授权服务器可以为Google Drive的资源提供授权)。
-
资源服务器(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_id 和 client_secret:客户端的标识符和密钥,用于证明客户端的身份。
示例POST请求:
POST /token
Host: https://authorization-server.com
Content-Type: application/x-www-form-urlencoded
grant_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 还支持其他几种常见的授权模式,适用于不同场景:
-
隐式授权模式(Implicit Grant):主要用于单页应用(SPA)或移动应用,客户端直接在浏览器中接收访问令牌,无需通过服务器端换取授权码。这种模式不涉及刷新令牌,因为安全性较低,适用于短期使用场景。
-
密码授权模式(Resource Owner Password Credentials Grant):用户将其凭据(用户名和密码)直接提供给客户端应用,客户端再用这些凭据向授权服务器请求访问令牌。这种模式一般不建议使用,除非客户端是受信任的应用。
-
客户端凭据模式(Client Credentials Grant):客户端以自己的身份(而非用户的身份)请求访问受保护的资源。这通常用于应用程序间的服务(如微服务)之间的授权,而非用户授权。
-
刷新令牌(Refresh Token Grant):当访问令牌过期时,客户端可以使用刷新令牌获取新的访问令牌,而无需再次向用户请求授权。
六、OAuth 2.0 的优势
-
安全性增强:OAuth 2.0允许应用程序在不暴露用户凭据的情况下访问资源,降低了凭据泄露的风险。
-
用户体验好:用户只需授权一次,而无需每次都输入用户名和密码,极大提高了用户体验。
-
灵活的授权管理:用户可以控制授权的范围,并且随时可以撤销授权,保证了授权的灵活性和安全性。
-
跨平台支持:OAuth 2.0 可用于Web应用、移动应用、桌面应用等多种
环境,广泛支持。
七、总结
OAuth 2.0 是一种安全、灵活的授权协议,解决了在不同平台和服务之间安全地共享资源的问题。通过使用访问令牌,OAuth 2.0 可以确保第三方应用程序能够安全地访问用户的资源,同时用户对授权过程有充分的控制。
标签:令牌,访问,OAuth,授权,2.0,过程,客户端 From: https://www.cnblogs.com/gongchengship/p/18488309