OAuth 2.0 协议原理和认证流程

原创 2018年04月17日 13:54:34

OAuth 2.0 的定义

OAuth 2.0 的规范可以参考 : RFC 6749

OAuth 是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。目前,OAuth 的最新版本为 2.0

OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth 允许用户授权第三方网站访问他们存储在另外的服务提供者上的信息,而不需要分享他们的访问许可或他们数据的所有内容。

OAuth 2.0 的核心概念

OAuth 2.0 主要有4类角色:

  1. resource owner:资源所有者,指终端的“用户”(user)
  2. resource server:资源服务器,即服务提供商存放受保护资源。访问这些资源,需要获得访问令牌(access token)。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。如果,我们访问新浪博客网站,那么如果使用新浪博客的账号来登录新浪博客网站,那么新浪博客的资源和新浪博客的认证都是同一家,可以认为是同一个服务器。如果,我们是新浪博客账号去登录了知乎,那么显然知乎的资源和新浪的认证不是一个服务器。
  3. client:客户端,代表向受保护资源进行资源请求的第三方应用程序。
  4. authorization server: 授权服务器, 在验证资源所有者并获得授权成功后,将发放访问令牌给客户端。

OAuth 2.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)用户同意给予客户端(网站)授权,获得一个门票,并跳转到指定的Url。
  • (C)客户端(网站)使用上一步获得的授权,向认证服务器申请访问令牌Token。
  • (D)认证服务器对客户端(网站)进行认证以后,确认无误,同意发放访问令牌。
  • (E)客户端(网站)使用访问令牌,向资源服务器申请获取资源。
  • (F)资源服务器确认令牌无误,同意向客户端(网站)开放资源。

注意:在认证功能实现之前,首先网站要去授权方申请权限,授权方会对用户权限进行分类。授权方和相应网站达成共识。

其中,用户授权有四种模式:

  • 授权码模式(authorization code)(正宗方式)(支持refresh token)
  • 简化模式(implicit)(为web浏览器应用设计)(不支持refresh token)
  • 密码模式(resource owner password credentials)(为遗留系统设计)(支持refresh token)
  • 客户端模式(client credentials)(为后台api服务消费者设计)(不支持refresh token)

最常用的是授权码模式:
这里写图片描述

步骤如下:
(A)用户访问客户端,后者将前者导向认证服务器。
(B)用户选择是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的”重定向URI”(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的”重定向URI”,向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

A步骤中,客户端申请认证的URI,包含以下参数:

  • response_type:表示授权类型,必选项,此处的值固定为”code”
  • client_id:表示客户端的ID,必选项
  • redirect_uri:表示重定向URI,可选项 scope:表示申请的权限范围,可选项
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
        &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com

C步骤中,服务器回应客户端的URI,包含以下参数:

  • code:表示授权码,必选项。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI,是一一对应关系。
  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。
HTTP/1.1 302 Found
Location: https://client.example.com/cb?code=SplxlOBeZQQYbYS6WxSbIA
          &state=xyz

D步骤中,客户端向认证服务器申请令牌的HTTP请求,包含以下参数:

  • grant_type:表示使用的授权模式,必选项,此处的值固定为”authorization_code”。
  • code:表示上一步获得的授权码,必选项。
  • redirect_uri:表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致。
  • client_id:表示客户端ID,必选项。
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb

E步骤中,认证服务器发送的HTTP回复,包含以下参数:

  • access_token:表示访问令牌,必选项。
  • token_type:表示令牌类型,该值大小写不敏感,必选项,可以是bearer类型或mac类型。
  • expires_in:表示过期时间,单位为秒。如果省略该参数,必须其他方式设置过期时间。
  • refresh_token:表示更新令牌,用来获取下一次的访问令牌,可选项。
  • scope:表示权限范围,如果与客户端申请的范围一致,此项可省略。

     HTTP/1.1 200 OK
     Content-Type: application/json;charset=UTF-8
     Cache-Control: no-store
     Pragma: no-cache

     {
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
     }

参考文章:
1、Q Q授权登录
2、新浪微博授权
3、OAuth 2.0四种授权
4、理解OAuth 2.0

版权声明:本文为博主原创文章,转载请注明:http: https://blog.csdn.net/visant/article/details/79973855

OAuth2.0协议 - OAuth授权流程详解

三个重要步骤 1、慕课网向腾讯QQ OAuth请求OAuth登录页 2、用户在这个页面中输入QQ号和密码 3、最后腾讯QQ OAuth把登录结果返回给慕课网步骤一:请求OAuth登陆页Reque...
  • github_26672553
  • github_26672553
  • 2017-02-20 21:10:18
  • 6106

OAuth的机制原理讲解及开发流程

原文地址:http://kb.cnblogs.com/page/189153/本想前段时间就把自己通过QQ OAuth1.0、OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,...
  • AloneSword
  • AloneSword
  • 2013-09-30 11:33:05
  • 57776

OAuth2.0授权原理及开发流程详解

OAuth2.0授权原理及开发流程详解 程序员小强 1天前 OAuth2.0在认证和授权的过程中参与的几个角色如下: Client - 第三方应用, 下面以小明使用qq登陆本站为例来讲解OA...
  • u013322876
  • u013322876
  • 2017-08-17 09:14:32
  • 727

OAuth 2.0 认证的原理与实践

使用 OAuth 2.0 认证的的好处是显然易见的。你只需要用同一个账号密码,就能在各个网站进行访问,而免去了在每个网站都进行注册的繁琐过程。 本文将介绍 OAuth 2.0 的原理,并基于 Spri...
  • kkkloveyou
  • kkkloveyou
  • 2017-03-24 01:41:24
  • 3567

OAuth 2.0 原理介绍

最近在做对用户的认证及REST API的访问权限控制,需要用OAuth来实现第三方应用对我们API的访问控制。OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密...
  • kaelsass
  • kaelsass
  • 2015-08-20 15:00:51
  • 1757

OAuth认证协议原理及使用方法

  • 2011年03月27日 20:54
  • 38KB
  • 下载

关于OAuth以及OAuth1.0与OAuth2.0的区别

一、       Oauth的概念 Oauth的官方简介是: An open protocol to allow secure API authorization in a simple ands...
  • u013436121
  • u013436121
  • 2014-04-14 00:44:54
  • 4669

【学无止境】基于ThinkPHP的OAuth2.0实现 ------ OAuth2.0个人学习笔记 One

前言最经要定义一些接口于是接触到了OAuth2.0这样的第三方接口机制,所以就简单的了解下,把学习感想发在这里以便以后参考回顾 了解 OAuth2.0其实网上有一篇大神阮一峰写的博文已近写的很好了,在...
  • RE_PHPzjw
  • RE_PHPzjw
  • 2017-05-05 11:43:48
  • 1474

关于OAuth2.0认证的理解和java实现

本来想写写自己的理解的,发现没什么必要。。。 原理的话看阮一峰这篇就好:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 例子的一看这一篇:h...
  • qq_28394425
  • qq_28394425
  • 2017-01-10 22:54:35
  • 16684

Oauth2.0认证原理

(A)用户打开客户端以后,客户端要求用户给予授权。 (B)用户同意给予客户端授权。 (C)客户端使用上一步获得的授权,向认证服务器申请令牌。 (D)认证服务器对客户端进行认证以后,确认无误,同意...
  • ysk_xh_521
  • ysk_xh_521
  • 2017-11-18 13:02:47
  • 407
收藏助手
不良信息举报
您举报文章:OAuth 2.0 协议原理和认证流程
举报原因:
原因补充:

(最多只允许输入30个字)