OAUTH协议简介

原文链接

  摘要:OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第 三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。同时,任何 第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如 PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAUTH是简易的。目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服务,这些都足以说明OAUTH标准逐渐成为开放资源授权 的标准。

  一、OAUTH产生的背景

  典型案例:如果一个用户拥有两项服务:一项服务是图片在线存储服务A,另一个是图片在线打印服务B。如下图所示。由于服务A与服务B是由两家不 同的服务提供商提供的,所以用户在这两家服务提供商的网站上各自注册了两个用户,假设这两个用户名各不相同,密码也各不相同。当用户要使用服务B打印存储 在服务A上的图片时,用户该如何处理?法一:用户可能先将待打印的图片从服务A上下载下来并上传到服务B上打印,这种方式安全但处理比较繁琐,效率低下; 法二:用户将在服务A上注册的用户名与密码提供给服务B,服务B使用用户的帐号再去服务A处下载待打印的图片,这种方式效率是提高了,但是安全性大大降低 了,服务B可以使用用户的用户名与密码去服务A上查看甚至篡改用户的资源。

  很多公司和个人都尝试解决这类问题,包括Google、Yahoo、Microsoft,这也促使OAUTH项目组的产生。OAuth是由 Blaine Cook、Chris Messina、Larry Halff 及David Recordon共同发起的,目的在于为API访问授权提供一个开放的标准。OAuth规范的1.0版于2007年12月4日发布。通过官方网址:http://oauth.net 可以的相关信息。

  二、OAUTH简介

  在官方网站的首页,可以看到下面这段简介:

   An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications.

  大概意思是说OAUTH是一种开放的协议,为桌面程序或者基于BS的web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务。 OAUTH类似于Flickr Auth、Google's AuthSub、Yahoo's BBAuth、 Facebook Auth等。OAUTH认证授权具有以下特点:

  1. 简单:不管是OAUTH服务提供者还是应用开发者,都很容易于理解与使用;

  2. 安全:没有涉及到用户密钥等信息,更安全更灵活;

  3. 开放:任何服务提供商都可以实现OAUTH,任何软件开发商都可以使用OAUTH;

  三、OAUTH相关术语

  在弄清楚OAUTH流程之前,我们先了解下OAUTH的一些术语的定义:

  • OAUTH相关的三个URL:

    • Request Token URL: 获取未授权的Request Token服务地址;
    • User Authorization URL: 获取用户授权的Request Token服务地址;
    • Access Token URL: 用授权的Request Token换取Access Token的服务地址;
  • OAUTH相关的参数定义: 

    • oauth_consumer_key: 使用者的ID,OAUTH服务的直接使用者是开发者开发出来的应用。所以该参数值的获取一般是要去OAUTH服务提供商处注册一个应用,再获取该应用的oauth_consumer_key。如Yahoo该值的注册地址为:https://developer.yahoo.com/dashboard/
    • oauth_consumer_secret:oauth_consumer_key对应的密钥。
    • oauth_signature_method: 请求串的签名方法,应用每次向OAUTH三个服务地址发送请求时,必须对请求进行签名。签名的方法有:HMAC-SHA1、RSA-SHA1与PLAINTEXT等三种。
    • oauth_signature: 用上面的签名方法对请求的签名。
    • oauth_timestamp: 发起请求的时间戳,其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数。本次请求的时间戳必须大于或者等于上次的时间戳。
    • oauth_nonce: 随机生成的字符串,用于防止请求的重放,防止外界的非法攻击。
    • oauth_version: OAUTH的版本号,可选,其值必须为1.0。

  OAUTH HTTP响应代码: 

  • HTTP 400 Bad Request 请求错误

    • Unsupported parameter 参数错误
    • Unsupported signature method 签名方法错误
    • Missing required parameter 参数丢失
    • Duplicated OAuth Protocol Parameter 参数重复
  • HTTP 401 Unauthorized 未授权
    • Invalid Consumer Key 非法key
    • Invalid / expired Token 失效或者非法的token
    • Invalid signature 签名非法
    • Invalid / used nonce 非法的nonce

  四、OAUTH认证授权流程

  在弄清楚了OAUTH的术语后,我们可以对OAUTH认证授权的流程进行初步认识。其实,简单的来说,OAUTH认证授权就三个步骤,三句话可以概括:

  1. 获取未授权的Request Token

  2. 获取用户授权的Request Token

  3. 用授权的Request Token换取Access Token

  当应用拿到Access Token后,就可以有权访问用户授权的资源了。大家肯能看出来了,这三个步骤不就是对应OAUTH的三个URL服务地址嘛。一点没错,上面的三个步骤 中,每个步骤分别请求一个URL,并且收到相关信息,并且拿到上步的相关信息去请求接下来的URL直到拿到Access Token。具体的步骤如下图所示:

   

 具体每步执行信息如下:

  A. 使用者(第三方软件)向OAUTH服务提供商请求未授权的Request Token。向Request Token URL发起请求,请求需要带上的参数见上图。

  B. OAUTH服务提供商同意使用者的请求,并向其颁发未经用户授权的oauth_token与对应的oauth_token_secret,并返回给使用者。

  C. 使用者向OAUTH服务提供商请求用户授权的Request Token。向User Authorization URL发起请求,请求带上上步拿到的未授权的token与其密钥。

  D. OAUTH服务提供商将引导用户授权。该过程可能会提示用户,你想将哪些受保护的资源授权给该应用。此步可能会返回授权的Request Token也可能不返回。如Yahoo OAUTH就不会返回任何信息给使用者。

  E. Request Token 授权后,使用者将向Access Token URL发起请求,将上步授权的Request Token换取成Access Token。请求的参数见上图,这个比第一步A多了一个参数就是Request Token。

  F. OAUTH服务提供商同意使用者的请求,并向其颁发Access Token与对应的密钥,并返回给使用者。

  G. 使用者以后就可以使用上步返回的Access Token访问用户授权的资源。

  从上面的步骤可以看出,用户始终没有将其用户名与密码等信息提供给使用者(第三方软件),从而更安全。用OAUTH实现背景一节中的典型案例: 当服务B(打印服务)要访问用户的服务A(图片服务)时,通过OAUTH机制,服务B向服务A请求未经用户授权的Request Token后,服务A将引导用户在服务A的网站上登录,并询问用户是否将图片服务授权给服务B。用户同意后,服务B就可以访问用户在服务A上的图片服务。 整个过程服务B没有触及到用户在服务A的帐号信息。如下图所示,图中的字母对应OAUTH流程中的字母:

  五、OAUTH服务提供商

  OAUTH标准提出到现在不到两年,但取得了很大成功。不仅提供了各种语言的版本库,甚至Google,Yahoo,Microsoft等等互 联网大头都实现了OAUTH协议。由于OAUTH的client包有很多,所以我们就没有必要在去自己写,避免重复造轮子,直接拿过来用就行了。我使用了 这些库去访问Yahoo OAUTH服务,很不错哦!下面就贴出一些图片跟大家一起分享下!

  下图是OAUTH服务提供商引导用户登录(若用户开始没有登录)

  下图是提示用户将要授权给第三方应用,是否同意授权的页面

  下图提示用户已授权成功的信息

  一些服务提供商不仅仅仅实现了OAUTH协议上的功能,还提供了一些更友好的服务,比如管理第三方软件的授权服务。下图就是YAHOO管理软件授权的页面,用户可以取消都某些应用的授权。

