简介
OAuth 2.0(开放授权)是一种用于授权的开放标准,允许用户授权第三方应用访问其在另一个服务提供者上的资源,而无需共享其凭据(例如用户名和密码)。OAuth 2.0的设计目标是简化授权流程,提高安全性,并允许开发者在不暴露用户凭据的情况下获取访问受保护资源的权限。
例如:访问淘宝主页时提示需要登录淘宝,可以使用微信账号授权登录,登录成功之后跳转到淘宝主界面。
角色
OAuth2.0共有四种角色
- 客户端:希望被授权的应用,比如此例中的淘宝。
- 授权服务器:负责验证客户端的身份颁发令牌,比如此例中的微信公众平台。
- 资源服务器:受保护的资源,只有接受到令牌才能访问这些资源。比如此例中的淘宝主页。
- 资源所有者:即用户,此例中指微信用户。
流程
OAuth2.0中定义了不同的授权流程,其中一些常见的包括:
授权码授权流程
Authorization Code Grant:客户端通过授权服务器获取授权码,然后再用授权码获取令牌。
适用于安全的客户端,要求客户端能保证凭证的机密性,一旦客户端凭证泄露那么整个流程就不再安全。
具体流程:
- 用户通过客户端访问资源服务器。
- 客户端将请求重定向到授权服务器(同时携带认证信息、请求的范围等)
- 用户执行授权。
- 授权通过之后授权服务器将授权码返回给客户端。
- 客户端使用授权码向授权服务器获取令牌(同时携带客户ID、密码)
- 授权服务器验证客户端身份、授权码、有效期之后,发放令牌。
- 客户端使用令牌访问资源。
本例中:
- 用户访问淘宝,客户端和资源服务器都是淘宝。
- 淘宝将请求重定向到微信公众平台获取授权,同时携带客户端ID、密码、请求范围、状态码等信息访问.
- 用户点击同意登录。
- 微信公众平台生成授权码,返回给淘宝。
- 淘宝使用授权码向令牌端点请求令牌,同时携带客户ID、密码。
- 微信公众平台验证客户ID、密码、授权码之后发放令牌。
- 淘宝使用令牌访问淘宝主页。
隐式授权流程
Implicit Grant:客户端通过授权服务器直接获取令牌。不需要获取授权码,并且令牌以URL参数的方式获取。
具体流程:
- 客户端发起授权请求
- 用户同意授权
- 授权服务器通过重定向的方式将令牌、令牌类型、有效期等数据放到URL中返回给客户端。
- 客户端使用令牌访问资源,令牌被放到请求头或请求参数中。
由于令牌等敏感信息存放在URL中,所以不安全。
密码授权流程
Resource Owner Password Credentials Grant: 客户端直接使用密码获取令牌。
比如:登录淘宝时提示输入微信用户名、密码。然后淘宝使用微信的用户名、密码去微信公众平台进行认证。
适用于授权服务器完全信任客户端,比如:微信完全信任淘宝,数据完全共享。
具体流程:
- 客户端发送授权申请(包括客户端ID、客户端密码、用户名、密码)
- 授权服务器校验用户身份并颁发令牌
- 客户端使用令牌访问
客户端凭证授权流程
Client Credentials Grant:不需要用户介入,客户端直接向授权服务器获取授权。适用于机器之间的授权。
具体流程:
- 客户端向授权服务器发送凭证
- 授权服务器验证凭证并颁发令牌
- 客户端使用令牌访问资源
其他
优先级: 授权码 > 隐式 > 密码