OAuth2 基础概念
标签(空格分隔): OAuth2
什么是OAuth2 ?
OAuth2.0是OAuth协议的延续版本,为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程
现在百度开放平台,腾讯开放平台等大部分的开放平台都是使用的OAuth 2.0协议作为支撑。
授权模式
- 1、授权码模式(获取code、code换取access_token)
- 2、简化模式(直接换取access_token,基本不用)
- 3、密码模式(客户端向用户索取账号密码,然后客户端向服务端索取授权,系统中已经有一套用户系统使用)
- 4、客户端模式(客户端以自己的名义要求"服务提供商"提供服务;场景:提供接口服务)
授权码模式
授权码模式(authorization code)是功能最完整、流程最严密的授权模式。它的特点就是通过客户端的后台服务器,与"服务提供商"的认证服务器进行互动。相关的例子有微信公众号认证,第三方网站登录等等
用户->客户端: 使用客户端
客户端->认证服务器: 将用户导向认证服务器
认证服务器->客户端: 重定向事先指定的"重定向URI,并附上授权码
客户端->认证服务器: 用带上的code请求access_token
认证服务器-> 客户端: 认证服务器核对后发放access token refresh token
客户端-> 资源服务器: 用拿到的access_token访问资源
客户端申请认证的url需要带的参数
- response_type:表示授权类型,必选项,此处的值固定为"code"
- client_id:表示客户端的ID,必选项
- redirect_uri:表示重定向URI,可选项
- scope:表示申请的权限范围,可选项
- state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
url示范
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
注意:redirect_uri需要编码
授权服务器重定向到客户端的url,包含下面的参数
- code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
- state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
举个例子
https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
&state=xyz
客户端带着code向服务器请求需要带的参数
- grant_type:表示使用的授权模式,必选项,此处的值固定为"authoriza- tion_code"。
- code:表示上一步获得的授权码,必选项。
- redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致,需要url编码
- client_id:表示客户端ID,必选项。
举个例子
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
服务器向客户端发放token时的返回值
- access_token:表示访问令牌,必选项。
- token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
- expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
- refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
- scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。
简化模式
简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。
用户->客户端: 使用客户端
客户端->认证服务器: 将用户导向认证服务器
认证服务器->客户端: 重定向事先指定的"重定向URI,并附上hash令牌
游览器->资源服务器: 发出请求,不包括上一步收到的hash
资源服务器-> 游览器: 返回一个网页,其中包含的代码可取出hash中的token
游览器-> 客户端: 发给客户端
密码模式
密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。
在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码,使用场景一般是比较信任的应用或者是系统中的一部分
用户->客户端: 使用客户端并输入用户名和密码
客户端->认证服务器: 使用用户名密码向认证服务器请求token
认证服务器->客户端: 返回token
客户端模式
客户端模式(Client Credentials Grant)指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实用户不存在授权问题。
用户->客户端: 使用客户端并输入用户名和密码
客户端->认证服务器: 使用自己的名义向服务器进行身份认证
认证服务器->客户端: 返回token
更新令牌
如果用户访问的时候,客户端的"访问令牌"已经过期,则需要使用"更新令牌"申请一个新的访问令牌。
客户端发出更新令牌的HTTP请求,包含以下参数:
- granttype:表示使用的授权模式,此处的值固定为"refreshtoken",必选项。
- refresh_token:表示早前收到的更新令牌,必选项。
- scope:表示申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致。