OAuth2.0认证

OAuth介绍

OAuth2.0官方文档

  • Open Standard Authorization (OAuth)
  • OAuth是一个网络开放协议。为保证用户资源的安全授权提供了简易的标准

特点:

  • 简单:不管是OAUTH服务提供者还是应用开发者,都很易于理解与使用
  • 安全:没有涉及到用户密钥等信息,更安全更灵活
  • 开放:任何服务提供商都可以实现OAUTH,任何软件开发商都可以使用OAuth

OAuth2.0

  • 2012年10月,OAuth 2.0协议正式发布为RFC 6749
  • OAuth协议的下一版本,但不向后兼容OAuth 1.0
  • OAuth 2.0关注客户端开发者的简易性,同时为Web应用,桌面应用和手机,和起居室设备提供专门的认证流程

OAuth2.0角色

resource owner: 资源所有者,指的是用户

resource server: 资源服务器,指的是应用服务器

client: 客户端,指的是应用

authorization server: 授权服务器,指的是应用服务器

OAuth2.0流程

 +--------+                               +---------------+
 |        |--(A)- Authorization Request ->|   Resource    |
 |        |                               |     Owner     |
 |        |<-(B)-- Authorization Grant ---|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(C)-- Authorization Grant -->| Authorization |
 | Client |                               |     Server    |
 |        |<-(D)----- Access Token -------|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(E)----- Access Token ------>|    Resource   |
 |        |                               |     Server    |
 |        |<-(F)--- Protected Resource ---|               |
 +--------+                               +---------------+

A: 客户端向资源所有者请求授权。这授权请求可以直接向资源所有者提出,或者最好通过授权间接服务器作为中介

B: 客户端收到授权授权,这是一个代表资源所有者授权的凭证

C: 客户端通过身份验证请求访问令牌 授权服务器并提供授权许可

D: 授权服务器对客户端进行身份验证并验证授权,如果有效,则颁发访问令牌

E: 客户端向资源请求受保护的资源 服务器并通过提供访问令牌进行身份验证

F: 资源服务器验证访问令牌,如果有效,则提供资源

OAuth2.0授权类型

  • 授权码(Authorization Code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client credentials)

授权码授权类型(Authorization Code)

第三方应用先申请一个授权码,再通过授权码获取访问令牌。适合有后端的应用,比如网站应用。

scope参数

步骤:

  1. A网站提供一个链接,链接中包含本网站的跳转地址、网站的身份(client_id或app_key),点击后跳转到B网站
  2. B网站进行登陆,登陆成功后,跳转到A网站,并且在URL中携带一个授权码
  3. A网站拿到授权码,在后端携带授权码来请求A网站的接口(携带授权码、appkey、secretkey)
  4. B站收到请求,验证授权码,如果验证成功,则返回访问令牌,重刷令牌(access_token, refresh_token)

通常请求格式为: https://stolenzc.com/oauth/authorize?response_type=code&appkey=appkey&redirect_uri=redirect_uri&scope=scope

  • response_type: 授权类型,必须为code
  • appkey: 网站的身份,为应用在网站申请的appkey
  • redirect_uri: 申请成功后网站的回跳地址
  • scope: 网站的范围,可以为空,为空则表示全部范围,可以为多个范围,用逗号分隔

响应格式: 在回跳地址中携带授权码,比如:https://stolenzc.com/callback?code=1234567890

后台再请求令牌的格式: https://stolenzc.com/oauth/token?appkey=appkey&appsecret=appsecret&grant_type=authorization_code&code=code&redirect_uri=redirect_uri

  • grant_type: 授权类型,必须为authorization_code
  • appkey: 网站的身份,为应用在网站申请的appkey
  • appsecret: 网站的身份,为应用在网站申请的appsecret,appsecret为保密的,所以只能在后端请求
  • code: 授权码
  • redirect_uri: 验证成功后授权方带上token数据请求该uri地址传递token数据

隐藏式授权类型(implicit)

第三方应用请求接口直接获取访问令牌。适合没有后端的应用,比如移动应用。

步骤:

  1. A网站提供一个链接,链接中包含本网站的跳转地址、网站的身份(client_id或app_key),点击后跳转到B网站
  2. B网站进行登陆,登陆成功后,跳转到A网站,并且在URL中以锚点的形式携带一个访问令牌

通常请求格式为: https://stolenzc.com/oauth/authorize?response_type=token&appkey=appkey&redirect_uri=redirect_uri&scope=scope

  • response_type: 授权类型,必须为token
  • appkey: 网站的身份,为应用在网站申请的appkey
  • redirect_uri: 申请成功后网站的回跳地址
  • scope: 网站的范围,可以为空,为空则表示全部范围,可以为多个范围,用逗号分隔

密码式授权类型(password)

第三方应用拿到用户账号密码,直接用账号密码获取令牌

  1. A网站要求用户提供账号和密码,拿到后A网站直接向B网站请求令牌
  2. B网站验证密码后,直接返回令牌,不需要进行跳转

请求令牌的格式: https://stolenzc.com/oauth/token?appkey=appkey&grant_type=password&username=username&password=password

  • grant_type: 授权类型,必须为password
  • appkey: 网站的身份,为应用在网站申请的appkey
  • username: 用户名
  • password: 密码

凭证式授权类型(client credentials)

凭证式适用于没有前端的命令行应用,通常是多个用户享用一个令牌,通常针对第三方应用,不是针对用户的。

  1. A应用在命令行向B应用发出接口请求,只需要携带appkey和secretkey即可
  2. B应用验证通过后,直接返回令牌

请求令牌的格式: https://stolenzc.com/oauth/token?grant_type=client_credentials&appkey=appkey&secretkey=secretkey

  • grant_type: 授权类型,必须为client_credentials
  • appkey: 网站的身份,为应用在网站申请的appkey
  • secretkey: 网站的身份,为应用在网站申请的appsecret

使用令牌和令牌过期

后续请求资源的时候,需要将令牌放在请求头中携带

通常在申请令牌的时候,会同时返回一个refresh_token,用来在token失效的时候,重新申请一个新的令牌。

重刷令牌的格式: https://stolenzc.com/oauth/token?grant_type=refresh_token&appkey=appkey&secretkey=secretkey&refresh_token=refresh_token

  • grant_type: 授权类型,必须为refresh_token
  • appkey: 网站的身份,为应用在网站申请的appkey
  • secretkey: 网站的身份,为应用在网站申请的appsecret
  • refresh_token: 重刷令牌