##一、写在前面
在收集资料时,我查询和学习了许多介绍OAuth的文章,这些文章有好有坏,但大多是从个例出发。因此我想从官方文档出发,结合在stackoverflow上的一些讨论,一并整理一下。整理的内容分为OAuth1.0a和OAuth2两部分。

OAuth 1.0a:One Leg ->Two Leg -> Three Legged
OAuth 2:Two Leg ->Three Legged (附:Refresh Token的方式)

这两种模式都是按箭头从左往右安全性递增,其实现也会相对复杂。关于官方的这种leg(腿?)的说法,在中文翻译中比较少有文章提及。下面分别来介绍OAuth的这5种授权流程。

##二、OAuth1.0a
2.1 OAuth 1.0a (One Leg)

  1. 应用给服务器发送一个签名请求,附带以下参数:

    • oauth_token Empty String
    • oauth_consumer_key
    • oauth_timestamp
    • oauth_nonce
    • oauth_signature
    • oauth_signature_method
    • oauth_version Optional
  2. 服务验证并授予对资源的访问
  3. 应用程序利用请求的资源

2.2 OAuth 1.0a (Two Legs)

  1. 应用发送一个签名请求,以获取 Request Token:

    • oauth_consumer_key
    • oauth_timestamp
    • oauth_nonce
    • oauth_signature
    • oauth_signature_method
    • oauth_version Optional
  2. 服务器返回Request Token:
    • oauth_token
    • oauth_token_secret
    • Additional Parameters / Arguments
  3. 发送签名请求,用Request Token换取Access Token
    • oauth_token Request Token
    • oauth_consumer_key
    • oauth_nonce
    • oauth_signature
    • oauth_signature_method
    • oauth_version
  4. 服务器返回Access Token和Token Secret
  5. 应用通过Access Token和Token Secret利用请求的资源

2.3 OAuth 1.0a (Three Legged)

  1. 应用发送一个签名请求,以获取 Request Token:

    • oauth_consumer_key
    • oauth_timestamp
    • oauth_nonce
    • oauth_signature
    • oauth_signature_method
    • oauth_version Optional
  2. 服务器返回Request Token:
    • oauth_token
    • oauth_token_secret
    • oauth_callback_confirmed
    • … Additional Parameters / Arguments
  3. 发送给用户授权的URL
    • oauth_token
  4. 提示用户进行授权
  5. 用户进行授权
  6. 授权结束后返回应用,附带上:
    • oauth_token
    • oauth_verifier
  7. 发送签名请求,用Request Token换取Access Token
    • oauth_token Request Token
    • oauth_consumer_key
    • oauth_nonce
    • oauth_signature
    • oauth_signature_method
    • oauth_version
    • oauth_verifier
  8. 服务器返回Access Token和Token Secret
  9. 应用通过Access Token和Token Secret利用请求的资源

##三、OAuth2

3.1 OAuth 2 (Two Legged)

3.1.1 客户端凭据方式

  1. 应用发送请求到服务器:

    • grant_type = client_credentials
      如果没有使用Authorization(Authorization: Basic Base64(client_id:client_secret)) 的header,必须附带参数为:
    • client_id
    • client_secret
  2. 服务器以Access Token回应
    • access_token
    • expires_in
    • token_type

3.1.2 隐式授予方式

  1. 应用发送请求到服务器:

    • response_type = token
    • redirect_uri This is a server-side Redirection URI hosted by the provider or yourself.
    • scope
    • state Optional
    • client_id
  2. 用户可根据需要授权。
    • username
    • password
  3. 服务器将响应包含access_token在内的redirect_uri
  4. 应用程序跳转至redirect_uri
  5. redirect_uri将响应一段脚本或HTML片段。响应的脚本或HTML片段包含参数access_token,还有您可能需要的任何其他参数。

3.1.3 资源所有者密码方式

  1. 应用向资源所有者请求凭证

    • username
    • password
  2. 应用使用凭证,向服务器发送请求
    • grant_type = password
    • username
    • password
      url看起来会像这样:grant_type=password&username=my_username&password=my_password
      如果你没有使用Authorization的header,必须附带上参数:
    • client_id
    • client_secret
      url看起来会像是:
      grant_type=password&username=my_username&password=my_password&client_id=random_string&client_secret=random_secret
  3. 服务器返回Access Toke
    • access_token
    • expires_in
    • token_type

