1. 什么是OAuth 2.0?
OAuth 2.0,全名为“开放授权2.0”(Open Authorization 2.0),是一种开放标准的授权协议,用于授权一个应用程序或服务访问用户在另一个应用程序中的资源,而无需提供用户名和密码。这使得用户可以安全地分享他们的数据资源,同时保持对其数据的控制。OAuth 2.0在现代互联网应用中被广泛使用,例如,你可以使用你的QQ账号登录CSDN。
2. OAuth 2.0的主要角色
- 资源所有者(Resource Owner):资源所有者是数据的拥有者,他们可以授权其他应用程序来访问他们的资源。例如,QQ用户。
- 客户端(Client):客户端是请求访问资源的应用程序。它可以是Web应用、移动应用、桌面应用,甚至是其他服务。例如,CSDN。
- 授权服务器(Authorization Server):授权服务器是资源所有者的服务提供者,负责验证资源所有者的身份并向客户端颁发访问令牌。这通常是第三方身份验证提供商,如QQ。
- 资源服务器(Resource Server):资源服务器是保存资源所有者的资源信息的服务器,通常和授权服务器属于同一应用,例如QQ既是授权服务器,也是资源服务器。
3. OAuth 2.0的两个核心概念
OAuth 2.0引入了两个核心概念,用于实现授权流程:
- 访问令牌(Access Token):访问令牌是客户端用来访问资源服务器上受保护资源的凭证。它是客户端向授权服务器请求的,通常具有一定的时效性。客户端使用访问令牌来证明它已被授权访问资源。
- 授权代码(Authorization Code):授权代码是客户端向授权服务器请求访问令牌的中间凭证。它用于在客户端和授权服务器之间进行安全的令牌交换。
4. OAuth 2.0的工作原理
现在,让我们深入了解OAuth 2.0的工作原理。下面是OAuth 2.0的基本工作流程:
1. 注册应用
客户端必须在授权服务器上注册,并获得一个客户端标识(Client ID)和客户端密码(Client Secret)。这是为了验证客户端的身份,并确保安全性。例如:CSDN网站必须要在QQ平台注册,才能给用户提供通过QQ号登录功能。
2. 重定向用户
客户端将用户重定向到授权服务器,以请求授权。用户将在授权服务器上登录并授权客户端访问他们的资源。例如:想登录CSDN的用户通过点击第三方登录方式中的QQ登录,会跳转到QQ登录页面,用户正确输入QQ账号密码或者选择快捷登录后弹出弹窗,询问用户是否同意登录CSDN。
3. 授权许可
一旦用户同意授权,授权服务器将生成一个授权代码,并将其发送回客户端。客户端使用授权代码向授权服务器请求访问令牌(授权许可有四种方式,下一节介绍)。例如:用户点击同意即代表同意授权,QQ平台会向CSDN平台发送授权码。
4. 获取令牌
客户端使用授权代码来请求访问令牌。授权服务器验证授权代码,如果有效,颁发访问令牌和刷新令牌。例如:CSDN平台通过授权码向QQ平台请求访问令牌,QQ平台验证授权码是否有效,如果有效,则向CSDN平台颁发访问令牌和刷新令牌。
5. 访问资源
客户端使用访问令牌来请求资源服务器上的受保护资源。资源服务器验证令牌,如果有效,提供资源,如果无效,则刷新令牌(Refresh Token),获取新的、有效的访问令牌。CSDN平台通过访问令牌来获取用户在QQ平台的资源数据(网名、头像等)
5. OAuth 2.0的四种授权许可方式
为了获得访问令牌(Token),客户端需要先从资源所有者(用户)那里获得授权。授权是以授权许可(Grant Type)的形式来表示的。OAuth定义了四种授权类型:
1、授权码模式(Authorization Code Grant)
当用户访问资源时,比如在CSDN中使用第三方登录功能,例如QQ登录,那么这里的资源就是用户的QQ昵称和头像等信息。此时第三方应用(CSDN)将发送请求到授权服务器(QQ)去获取授权,此时授权服务器(QQ)将返回一个界面给用户,用户需要登录到QQ,并同意授权网易云音乐获得某些信息(资源)。当用户同意授权后,授权服务器将返回一个授权码(Authorization Code)给第三方应用(CSDN),此时第三方应用(CSDN)在通过client_id、client_secret(这是需要第三方应用在授权服务器去申请的)和授权码去获得Access Token和Refresh Token,此时授权码将失效。然后就是第三方应用通过Access Token去资源服务器请求资源了,资源服务器校验Access Token成功后将返回资源给第三方应用。
2、隐式授权(Implicit Grant)
隐式授权又称简化授权模式,它和授权码模式类似,只不过少了获取授权码的步骤,是直接获取令牌token的,且没有Refresh Token,适用于公开的浏览器单页应用。因为令牌直接从授权服务器返回,所以没有安全保证,令牌容易因为被拦截窃听而泄露。
3、密码模式(Resource Owner Password Credentials Grant)
首先资源所有者(用户)提供自己的用户名和密码给客户端(Client),然后客户端(Client)携带从用户那里获取的凭证去授权服务器请求Token, 授权服务器对客户端进行身份认证,并校验资源所有者的凭证,如果都校验通过,则发放Token。
适用范围:只适用于应用是受信任的场景。一个典型的例子是同一个企业内部的不同产品要使用本企业的 Oauth2.0 体系。在这种情况下,由于是同个企业,不需要向用户展示“xxx将获取以下权限”等字样并询问用户的授权意向,而只需进行用户的身份认证即可。这个时候,只需要用户输入凭证并直接传递给鉴权服务器进行授权即可。
4、客户端授权模式(Client Credentials Grant)
客户端(Client)通过Client_id和Client_secret去授权服务器请求Token,授权服务器认证Client_id和Client_secret是否正确,若正确则发放Token给客户端(Client)。最后客户端通过AccessToken请求资源。
适用范围:只适用于应用是受信任的场景。
参考:
OAuth2.0入门(一)—— 基本概念详解和图文并茂讲解四种授权类型_oauth2.0基本概念-CSDN博客
什么是OAuth 2.0?深度解析OAuth 2.0的工作原理和应用场景-腾讯云开发者社区-腾讯云 (tencent.com)
如有侵权请联系 jshensi@163.com 删除