热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

OAuth2.0与1.0的对比与实例化描述分享

前言:云计算引出了大量的开放平台,各种第三方应用建立在开放平台之上,出于安全性的要求便出现了oauth协议,2007年发布了Oauth1.0协议,2.0的草案与2011年发布。定义

前言:云计算引出了大量的开放平台,各种第三方应用建立在开放平台之上,出于安全性的要求便出现了oauth协议,2007年发布了Oauth1.0协议,2.0的草案与2011年发布。

定义:OAuth: OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容。

1、2.0的用户授权过程(过程可参考流程图)


  • 引导用户到授权服务器,请求用户授权,用户授权后返回 授权码(Authorization Code)

  • 客户端由授权码到授权服务器换取访问令牌(Access Token)

  • 用访问令牌去访问得到授权的资源

技术分享图片

  (Client指第三方应用,Resource Owner指用户,Authorization Server是我们的授权服务器,Resource Server是API服务器。)

2、1.0的用户授权过程


  • 客户端到授权服务器请求一个授权令牌(Request Token&Secret)

  • 引导用户到授权服务器请求授权

  • 用访问令牌到授权服务器换取访问令牌(Access Token&Secret)

  • 用访问令牌去访问得到授权的资源

3、两者的对比:

  OAuth1.0协议每个Token都有一个加密,2.0则不需要。这样来看1.0似乎更加安全,但是2.0要求使用https协议,安全性也更高一筹。

  OAuth2.0充分考虑了客户端的各种子态,因而提供了多种途径获取访问令牌

    a)授权码

         b)客户端私有证书

         c)资源拥有者密码证书

         d)刷新令牌

         e)断言证书

   OAuth1.0只有一个用户授权流程。

   OAuth2.0较1.0相比,整个授权验证流程更简单更安全,也是未来最主要的用户身份验证和授权方式。


OAuth 2.0协议


协议的参与者

OAuth的参与者至少有以下四个:


  • RO(Resource Owner):资源所有者,对资源具有授权能力的人。其实来讲就是用户,如上文的小明。

  • RS(Resource Server):资源服务器,它存储资源,并处理对资源的访问请求。如上文的新浪微博资源服务器

  • Client:第三方应用,它获取RO的授权后就可以访问RO的资源。如上文的第三方客户端

  • AS(Authorization Server):授权服务器,它认证RO的身份,为RO提供授权审批流程,并最终颁发授权令牌(Access Token)。AS和RS的功能可以由同一个服务器来提供。

简单的来讲就是用户第三方客户端服务器。这个服务器有两个工作:授权提供资源

OAuth的思路

OAuth在Client和RS之间设置了一层授权层。Client不能直接登录RS,只能利用令牌来登录授权层,而且这个令牌有权限范围和有效期。

时序图

 技术分享图片


 




基本流程:

1、用户打开第三方客户端(后面简称客户端),客户端引导用户去授权。

2、用户同意授权给客户端,也就是点击了同意授权的按钮,之后客户端会拿到授权证据。这里用户如何批准是关键,后面会讲到。

3、客户端服务器请求访问令牌(Access Token),同时出示前面的步骤拿到的授权证据

4、服务器通过认证后,向客户端返回访问令牌

5、客户端携带访问令牌去访问服务器上的资源。

6、服务器验证令牌的有效期和真伪,验证通过后才能提供服务。

 

有两个关键的东西,一个是用户同意授权的授权证据,一个是用授权证据进一步请求拿到的访问令牌

客户端的授权

上面讲到用户客户端授权这一步是关键。客户端必须得到用户的授权才能获得令牌。Auth2.0定义了四种授权方式:


  • 授权码模式

  • 简化模式

  • 密码模式

  • 客户端模式


授权码模式

授权码模式是功能最完整、流程最严密的授权模式。其特点是通过Client的后台服务器与AS进行互动


 技术分享图片

基本流程:

1、客户端初始化协议的执行流程,通过HTTP 302来重定向用户代理服务器。这里的用户代理基本上就是指浏览器。客户端申请认证的URI包含以下参数:



  • response_type:授权类型,此处的值固定为“code”(必选)


  • client_id:客户端的ID(必选)


  • redirect_uri:重定向URI(可选)


  • scope:申请的权限范围(可选)


  • state:客户端的当前状态,可指定任意值,认证RS会原封不动地返回这个值

2、服务器认证用户身份证,并提供页面供用户决定是否批准或拒绝客户端的此次请求。

3、若请求被批准,服务器使用步骤(1)中客户端提供的redirect_url重定向用户代理到指定页面。redirect_uri必须包含authorization_code,也就是我们前面所说的比较重要的授权证据。以及步骤(1)中Client提供的state。若请求被拒绝,AS将通过redirect_uri返回相应的错误信息。



  • code:授权码(必选)。该码的有效期应该很短,通常设为10分钟,客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID和重定向URI是一一对应的关系。


  • state:如果客户端的请求中包含这个参数,认证服务器的回应也必须一模一样包含这个参数。

4、客户端authorization_code去访问服务器以交换所需的access_token,也就是前面所说的访问令牌客户端请求信息中应包含用于认证客户端身份所需的认证数据,以及上一步请求authorization_code时所用的redirect_uri



  • grant_type:授权模式,此处的值固定位“authorization_code”(必选)


  • code:上一步获取的授权码(必选)


  • redirect_uri:重定向URI,必须与步骤(1)中的该参数值保持一致(必选)


  • client_id:客户端ID(必选)

5、服务器收到authorization_code时需要验证客户端的身份,并验证收到的redirect_uri与步骤(3)请求authorization_code时所用的redirect_uri相匹配。如果验证通过,AS将返回access_token以及refresh_token



  • access_token:访问令牌


  • token_type:令牌类型


  • token_type:表示过期时间


  • refresh_token:更新令牌,用来获取下一次的访问令牌


  • scope:权限范围,如果与客户端申请的范围一致,此项可省略


更新令牌

如果Client的访问令牌过期,则需要使用更新令牌申请一个新的访问令牌。

Client发出更新令牌的HTTP请求,包含以下参数:



  • grant_type:授权模式,此处的值固定为“refreshtoken”


  • refresh_token:之前收到的更新令牌


  • scope:申请的授权范围,不可以超出上一次申请的范围,如果省略该参数,则表示与上一次一致


OAuth2.0协议实例化描述


时序图




 

技术分享图片


 

在上面Client拿到授权码后去申请令牌时将client_secret发送给AS来证明自己的身份,即证明自己是User批注授权的Client。

参考博客:https://www.jianshu.com/p/95ecbbb3a7c7



推荐阅读
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 本文介绍了一种解析GRE报文长度的方法,通过分析GRE报文头中的标志位来计算报文长度。具体实现步骤包括获取GRE报文头指针、提取标志位、计算报文长度等。该方法可以帮助用户准确地获取GRE报文的长度信息。 ... [详细]
  • CentOS 6.5安装VMware Tools及共享文件夹显示问题解决方法
    本文介绍了在CentOS 6.5上安装VMware Tools及解决共享文件夹显示问题的方法。包括清空CD/DVD使用的ISO镜像文件、创建挂载目录、改变光驱设备的读写权限等步骤。最后给出了拷贝解压VMware Tools的操作。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
author-avatar
别被风景迷了眼
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有