Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

OAuth1.0协议

9,798 views

Published on

OAuth1.0协议

Published in: Technology
  • Be the first to comment

OAuth1.0协议

  1. 1. OAuth1.0协议<br />董立强<br />2010年9月6日<br />
  2. 2. 串讲内容<br />1.OAuth背景<br />2.OAuth协议详解<br />
  3. 3. 1.1 OAuth为何产生?<br />有关部门实施的人力不可抗拒的原因<br />用户<br />我今天在食堂吃的是麻辣肥牛<br />用账号密码<br />修改用户信<br />将你的名字改成:猪头<br />我爱XXX + 账号密码<br />我爱XXX + 账号密码<br />第三方应用<br />
  4. 4. 1.1 OAuth为何产生?<br />对外严重声明:<br />我们绝对不记录用户账号密码。<br />心里潜台词:<br />哥,你们懂得。<br />一部分邪恶的第三方<br />
  5. 5. 1.1 OAuth为何产生?<br />既然这样,我们能不能创造一种方法在信息传输过程中让第三方不接触到用户的密码?<br />
  6. 6. 1.1 OAuth为何产生?<br />
  7. 7. 1.1 OAuth为何产生?<br />伟大的OAuth诞生了<br />
  8. 8. 1.2 OAuth现状<br />1. 国外几大网站凡是搞开放平台的都提供了OAuth授权认证。<br />比如:twitter、google、facebook等,到最新的foursquare等。<br />2. Twitter在9月1日取消了basic认证,只提供OAuth授权认证。<br />3. OAuth1.0已经成为RFC5849标准 http://tools.ietf.org/html/rfc5849<br />4. 目前已有多种语言的认证库,比如Java、PHP、.NET、JavaScript等,这样就可以让第三方开发者很快的进入到核心的API开发中,而不必为认证复杂而苦恼。<br />5.OAuth前途光明,2.0已经在制定当中。<br />6.比较杯具的是OAuth在国内很不流行,因为开放平台在国内就很不流行。<br />
  9. 9. 2 OAuth协议详解<br />用户<br />服务提供方<br />第三方<br />
  10. 10. 2.1 OAuth参数介绍<br />oauth_consumer_key:服务方提供给第三方应用的令牌,是授权过程中的必要参数。在授权过程中,此项为明文传输,服务提供方用此来区分不同的第三方应用。<br />oauth_consumer_secret:服务提供方提供给第三方应用的密钥,是授权过程中进行签名的重要参数。不在授权过程中传输。<br />oauth_timestamp:发起请求时的时间戳,请求时间戳用格林威治时间1970年1月1日0时0分0秒起的秒数表示,请求时间戳必须是个正整数,并必须不小于上一个请求中的时间戳。<br />oauth_nonce:发次请求时的随机字符串,用以区别不同的请求。第三方应用要保证每次发起请求生成唯一的值。服务提供方用此值验证一个请求之前从未被发起过,有助于防止非安全通道(例如HTTP)上的重放攻击。<br />
  11. 11. 2.1 OAuth参数介绍<br />oauth_signature_method:认证方法,协议中规定的方法有:HMAC-SHA1、 RSA-SHA1、PLAINTEXT。PLAINTEXT在协议中建议使用https来传递。<br />oauth_signature:签名字符串。如果第三方应用签名提供的与服务提供方生成签名的不匹配,则验证失败。此项为验证过程中的关键参数。<br />oauth_version:OAuth版本。可选,如果存在,目前必须为1.0。<br />oauth_token:授权与非授权令牌。<br />oauth_token_secret:授权与非授权密钥。<br />oauth_callback:第三方提供给服务方授权后的跳转页面,如果第三方没有一个可以回调的地址,则此值为:“oob”(区分大小写)<br />
  12. 12. 2.2 签名方法<br />Base String:签署基字符串(Signature Base String)就是将请求参数排序后串接为单个字符串。<br />Base String的生成规则:<br />Urlencode(HTTP Method & 请求URL & 请求参数)<br />其中请求参数为urlencode(参数名)=urlencode(参数值),并用&分割<br />拿到Base String后就可以进行签名,不同的签名方法分别不同。<br />比如HMAC-SHA1的方法为:<br />将Base String作为text,key为oauth_consumer_key和oauth_token_secret(无论是否存在)以&作为间隔的字符串。然后经过base64编码,最后根据RFC3986标准进行urlencode。<br />
  13. 13. 2.3 服务方返回值说明<br />• HTTP 400 Bad Request <br /> ◦Unsupported parameter <br /> ◦Unsupported signature method <br /> ◦Missing required parameter <br /> ◦Duplicated OAuth Protocol Parameter<br />• HTTP 401 Unauthorized <br /> ◦Invalid Consumer Key <br /> ◦Invalid / expired Token <br /> ◦Invalid signature <br /> ◦Invalid / used nonce<br />
  14. 14. 2.4 申请Consumer Key<br />Consumer Key & Secret<br />给我一个key吧<br />
  15. 15. 2.5 请求Request Token<br />请注意,此处的Request Token是未授权的<br />签名通过,派发Request Token<br />Consumer Key 等参数<br />
  16. 16. 2.5 请求Request Token<br />oauth_consumer_key<br />oauth_signature_method<br />oauth_signature<br />oauth_timestamp<br />oauth_nonce<br />oauth_callback<br />oauth_version(可选)<br />需要提供的参数<br />
  17. 17. 2.5 请求Request Token<br />返回的参数<br />oauth_token<br />oauth_token_secret<br />oauth_callback_confirmed<br />此值一定为 true<br />比如:oauth_token=xxxxxxxxxx&oauth_token_secret=xxxxxxxxxx&oauth_callback_confirmed=true<br />
  18. 18. 2.6 用户授权Request Token<br />服务方平台<br />授权成功,跳入第三方callback<br />授权页面<br />引导<br />进入服务方提供的授权页面<br />未登录<br />登录页面<br />
  19. 19. 2.6 用户授权Request Token<br />需要提供的参数<br />oauth_token<br />上一步中拿到的Request Token<br />
  20. 20. 2.6 用户授权Request Token<br />返回的参数<br />oauth_token<br />已授权的Request Token<br />oauth_verifier<br />如果第三方没有一个有效的回调地址,则服务方应当将此参数给用户显示出来,让用户自主到第三方网站上进行验证。<br />比如:http://www.skiyo.cn/callback.php?oauth_token=xxxxxx&oauth_verifier=1234<br />
  21. 21. 2.7 换取Access Token<br />签名通过,派发Access Token<br />Request Token等参数<br />这里的是Request Token是用户授权过的噢<br />
  22. 22. 2.7 换取Access Token<br />oauth_consumer_key<br />oauth_signature_method<br />oauth_signature<br />oauth_timestamp<br />oauth_nonce<br />oauth_version(可选)<br />oauth_token授权了的Request Token<br />oauth_verifier上步提供的验证码<br />需要提供的参数<br />
  23. 23. 2.7 换取Access Token<br />返回的参数<br />oauth_token<br />已授权的Request Token<br />oauth_token_secret<br />已授权的Request Token密钥<br />另外,服务方还可以带有其他的参数,比如:<br />oauth_token=xxxxxx&oauth_token_secret=xxxxxxxxxxx&uid=100000<br />
  24. 24. 2.8 请求API<br />oauth_consumer_key<br />oauth_signature_method<br />oauth_signature<br />oauth_timestamp<br />oauth_nonce<br />oauth_version(可选)<br />oauth_token授权了的Request Token<br />需要提供的参数<br />第三方每次请求API时都需要带有这些参数,这些参数可以存放在POST、GET和head中。下面是存放在head中的一个例子:<br />
  25. 25. 2.8 请求API<br />Authorization: OAuth realm="http://sp.example.com/",<br />oauth_consumer_key="0685bd9184jfhq22",<br />oauth_token="ad180jjd733klru7",<br />oauth_signature_method="HMAC-SHA1",<br />oauth_signature="wOJIO9A2W5mFwDgiDvZbTSMK",<br />oauth_timestamp="137131200",<br />oauth_nonce="4572616e48616d6d65724c61686176",<br />oauth_version="1.0"<br />
  26. 26. 谢谢大家<br />By dongliqiang<br />2010-09-06<br />

×