3.2 OAuth 2 (Three Legged)

  1. 应用重定向用户到授权服务:

    • client_id
    • redirect_uri
    • response_type
    • state Optional; Unique identifier to protect against CSRF
    • scope Optional; what data your application can access.
      url看起来会像是:
      oauth_service/login/oauth/authorize?client_id=3MVG9lKcPoNINVB&redirect_uri=http://localhost/oauth/code_callback&scope=user
  2. 用户登录服务器并确认授权给应用
  3. 服务器重定向用户到redirect_url ,附带参数:
    • code
    • state
  4. 应用拿到code,并换取Access Token
    • client_id
    • client_secret
    • code
    • redirect_uri Optional;
    • grant_type = “authorization_code”
  5. 如果的client_id和client_secret是有效的,服务器将调用一个回调redirect_url,包含ACCESS_TOKEN
    • access_token
    • expires_in
    • refresh_token
  6. 应用保存ACCESS_TOKEN,在随后的请求中使用。通常这个值被存储在session或或cookie,需要时作为授权请求的参数。

3.3 OAuth 2 (Refresh Token 刷新token)

在OAuth2中,Token会有过期时间,我们必须去refresh_token,使用其他一些先前获得的参数,生成一个新的token。这是一个容易得多的流程。

  1. 创建刷新令牌请求

    • grant_type = “refresh_token”
    • scope Optional; Cannot have any new scopes not previously defined.
    • refresh_token
    • client_id
    • client_secret
  2. 服务验证和响应以下参数:
    • access_token
    • issued_at

##四、stackoverflow上的一些问答

Q:OpenID和OAuth的区别是什么?
A:OpenID是有关身份验证(即证明你是谁),OAuth有关授权(即授予访问权限),推荐博文:从用户的角度来看OpenID和OAuth

Q:OAuth2与OAuth1不同的地方是?有人可以简单的解释的OAuth2和OAuth1之间的区别吗? OAuth1现在已经过时,应实施的OAuth2?我没有看到许多实现的OAuth2,大多数仍在使用OAuth,这让我怀疑的OAuth2的准备使用。是吗?
A:OAuth2能更好地支持不是基于浏览器的应用。对于不是基于浏览器的应用程序,这是对OAuth的主要挑战。例如,在OAuth1.0,桌面应用或手机应用必须引导用户打开浏览器所需的服务,与服务进行身份验证,并复制令牌从服务返回给应用程序。这里的主要批评是针对用户体验。使用OAuth2.0,可以用新的方式为用户的应用程序获得授权。
OAuth2.0不再需要客户端应用程序拥有密钥。这让人回想起老的Twitter认证的API,它并不需要应用得到HMAC哈希令牌和请求字符串。使用OAuth2.0,应用程序可以通过HTTPS获得令牌。
OAuth2.0的签名流程简单得多。没有更多的特殊解析,排序,或编码。
OAuth2.0的访问令牌是“短命”的。通常情况下,OAuth1.0的访问令牌可以存储一年或一年以上(Twitter从来没有让他们到期)。 OAuth的2.0有刷新令牌的概念。虽然我不能完全肯定这是什么意思,我的猜测是,您的访问令牌可以是短暂存储的(即基于会话),而你可以刷新令牌。你使用刷新令牌获取新的访问令牌,而不是让用户重新授权您的应用程序。
最后,OAuth2.0使得负责处理的OAuth请求的服务器和处理用户的授权服务器之间的角色有一个干净的分离。更多信息,在上述的文章中详述。

Q:OAuth2服务器群怎么使用state来防范CSRF?
A:state只是一个随机的字符串,可以做这样的事情:$state = md5(uniqid(rand(), TRUE));在session中记录satate,以便稍后你能做验证。一些额外的资料:OAuth2威胁文件模型特别CSRF保护

 
 
 
 
 
转:http://litten.me/2013/08/11/brief-oauth/

