腾讯微博Android客户端开发 - OAuth认证介绍

fmms 13年前
     <h2><strong>腾讯微博 API OAuth认证介绍</strong></h2>    <p>腾讯微博开放平台,是基于腾讯微博系统,为广大开发者和用户提供的开放数据分享与传播平台。</p>    <p>广大开发者和用户登录平台后,就可以使用平台提供的开放API接口,创建应用从微博系统获取信息,或将新的信息传播到整个微博系统中,丰富多样的API接口和应用,加上您的智慧,将创造出无穷的应用和乐趣。</p>    <p>腾讯微博API采用OAuth协议为第三方提供接入服务,遵循[RFC-5849]规范。有关OAuth认证的详细说明,请阅读官方OAuth规范。各种语言的OAuth 客户端可以在Google-OAuth项目里找到。</p>    <p>腾讯微博API使用OAuth 1.0a版本。</p>    <p>OAuth官网地址:<a href="/misc/goto?guid=4959500246916596967" rel="nofollow" target="_blank">http://www.oauth.net/</a></p>    <h2><strong>OAuth是什么?</strong></h2>    <p>OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAuth认证服务,任何服务提供商都可以实现自身的 OAuth认证服务,因而OAuth是开放的。业界提供了OAuth的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间,因而OAuth是简易的。目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAuth认证服务,这些都足以说明OAuth标准逐渐成为开放资源授权的标准。 </p>    <p>在项目主页的首页,可以看到下面这段简介:<br /> <cite>An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications. </cite></p>    <p>大概意思是说<span style="font-size:medium;">OAuth是一种开放的协议,为桌面程序或者基于BS的web应用提供了一种简单的,标准的方式去访问需要用户授权的API服务</span>。OAuth类似于Flickr Auth、Google's AuthSub[1]、Yahoo's BBAuth、 非死book Auth等。 </p>    <p><strong>OAuth认证授权具有以下特点:</strong></p>    <ul>     <li>1. 简单:不管是OAuth服务提供者还是应用开发者,都很容易于理解与使用;</li>     <li>2. 安全:没有涉及到用户密钥等信息,更安全更灵活; </li>     <li>3. 开放:任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth;</li>    </ul>    <h2><strong>OAuth的原理认证流程及访问资源流程</strong></h2>    <p><img alt="腾讯微博Android客户端开发 - OAuth认证介绍" src="https://simg.open-open.com/show/fbffe55b88a62f4dcf446f327b51a2af.png" width="625" height="663" /></p>    <p>腾讯微博API通过以下四个步骤来完成认证授权并访问或修改受限资源的流程</p>    <ol>     <li><em>1.</em><a href="/misc/goto?guid=4959500247001161089" rel="nofollow">获取未授权的Request Token(temporary credentials)</a></li>     <li><em>2.</em><a href="/misc/goto?guid=4959500247084523643" rel="nofollow">请求用户授权Request Token</a></li>     <li><em>3.</em><a href="/misc/goto?guid=4959500247158607530" rel="nofollow">使用授权后的Request Token换取Access Token(token credentials)</a></li>     <li><em>4.</em><a href="/misc/goto?guid=4959500247229567578" rel="nofollow">使用 Access Token 访问或修改受保护资源</a></li>    </ol>    <p>其中1~3步使用<em>https</em>方式, 第4步使用<em>http</em>方式。</p>    <br />    <h3>请求签名说明</h3>    <p>所有TOKEN请求和受保护的资源请求必须被签名,微博开放平台会根据签名来判断请求的合法性。签名算法使用Signature Base String和密钥(Secret)生成签名,参数oauth_signature用于指定签名。</p>    <p><img alt="腾讯微博Android客户端开发 - OAuth认证介绍" src="https://simg.open-open.com/show/c3bc274ac58b2f2e7f2239263963c9ef.gif" width="536" height="272" /></p>    <p><strong>说明:</strong></p>    <p>Signature Base String由以下三部分组成,各项之间使用&符号分隔。</p>    <p><strong>1、Http Method</strong><br /> 请求方法,GET/POST</p>    <p><strong>2、URL Encode之后的请求URL(URL要小写)</strong><br /> 例如:<br /> 请求URL:<cite>https://open.t.qq.com/cgi-bin/request_token</cite><br /> 经URL Encode之后的请求URL为:<br /> <cite>https%3A%2F%2Fopen.t.qq.com%2Fcgi-bin%2Frequest_token</cite></p>    <p><strong>3、URL Encode并排序之后的请求参数</strong><br /> 例如: URL请求参数为:<br /> <cite>oauth_callback=www.qq.com&oauth_consumer_key=49b0bes7352943a1a5609f9e30346201&oauth_nonce=90523669&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1298513816&oauth_version=1.0</cite><br /> 经URL Encode并排序之后的请求参数格式如下(参数间使用%26(即&符号)分隔):<br /> <cite>oauth_callback%3Dwww.qq.com%26oauth_consumer_key%5D49b0bes7352943a1a5609f9e30346201%26oauth_nonce%3D90523669%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1298513816%26oauth_version%3D1.0</cite> </p>    <p><strong>算法伪码:</strong></p>    <pre><cite>httpMethod + "&" +   url_encode(  base_uri ) + "&" +   sorted_query_params.each  { | k, v |       url_encode ( k ) + "%3D" +       url_encode ( v )   }.join("%26")</cite></pre>    <p>密钥由App Secret和Token Secret组成(中间使用&符号分隔)<br /> 签名算法目前只支持HMAC-SHA1。</p>    <h3>获取未授权的Request Token</h3>    <p>通过访问以下 URL 获取未授权的 Request Token</p>    <p><a rel="nofollow">https://open.t.qq.com/cgi-bin/request_token</a></p>    <h3>请求参数</h3>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数 </td>       <td>意义 </td>      </tr>      <tr>       <td>oauth_consumer_key </td>       <td>App Key(应用信息中的App Key值) </td>      </tr>      <tr>       <td>oauth_signature_method </td>       <td>签名方法,暂只支持HMAC-SHA1 </td>      </tr>      <tr>       <td>oauth_signature </td>       <td>签名值,密钥为:App Secret。<a href="/misc/goto?guid=4959500247314393622" rel="nofollow">计算说明。</a> </td>      </tr>      <tr>       <td>oauth_timestamp </td>       <td>时间戳, 其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数 </td>      </tr>      <tr>       <td>oauth_nonce </td>       <td>单次值,随机生成的32位字符串,防止重放攻击(每次请求必须不同) </td>      </tr>      <tr>       <td>oauth_callback </td>       <td>认证成功后浏览器会被重定向到这个url中 </td>      </tr>      <tr>       <td>oauth_version(可选) </td>       <td>版本号,如果有必须为“1.0” </td>      </tr>     </tbody>    </table>    <h3>返回参数</h3>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数 </td>       <td>意义 </td>      </tr>      <tr>       <td>oauth_token </td>       <td>未授权的Request Token </td>      </tr>      <tr>       <td>oauth_token_secret </td>       <td>对应的Request Token Secret </td>      </tr>      <tr>       <td>oauth_callback_confirmed </td>       <td>对oauth_callback的确认信号 </td>      </tr>     </tbody>    </table>    <p>说明:</p>    <p><span>①</span> 用户授权后web应用将会重定向到oauth_callback。当应用为pc客户端或手机客户端应用时,没有回调url(oauth_callback)的概念,此时设置为字符串null即可。<span>字符串“null”必须是小写</span>。</p>    <p><span>②</span> 时间戳与标准时间偏差不得大于<span>8</span>分钟。</p>    <h3>示例:</h3>    <p>request_token</p>    <p><cite>https://open.t.qq.com/cgi-bin/request_token?oauth_callback=null&oauth_consumer_key=aca77d2eb96f46e1b3353bc6743e8bfc&oauth_nonce=yQDMuXvdcEfQs2Mzf3XcT1r36WTULJls&oauth_signature=exxzU/tTbpdicmYHcyYh5kqgYgo=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1299569145&oauth_version=1.0</cite></p>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数名 </td>       <td>参数值 </td>      </tr>      <tr>       <td>oauth_consumer_key </td>       <td>aca77d2eb96f46e1b3353bc6743e8bfc </td>      </tr>      <tr>       <td>oauth_signature_method </td>       <td>HMAC-SHA1 </td>      </tr>      <tr>       <td>oauth_signature </td>       <td>exxzU/tTbpdicmYHcyYh5kqgYgo= </td>      </tr>      <tr>       <td>oauth_timestamp </td>       <td>1299569145 </td>      </tr>      <tr>       <td>oauth_nonce </td>       <td>yQDMuXvdcEfQs2Mzf3XcT1r36WTULJls </td>      </tr>      <tr>       <td>oauth_callback </td>       <td>null </td>      </tr>      <tr>       <td>oauth_version </td>       <td>1.0 </td>      </tr>     </tbody>    </table>    <h3>返回结果:</h3>    <p><cite>oauth_token=hdk48Djdsa&oauth_token_secret=xyz4992k83j47x0b&oauth_callback_confirmed=true</cite></p>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数名 </td>       <td>参数值 </td>      </tr>      <tr>       <td>oauth_token </td>       <td>hdk48Djdsa </td>      </tr>      <tr>       <td>oauth_token_secret </td>       <td>xyz4992k83j47x0b </td>      </tr>      <tr>       <td>oauth_callback_confirmed </td>       <td>true </td>      </tr>     </tbody>    </table>    <h3>请求用户授权Request Token</h3>    <p>此步骤的目的是请求用户授权Request Token,请求URL:</p>    <p><a rel="nofollow">https://open.t.qq.com/cgi-bin/authorize</a></p>    <p>请求参数:</p>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数 </td>       <td>意义 </td>      </tr>      <tr>       <td>oauth_token </td>       <td>上一步中获得的未授权的Request Token </td>      </tr>     </tbody>    </table>    <p>返回参数:</p>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数 </td>       <td>意义 </td>      </tr>      <tr>       <td>oauth_token </td>       <td>用户授权之后的Token值,与未授权Token值相同。 </td>      </tr>      <tr>       <td>oauth_verifier </td>       <td>验证码 </td>      </tr>     </tbody>    </table>    <p>说明:</p>    <p><span>①</span>此页面中会要求用户登陆,然后选择同意或者拒绝对应用授权。</p>    <p><span>②</span>授权成功后:</p>    <ul>     <li><span>A:</span> web应用会重定向到oauth_callback所指定的URL(含返回参数)。</li>     <li><span>B:</span> 客户端应用(oauth_callback=null)会在网页中给出授权码,用户需要手工将验证码输入到应用中才能完成授权流程。</li>    </ul>    <p>示例:</p>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数 </td>       <td>意义 </td>      </tr>      <tr>       <td>oauth_token </td>       <td>hdk48Djdsa </td>      </tr>      <tr>       <td>oauth_verifier </td>       <td>473f82d3 </td>      </tr>     </tbody>    </table>    <p><cite>oauth_token=hdk48Djdsa&oauth_verifier=473f82d3</cite></p>    <h3>使用授权后的Request Token换取Access Token</h3>    <p>用户完成授权后,第三方应用可以通过访问如下url,将已授权的Request Token换取Access Token。Access Token将被用于访问或修改受限资源。</p>    <p><a rel="nofollow">https://open.t.qq.com/cgi-bin/access_token</a></p>    <p>请求参数:</p>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数 </td>       <td>意义 </td>      </tr>      <tr>       <td>oauth_consumer_key </td>       <td>AppKey </td>      </tr>      <tr>       <td>oauth_token </td>       <td>第一步中获得的Request Token </td>      </tr>      <tr>       <td>oauth_signature_method </td>       <td>签名方法,暂只支持HMAC-SHA1 </td>      </tr>      <tr>       <td>oauth_signature </td>       <td>签名值,密钥为:App Secret&Request Token Secret。<a href="/misc/goto?guid=4959500247314393622" rel="nofollow">计算说明。</a> </td>      </tr>      <tr>       <td>oauth_timestamp </td>       <td>时间戳, 其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数 </td>      </tr>      <tr>       <td>oauth_nonce </td>       <td>单次值,随机生成的32位字符串,防止重放攻击(每次请求必须不同) </td>      </tr>      <tr>       <td>oauth_verifier </td>       <td>上一步请求授权request token时返回的验证码 </td>      </tr>      <tr>       <td>oauth_version(可选) </td>       <td>版本号,有的话必须为“1.0” </td>      </tr>     </tbody>    </table>    <p>返回参数:</p>    <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">     <tbody>      <tr>       <td>参数 </td>       <td>意义 </td>      </tr>      <tr>       <td>oauth_token </td>       <td>Access Token </td>      </tr>      <tr>       <td>oauth_token_secreate </td>       <td>Access Token Secret </td>      </tr>     </tbody>    </table>    <p>说明:</p>    <ul>     <li><span>①</span>本步骤用于签名的密钥为App Secret和Request Token Secret(中间使用&分隔)</li>     <li><span>②</span>获得返回值后就可以使用Access Token来访问资源了。</li>     <li><span>③</span>Access Token和Access Token Secret永远不会过期,直到用户撤销应用授权或腾讯回收您的app访问权限才会失效。</li>     <ul>      <p>用于签名的Signature Base String格式如下:</p>      <p>示例:access_token:</p>      <p><cite>https://open.t.qq.com/cgi-bin/access_token?oauth_consumer_key=aca77d2eb96f46e1b3353bc6743e8bfc&oauth_nonce=y2FrX7Muouma5vxWTKngEb7uHkRu4P5u&oauth_signature=209vcEaHkmb/QwHqsRU3HRPvlqw=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1299569210&oauth_token=6b99583b7bc8446bb57e86128158994f&oauth_verifier=877973&oauth_version=1.0</cite></p>      <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">       <tbody>        <tr>         <td>参数 </td>         <td>意义 </td>        </tr>        <tr>         <td>oauth_consumer_key </td>         <td>aca77d2eb96f46e1b3353bc6743e8bfc </td>        </tr>        <tr>         <td>oauth_token </td>         <td>6b99583b7bc8446bb57e86128158994f </td>        </tr>        <tr>         <td>oauth_signature_method </td>         <td>HMAC-SHA1 </td>        </tr>        <tr>         <td>oauth_signature </td>         <td>209vcEaHkmb/QwHqsRU3HRPvlqw= </td>        </tr>        <tr>         <td>oauth_timestamp </td>         <td>1299569210 </td>        </tr>        <tr>         <td>oauth_nonce </td>         <td>y2FrX7Muouma5vxWTKngEb7uHkRu4P5u </td>        </tr>        <tr>         <td>oauth_verifier </td>         <td>877973 </td>        </tr>        <tr>         <td>oauth_version(可选) </td>         <td>1.0 </td>        </tr>       </tbody>      </table>      <p>返回结果:</p>      <p><cite>oauth_token=nnch734d00ls2jdk&oauth_token_secreate=pdkkdhi9sl3r4s00</cite></p>      <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">       <tbody>        <tr>         <td>参数 </td>         <td>意义 </td>        </tr>        <tr>         <td>oauth_token </td>         <td>oauth_token_secreate </td>        </tr>        <tr>         <td>nnch734d00ls2jdk </td>         <td>pdkkdhi9sl3r4s00 </td>        </tr>       </tbody>      </table>      <p>至此,您的应用就取得了用户的授权,请妥善保管获得的Access Token和Access Token Secret。</p>      <p>此后,您的应用就可以使用该Access Token访问腾讯微博了。</p>      <h3>使用Access Token访问腾讯微博</h3>      <p>获得Access Token之后,您的应用就可以使用该Access Token访问腾讯微博。</p>      <p>在每次调用接口API时,请求都必须包含以下参数:</p>      <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">       <tbody>        <tr>         <td>参数 </td>         <td>意义 </td>        </tr>        <tr>         <td>oauth_consumer_key</td>         <td>AppKey</td>        </tr>        <tr>         <td>oauth_token</td>         <td>Access Token</td>        </tr>        <tr>         <td>oauth_signature_method</td>         <td>签名方法,暂只支持HMAC-SHA1</td>        </tr>        <tr>         <td>oauth_signature</td>         <td>签名值,密钥为:App Secret&Access Token Secret。<a href="/misc/goto?guid=4959500247314393622" rel="nofollow">计算说明。</a></td>        </tr>        <tr>         <td>oauth_timestamp</td>         <td>时间戳</td>        </tr>        <tr>         <td>oauth_nonce</td>         <td>单次值</td>        </tr>       </tbody>      </table>      <p>示例:</p>      <p>调用API:<a rel="nofollow">http://open.t.qq.com/api/t/add</a> 发布一条微博:</p>      <p>参数包括:<br /> 1)接口参数:content和format;<br /> 2)OAuth协议参数</p>      <table class="ke-zeroborder" border="0" cellspacing="2" cellpadding="0">       <tbody>        <tr>         <td>参数 </td>         <td>参数值 </td>        </tr>        <tr>         <td>content</td>         <td>%E6%9D%A5%E8%87%AA%23weibo_SDK%23%E7%9A%84%E6%B5%8B%E8%AF%95%E6%B6%88%E6%81%AF%EF%BC%81</td>        </tr>        <tr>         <td>format</td>         <td>json</td>        </tr>        <tr>         <td>oauth_consumer_key</td>         <td>aca77d2eb96f46e1b3353bc6743e8bfc</td>        </tr>        <tr>         <td>oauth_nonce</td>         <td>Tld5QvrtTlRJvaSWPlCC7DIXxnTBeumD</td>        </tr>        <tr>         <td>oauth_signature</td>         <td>JuPSe7ibf0uPECp4HcX4Fu9y3l0=</td>        </tr>        <tr>         <td>oauth_signature_method</td>         <td>HMAC-SHA1</td>        </tr>        <tr>         <td>oauth_timestamp</td>         <td>1299569293</td>        </tr>        <tr>         <td>oauth_token</td>         <td>b8c8f1a888ea4f2887eac88787b6e895</td>        </tr>        <tr>         <td>oauth_version</td>         <td>1.0</td>        </tr>       </tbody>      </table>      <p>post: </p>      <p><cite>http://open.t.qq.com/api/t/add?content=%E6%9D%A5%E8%87%AA%23weibo_SDK%23%E7%9A%84%E6%B5%8B%E8%AF%95%E6%B6%88%E6%81%AF%EF%BC%81&format=json&oauth_consumer_key=aca77d2eb96f46e1b3353bc6743e8bfc&oauth_nonce=Tld5QvrtTlRJvaSWPlCC7DIXxnTBeumD&oauth_signature=JuPSe7ibf0uPECp4HcX4Fu9y3l0=&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1299569293&oauth_token=b8c8f1a888ea4f2887eac88787b6e895&oauth_version=1.0</cite></p>     </ul>    </ul>    <div></div>