转:OAUTH协议简介

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401527.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生产库自动派送报表派送失败之重新派送

/*Description: 生产库自动派送报表派送失败之重新派送 */USE [DB] --Replace yourDBGODECLARE ProductDate nvarchar(10) N2014-01-01DECLARE FactoryCode nvarchar(10) NXDECLARE strSQL nvarchar(3000)DECLARE strCRLF nvarchar(…

java集合框架05——ArrayList和LinkedList的区别

前面已经学习完了List部分的源码,主要是ArrayList和LinkedList两部分内容,这一节主要总结下List部分的内容。 List概括 先来回顾一下List在Collection中的的框架图: 从图中我们可以看出: 1. List是一个接口,它继承与Co…

Javascript 函数详解

Javascript 函数详解 1&#xff09;函数声明&#xff1a; 通过关键字function定义&#xff0c;把函数作为变量来声明 函数声明后不会立即执行&#xff0c;会在我们需要的时候调用到。 <script>function myFunction(a, b) {return a * b;}// js对大小写敏感&#xff0c;…

asp.net仿搜索引擎关键字高亮.搜索高亮

以前做关键字高亮都是直接使用replace方法直接替换 如 string input"AAbCC"; string keyword"b"; inputinput.ToUpp(); keywordkeyword.ToUpp(); ss.Replace(keyword,"<font>"keyword"</font>"); 如果这样 输出: "AA…

easyui validatebox 验证类型

required: "必选字段", remote: "请修正该字段", email: "请输入正确格式的电子邮件", url: "请输入合法的网址", date: "请输入合法的日期", dateISO: "请输入合法的日期 (ISO).&…

SSL 1461——最大连续数列的和

Description 求最大连续子序列的和 Input 第一行输入n(n<500),第二行为n个以空格分开的整数(-1000到1000之间)&#xff1b; Output 该序列中最大的连续子序列的和 Sample Input &#xff16;   1 2 -5 6 7 8 Sample Output 21 每次读入一个数判断它是否为负数&#xff0…

ln链接使用

首先说明下Linux下删除、移动、复制的意义。删除:是将inode表放回空闲区由1变为0&#xff0c;还可以找回文件移动:是将inode表不变&#xff0c;将文件转移至对应条目&#xff0c;删除原条录。同分区上操作速度快&#xff0c;不同分区相当于创建、删除原文件复制:是重建inode表&…

poj 2886Who Gets the Most Candies?

题目连接&#xff1a;http://poj.org/problem?id2886 这道题是模拟约瑟夫环&#xff0c;其具体实现和poj2826差不多的。 我的代码如下&#xff1a; #include<cstdio> #include<cstdlib> #include<cmath> #include<memory.h> int seg_tree[500010<&…

Javascript 对象一(对象详解)

JS创建对象的几种方法1. Object 构造函数 创建 2. 对象字面量表示法 创建 3. 使用工厂模式创建对象 在 Car 函数中&#xff0c;返回的是一个对象。那么我们就无法判断返回的对象究竟是一个什么样的类型。于是就出现了第四种创建对象的模式 4. 使用构造函数创建对象 构造函数…

有一个长为n的数组A,求满足0≤a≤bn的A[b]-A[a]的最大值。 给定数组A及它的大小n,请返回最大差值。...

// ConsoleApplication10.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <vector> #include <list> #include <deque> #include <string> #include <algorithm> using namespace st…

【BZOJ】1649: [Usaco2006 Dec]Cow Roller Coaster(dp)

http://www.lydsy.com/JudgeOnline/problem.php?id1649 又是题解。。。 设f[i][j]表示费用i长度j得到的最大乐趣 f[i][end[a]]max{f[i-cost[a][begin[a]]w[a]} 当f[i-cost[a][begin[a]]可行时 初始化f-1 f[0][0]0 #include <cstdio> #include <cstring> #include …

Delphi工具之Image Editor

Delphi Image Editor是一个工具&#xff0c;可用它来创建并编辑位图&#xff08;.bmp&#xff09;、图标&#xff08;.ico&#xff09;和光标&#xff08;.cur&#xff09;&#xff0c;还可以用它创建资源工程&#xff0c;将多个位图、图标和光标包含到单个资源文件&#xff08…

小程序 获取当前用户城市信息(省市区)

步骤使用 wx.getLocation来获取位置授权&#xff1a;获取到设备当前的地理位置信息&#xff0c;这个信息是当前位置的经纬度使用其他第三方地图服务的API&#xff1a;获取当前位置是处于哪个国家&#xff0c;哪个城市等信息&#xff08;eg&#xff1a;腾讯地图、百度地图&#…

PYTHON_正则表达式

字符匹配方法 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。 通配符&#xff1a;* 元字符&#xff1a;\ ^ $ * . | ? {} [] () ^ 表示匹配字符串的开头。在…

delphi中指针的用法

大家都认为&#xff0c;C语言之所以强大&#xff0c;以及其自由性&#xff0c;很大部分体现在其灵活的指针运用上。因此&#xff0c;说指针是C语言的灵魂&#xff0c;一点都不为过。同时&#xff0c;这种说法也让很多人产生误解&#xff0c;似乎只有C语言的指针才能算指针。Bas…

小程序 获取当前用户地址及地图显示

步骤使用 wx.getLocation来获取当前位置&#xff1a; 注意;当用户取消位置获取授权之后,再次点击获取位子按钮小程序不会再提醒用户是否授权,这个时候最好自己弹出提示框让用户去设置页面开启授权设置. wx.getLocation({type: wgs84, //wgs返回 gps坐标&#xff0c; gcj02返回…

任何傅里叶级数展开和卷积可以参考一下页面

Piecewise-defined Functions http://www.sagemath.org/doc/reference/sage/functions/piecewise.html转载于:https://www.cnblogs.com/ustcSL/archive/2012/06/19/2554961.html

CSS3 box-shadow 属性

2019独角兽企业重金招聘Python工程师标准>>> 实例 向 div 元素添加 box-shadow&#xff1a; div { box-shadow: 10px 10px 5px #888888; } 亲自试一试 <!DOCTYPE html> <html> <head> <style> div { width:300px; height:100px; backgroun…

小程序 省市区县三级联动选择器(caseCade)

picker组件 <view class"section"><picker mode"region" bindchange"bindRegionChange" value"{{region}}"><view class"picker">省市区选择: {{region[0]}} {{region[1]}} {{region[2]}}</view>&…

Swagger的坑

swagger.pathPatterns如果是譬如/w/.*&#xff0c;那么如果API中以w开头的描述就会在swagger-ui中显示不出来 转载于:https://www.cnblogs.com/roostinghawk/p/6473864.html