腾讯微博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>