转载于:https://www.cnblogs.com/Joans/archive/2012/05/29/2524184.html

转:OAUTH协议简介相关推荐

  1. 什么是oAuth(开放式授权)?OAUTH协议特点和授权流程?

    OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可 ...

  2. Python 14.1 TCP/IP协议简介

    TCP/IP协议简介 虽然大家对现在的互联网很熟悉,但是计算机网络比互联网出现的早得多. 为了把全世界不同的计算机都连起来,就必须规定一套全球通用的协议,为了实现互联网这个目标,互联网协议簇(Inte ...

  3. 【计算机网络】网络层 : BGP 协议 ( BGP 协议简介 | BGP 协议信息交换 | BGP 协议报文格式 | BGP-4 常用报文 | RIP 、OSPF、BGP 协议对比 )

    文章目录 一.路由选择协议分类 二.BGP 协议 简介 三.BGP 协议 信息交换过程 三.BGP 协议 报文格式 四.BGP 协议 特点 五.BGP-4 协议的 四种报文 六.RIP .OSPF.B ...

  4. 【计算机网络】网络层 : OSPF 协议 ( 协议简介 | 链路状态路由算法 | OSPF 区域 | OSPF 特点 )

    文章目录 一.路由选择协议分类 二.OSPF 协议 简介 三.链路状态路由算法 四.OSPF 区域 五.OSPF 特点 一.路由选择协议分类 路由选择协议分类 : ① 内部网管协议 IGP : 在 自 ...

  5. 动态路由选择协议简介

    原文地址:动态路由选择协议简介作者:心不在焉 Exterior Gateway Protocol 路由选择协议基础: 使用协议来查找网络并更新路由表的配置就是动态路由. 名词解释: AS(Autono ...

  6. Tsung MQTT协议简介及MQTT xml文档配置介绍

    MQTT协议简介及MQTT xml文档配置介绍 by:授客 QQ:1033553122 1. MQTT协议介绍 MQTT(Message Queuing Telemetry Transport,消息队 ...

  7. TACACS 协议简介与开发总结

    这个项目来源于国外某运营商客户的需求,整个开发流程除了参考基本的tacacs+协议外,还借鉴了Github上一个类似项目的设计,下面介绍下协议的基本内容和开发注意事项以及对接测试环境的搭建. 目录 0 ...

  8. Dubbo3 Triple 协议简介与选型思考

    Dubbo3 提供了 Triple(Dubbo3).Dubbo2 协议,这是 Dubbo 框架的原生协议.除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubbo 的编程与服务治 ...

  9. python 全栈开发,Day66(web应用,http协议简介,web框架)

    一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...

最新文章

  1. WPF-数据绑定:日期时间格式
  2. Java NIO 系列教程
  3. 入栈和出栈c语言源程序,用c语言可执行文件实现顺序栈的出栈、入栈、判栈空、判栈满!急求啊? 爱问知识人...
  4. masm汇编标号用法总结
  5. JAVA循环结构学校上机经常遇到的几题 笔记
  6. ACM-ICPC 2018 徐州赛区网络预赛 D. EasyMath
  7. 你觉得python很难嘛?那只是你没有理解而已
  8. 【Docker系列教程之三】Docker容器是如何工作的
  9. maven私服nexus-bundle的安装和启动
  10. 主题等.ppt及活动内容.ppt文档规范要求
  11. unity3d开发微信小游戏2
  12. linux 关闭僵尸进程,linux下的僵尸进程处理办法
  13. MySQL 计算年龄
  14. js 内置对象常用方法
  15. bt磁力种子与php文件,视频 | BT 种子和磁力链接是如何工作的?
  16. 小试ESP8266(一) 一只电阻, 几条语句, 摆脱深度睡眠反复重启的困扰
  17. Oracle问题imp-10019:由于ORACLE错误12899而拒绝行
  18. 内存的永久保存区内存溢出解决
  19. Matlab声音处理教程
  20. python表单验证wtf_关于python 3.x:无法验证Flask WTF-Form

热门文章

  1. 字符串倒着输出java_Java 输出反转字符串
  2. NXP UWB NCJ29D5开发(二)BlinkyLed例程
  3. C++并发编程实战(豆瓣评分5.4)
  4. pygame只能编写游戏_游戏框架搭建
  5. 时间模块,带Python示例
  6. css中的node.js_在Node App中使用基本HTML,CSS和JavaScript
  7. Python连接MySQL及一系列相关操作
  8. 面向对象(静态成员内部类的调用)
  9. cobalt strick 4.0系列教程(3)---数据管理
  10. 远控免杀专题8---BackDoor-Facktory免杀