谈谈OAuth1,OAuth2异同的更多相关文章

  1. Qt5.9 提供Qt Remote Objects,OAuth1 & OAuth2,重写了QML的GC

    Technology Preview Modules Qt Remote Objects - A module that allows you to easily share QObject inte ...

  2. Alamofire 4.0 迁移指南

    Alamofire 4.0 是 Alamofire 最新的一个大版本更新, 一个基于 Swift 的 iOS, tvOS, macOS, watchOS 的 HTTP 网络库. 作为一个大版本更新, ...

  3. Paw —— 比Postman更舒服的API利器

    特点: 颜值高本地应用,流畅有收藏夹,管理请求可使用环境变量.比如用来一键切换开发环境请求和线上环境请求.即不同环境的同个接口只有host不一样,其它都是一样的,所以就把host抽离出来弄成一个环境变 ...

  4. 接口测试 rest-assured 使用指南

    转自:https://testerhome.com/topics/7060 原文:https://github.com/rest-assured/rest-assured/wiki/Usage本文gi ...

  5. spring social理解

    现在互联网飞速发展,人们每天在互联网上冲浪,获取各种信息.各大网站为了方便用户的登录,提供了各式各样的社交登录,比如:QQ.微信和微博登录等.这些主流的社交登录大多是基于oauth协议进行实现,spr ...

  6. 就个人银行账户管理程序谈谈C++和Java的异同

    4_9 同: Java和C++都是面向对象的语言.都有数据成员,方法,访问权限的概念. 异: 访问权限上,非private时Java的默认访问权限是包.而C++的默认访问权限是private.Java ...

  7. 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  8. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  9. http、tcp、udp、OAUTH2.0网络协议区别

                    一.先来一个讲TCP.UDP和HTTP关系的 1.TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RAR ...

随机推荐

  1. .netcore项目部署到linux的docker里后,速度异常的慢

    .netcore项目部署到linux的docker里后,速度异常的慢,部署在iis下速度非常快. 特别是 接口里再调用其他接口,那速度绝对是蜗牛爬行的速度. 经过几个月的折腾,终于知道是什么问题了: ...

  2. Java12新特性 -- 增强G1,自动返回未用堆内存给操作系统

    Java 12 中增强了 G1 垃圾收集器关于混合收集集合的处理策略,这节主要介绍在 Java 12 中同时也对 G1垃圾回收器进行了改进,使其能够在空闲时自动将 Java 堆内存返还给操作系统,这也 ...

  3. 泡泡一分钟:Collaborative Mapping with Pose Uncertainties using different Radio Frequencies and Communication Modules

    张宁 Collaborative Mapping with Pose Uncertainties using different Radio Frequencies and Communication ...

  4. docker 启动mysql 闪退 无法启动问题

    docker 安装mysql [获取容器] docker pull mysql:5.6 [启动容器] docker run -p 3306:3306 --name mymysql -v $PWD/co ...

  5. SAP翔子_ABAP_DEMO篇索引

    序号 描述 SAP翔子_ABAP_DEMO篇1 ABAP DEMO篇1 单层反查BOM SAP翔子_ABAP_DEMO篇2 ABAP DEMO篇2 删除工艺路线 SAP翔子_ABAP_DEMO篇3 A ...

  6. PHP urlencode空格被转为+的问题

    我想既然各位点进来,绝大数是因为你遇到了空格被转为+号所带来的坑 不过没关系,解决方案很简单:使用rawurlencode()来进行编码即可~此函数遵循RFC 3986标准,空格会被转为%20 同时, ...

  7. nginx的rtmp搭建流媒体服务器实现直播流

    最近自己搞了一个用nginx的rtmp来搭建流媒体服务器,从而实现直播的过程,参考了网上很多资料,有些资料对于初学者来说比较难以理解,在此将我搭建的过程记录下来,分享给大家. 1.下载nginx-rt ...

  8. (CSDN迁移)JAVA多线程实现-单线程化线程池newSingleThreadExecutor

    JAVA通过Executors提供了四种线程池,单线程化线程池(newSingleThreadExecutor).可控最大并发数线程池(newFixedThreadPool).可回收缓存线程池(new ...

  9. Java多线程编程(3)--线程安全性

    一.线程安全性   一般而言,如果一个类在单线程环境下能够运作正常,并且在多线程环境下,在其使用方不必为其做任何改变的情况下也能运作正常,那么我们就称其是线程安全的.反之,如果一个类在单线程环境下运作 ...

  10. js中常用的获得日期对象的方法

    // 默认是当前时区的日期和时间 var date = new Date(); // 获取特定日期和时间的日期对象,需要传递毫秒数,不过可以传递规范日期格式字符串来代替 // 一些常见的日期格式 // ...