OAuth
OAuth 是一种开放标准授权协议(有时也被称为框架),它为桌面、移动和 Web 应用提供了一种简单且标准化的方式来访问需要用户授权的 HTTP 服务。OAuth 被广泛用于允许一个应用代表用户访问另一个服务,而无需用户提供他们的凭据(如用户名和密码)给该应用。
OAuth 的工作流程
OAuth 的工作流程通常涉及以下几方:
- 资源所有者(Resource Owner):通常是最终用户,拥有存储在服务提供商那里的数据。
- 客户端(Client):希望访问资源所有者数据的应用程序。
- 授权服务器(Authorization Server):由服务提供商运营,负责验证资源所有者的身份,并询问他们是否同意授予客户端访问权限。
- 资源服务器(Resource Server):托管受保护资源的服务器,能够接受并响应受保护的资源请求使用访问令牌。
标准的 OAuth 2.0 授权流程包括以下几个步骤:
客户端注册:在使用 OAuth 之前,客户端需要向服务提供商注册。这样可以获得客户端 ID 和客户端密钥,这些是识别客户端的重要信息。
重定向到授权服务器:客户端将用户引导至授权服务器以请求访问令牌。这个过程通常通过用户的浏览器完成。
用户授予权限:授权服务器提示用户登录并询问用户是否同意授予客户端特定范围的访问权限。
获取授权码:如果用户同意,则授权服务器会重定向回客户端,并附带一个授权码。
交换授权码获取访问令牌:客户端使用授权码从授权服务器请求访问令牌。这一步通常直接在客户端与授权服务器之间进行,不涉及用户的浏览器。
访问受保护资源:一旦客户端获得访问令牌,就可以使用它来请求资源服务器上的受保护资源。
OAuth 2.0
OAuth 2.0 是 OAuth 协议的第二个主要版本,提供了更简单的设计和更高的灵活性。OAuth 2.0 定义了四种授权类型:
- 授权码模式(Authorization Code Grant):最安全、最常见的授权方式,适合于有后端服务器的应用。
- 隐式授权(Implicit Grant):设计用于没有能力保密客户端秘密的纯前端应用,例如 JavaScript 单页面应用(SPA)。
- 密码凭证授权(Resource Owner Password Credentials Grant):用户将自己的登录名和密码交给客户端,客户端使用这些信息直接向认证服务器换取访问令牌。这种方式不推荐,因为安全性较低。
- 客户端凭证授权(Client Credentials Grant):适用于客户端本身即资源所有者的情况,或当授权范围限制于客户端自身时。
OAuth 2.0 还引入了刷新令牌的概念,允许客户端在访问令牌过期后获取新的访问令牌,而不需要再次经过用户授权的过程。
请注意,尽管 OAuth 可以用于认证目的,但它本质上是一个授权框架,而不是认证协议。为了支持认证功能,OpenID Connect 作为一个基于 OAuth 2.0 的身份层协议应运而生。