理解OAuth 2.0及应用场景 - TOMMYHU - 专注互联网开发及运营技术,提供相关资料及软件下载,奇趣网络时事评论!
Nov 26

理解OAuth 2.0及应用场景 不指定

tommyhu , 21:23 , ASP.NET , Comments(1) , Trackbacks(0) , Reads(4223) , Via Original Large | Medium | Small
Highslide JS
OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAUTH是安全的。oAuth是Open Authorization的简写。
阮一峰 在他的博文中对OAuth有很好的描述,下面的附件是他博文的网页存档,也可以直接访问他的页面查看http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html
百度百科:http://baike.baidu.com/view/3948029.htm?fr=aladdin
Download ( 247 downloads)

先名词解释一下:

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

    REST,即REST(Representational State Transfer表述性状态转移)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。


    OAUTH 场景说明:
Quotation
    M是一个电子商务网站,类型于京东,提供商品在线购物服务。

    W是一个SNS网站,也类型于Weibo。

    U是一个普通的购物者,C有在W网注册用户。
    U想去M网站看上了几样东西,打算购买,发现只能注册用户才能购买,但是U不想注册太多帐号;但是U发现M网站上面支持W的帐号直接登录。点击了带有W网站标示的链接,跳到了W网站,输入了帐号信息,返回到M网站上面,然后M网站自动给U登录(注册)了。在此过程中M一直不知道U的帐号信息,除M网站认为可以公开的信息,然后U完成了余下的购物流程。



    REST场景说明:
Quotation

    M是一个电子商务网站,类型于京东,提供商品在线购物服务。

    B是一个移动设备或者其他的电子商务网站(渠道)。

    B想为M拓展市场,M也同意,于是M为B向其开放数据API,有些是公开API,有些则需要安全登录信息。最终合作成功,B开发了各种移动APP,网站及其他应用。



   OAUTH和REST的区别:

   OAUTH过程中需要U同意后才能M获得W提示信息。REST场景过程中的角色没有U,只需要M同意开放权限即可。



    附上两个php的开源项目

     OAUTH : http://code.google.com/p/oauth-php/

     REST:https://github.com/philsturgeon/codeigniter-restserver



oauth场景和原理
转自http://daimajishu.iteye.com/blog/1081267

twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,比如像 feedtwitterrss2twitter推特中文圈(这个目前好像有点问题转回来的时候是个错误地址)这种网站就是这个效果。其实这都是拜 OAuth所赐。

OAuth是什么?
OAuth是一个开放的认证协议,让你可以在Web或桌面程序中使用简单而标准的,安全的API认证。

OAuth有什么用?为什么要使用OAuth?
网络开放是一个不变的趋势,那么不可避免的会有各种网络服务间分享内容的需要。

举个我们身边国内的例子吧:比如人人网想要调用QQ邮箱的联系人列表,现在的方法是你需要在人人网输入你的QQ号,QQ密码才能调用,虽然网站上可能都自谓“不保留QQ用户名密码”,但是大家信吗?

OAuth就是为了解决这个问题而诞生的,用户访问第三方资源,不再需要网站提交你的用户名,密码。这样好处自己是安全,而且不会泄露你的隐私给不信任的一方。

OAuth原理
OAuth中有三方:一,用户;二,Consumer(不知杂翻译,类似上面的 twitterfeed 角色);三,服务提供商(如上例的twitter角色)。

一,Consumer 向 服务提供商 申请接入权限

可得到:Consumer Key,Consumer Secret。twitter申请oauth的话,在 setting - connection - developer 里面申请。 同时给出三个访问网址:

request_token_url = 'http://twitter.com/oauth/request_token'
access_token_url = 'http://twitter.com/oauth/access_token'
authorize_url = 'http://twitter.com/oauth/authorize'
二,当Consumer接到用户请求想要访问第三方资源(如twitter)的时候

Consumer需要先取得 请求另牌(Request Token)。网址为上面的 request_token_url,参数为:

oauth_consumer_key:Consumer Key
oauth_signature_method:签名加密方法
oauth_signature:加密的签名 (这个下面细说)
oauth_timestamp:UNIX时间戳
oauth_nonce:一个随机的混淆字符串,随机生成一个。
oauth_version:OAuth版本,可选,如果设置的话,一定设置为 1.0
oauth_callback:返回网址链接。
及其它服务提供商定义的参数
这样 Consumer就取得了 请求另牌(包括另牌名 oauth_token,另牌密钥 oauth_token_secret。

三,浏览器自动转向服务提供商的网站:

网址为authorize_url?oauth_token=请求另牌名

四,用户同意 Consumer访问 服务提供商资源

那么会自动转回上面的 oauth_callback 里定义的网址。同时加上 oauth_token (就是请求另牌),及oauth_verifier(验证码)。

五,现在总可以开始请求资源了吧?

NO。现在还需要再向 服务提供商 请求 访问另牌(Access Token)。网址为上面的access_token_url,参数为:

oauth_consumer_key:Consumer Key
oauth_token:上面取得的 请求另牌的名
oauth_signature_method:签名加密方法
oauth_signature:加密的签名 (这个下面细说)
oauth_timestamp:UNIX时间戳
oauth_nonce:一个随机的混淆字符串,随机生成一个。
oauth_version:OAuth版本,可选,如果设置的话,一定设置为 1.0
oauth_verifier:上面返回的验证码。
请求 访问另牌的时候,不能加其它参数。
这样就可以取得 访问另牌(包括Access Token 及 Access Token Secret)。这个就是需要保存在 Consumer上面的信息(没有你的真实用户名,密码,安全吧!)

六,取得 访问另牌 后,

Consumer就可以作为用户的身份访问 服务提供商上被保护的资源了。提交的参数如下:

oauth_consumer_key:Consumer Key
oauth_token:访问另牌
oauth_signature_method:签名加密方法
oauth_signature:加密的签名 (这个下面细说)
oauth_timestamp:UNIX时间戳
oauth_nonce:一个随机的混淆字符串,随机生成一个。
oauth_version:OAuth版本,可选,如果设置的话,一定设置为 1.0
及其它服务提供商定义的参数
OAuth安全机制是如何实现的?
OAuth 使用的签名加密方法有 HMAC-SHA1,RSA-SHA1 (可以自定义)。拿 HMAC-SHA1 来说吧,HMAC-SHA1这种加密码方法,可以使用 私钥 来加密 要在网络上传输的数据,而这个私钥只有 Consumer及服务提供商知道,试图攻击的人即使得到传输在网络上的字符串,没有 私钥 也是白搭。

私钥是:consumer secret&token secret (哈两个密码加一起)

要加密的字符串是:除oauth_signature 外的其它要传输的数据。按参数名字符排列,如果一样,则按 内容排。如:domain=kejibo.com&oauth_consumer_key=XYZ& word=welcome......................

前面提的加密里面都是固定的字符串,那么攻击者岂不是直接可以偷取使用吗?

不,oauth_timestamp,oauth_nonce。这两个是变化的。而且服务器会验证一个 nonce(混淆码)是否已经被使用。

那么这样攻击者就无法自已生成 签名,或者偷你的签名来使用了。
▲返回顶部
Last modified by tommyhu on2014/11/26 21:29

互联网开发网友
2017/03/29 19:59
您好,请问我自己的应用和自己的服务器之间是否也适合使用oauth2.0协议呢?
Pages: 1/1 First page 1 Final page
Add a comment

Nickname

emotemotemotemotemotemotemotemotemotemotemotemotemotemotemotemot