文档章节

腾讯微博Android客户端开发 - OAuth1.0认证介绍

jxlgzwh
 jxlgzwh
发布于 2013/07/06 18:46
字数 2354
阅读 256
收藏 0

http://wiki.open.t.qq.com/index.php/OAuth%E6%8E%88%E6%9D%83%E8%AF%B4%E6%98%8E


目录

腾讯微博 API OAuth认证介绍

腾讯微博开放平台,是基于腾讯微博系统,为广大开发者和用户提供的开放数据分享与传播平台。

广大开发者和用户登录平台后,就可以使用平台提供的开放API接口,创建应用从微博系统获取信息,或将新的信息传播到整个微博系统中,丰富多样的API接口和应用,加上您的智慧,将创造出无穷的应用和乐趣。

腾讯微博API采用OAuth协议为第三方提供接入服务,遵循[RFC-5849]规范。有关OAuth认证的详细说明,请阅读官方OAuth规范。各种语言的OAuth 客户端可以在Google-OAuth项目里找到。

腾讯微博API使用OAuth 1.0a版本。

OAuth官网地址:http://www.oauth.net/

OAuth是什么?

OAuth协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAuth认证服务,任何服务提供商都可以实现 自身的OAuth认证服务,因而OAuth是开放的。业界提供了OAuth的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发 包,大大节约了程序员的时间,因而OAuth是简易的。目前互联网很多服务如Open API,很多大头公司如Google,Yahoo,Microsoft等都提供了OAuth认证服务,这些都足以说明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[1]、Yahoo's BBAuth、 Facebook Auth等。

OAuth认证授权具有以下特点:

  1. 简单:不管是OAuth服务提供者还是应用开发者,都很容易于理解与使用;
  2. 安全:没有涉及到用户密钥等信息,更安全更灵活;
  3. 开放:任何服务提供商都可以实现OAuth,任何软件开发商都可以使用OAuth; 

OAuth的原理认证流程及访问资源流程

resource1.png

腾讯微博API通过以下四个步骤来完成认证授权并访问或修改受限资源的流程

  1. 获取未授权的Request Token(temporary credentials)
  2. 请求用户授权Request Token
  3. 使用授权后的Request Token换取Access Token(token credentials)
  4. 使用 Access Token 访问或修改受保护资源

其中1~3步使用httpshttp方式, 第4步使用http方式。

用户修改密码或进行非法行为会导致授权失效,此时需要重新进行授权

请求签名说明

所有TOKEN请求和受保护的资源请求必须被签名,微博开放平台会根据签名来判断请求的合法性。签名算法使用Signature Base String和密钥(Secret)生成签名,参数oauth_signature用于指定签名。

resource2.gif

说明:

Signature Base String由以下三部分组成,各项之间使用&符号分隔。

1、Http Method
请求方法,GET/POST

2、URL Encode之后的请求URL(URL要小写)
例如:
请求URL:

https://open.t.qq.com/cgi-bin/request_token

经URL Encode之后的请求URL为:

https%3A%2F%2Fopen.t.qq.com%2Fcgi-bin%2Frequest_token

3、URL Encode并排序之后的请求参数

例如: URL请求参数为:

oauth_callback=www.qq.com&oauth_consumer_key=49b0bes7352943a1a5609f9e30346201&oauth_nonce=90523669&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1298513816&oauth_version=1.0

经URL Encode并排序之后的请求参数格式如下(参数间使用%26(即&符号)分隔):

oauth_callback%3Dwww.qq.com%26oauth_consumer_key%5D49b0bes7352943a1a5609f9e30346201%26oauth_nonce%3D90523669%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1298513816%26oauth_version%3D1.0

算法伪码:

httpMethod + "&" +
  url_encode(  base_uri ) + "&" +
  sorted_query_params.each  { | k, v |
      url_encode ( k ) + "%3D" +
      url_encode ( v )
  }.join("%26")

密钥由App Secret和Token Secret组成(中间使用&符号分隔)
签名算法目前只支持HMAC-SHA1。

获取未授权的Request Token

通过访问以下 URL 获取未授权的 Request Token

http://open.t.qq.com/cgi-bin/request_token

请求参数

参数 意义
oauth_consumer_key App Key(应用信息中的App Key值)
oauth_signature_method 签名方法,暂只支持HMAC-SHA1
oauth_signature 签名值,密钥为:App Secret。计算说明。
oauth_timestamp 时间戳, 其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数
oauth_nonce 单次值,随机生成的32位字符串,防止重放攻击(每次请求必须不同)
oauth_callback 认证成功后浏览器会被重定向到这个url中
oauth_version 版本号,1.0

返回参数

参数 意义
oauth_token 未授权的Request Token
oauth_token_secret 对应的Request Token Secret
oauth_callback_confirmed 对oauth_callback的确认信号

说明:

  1. 用户授权后web应用将会重定向到oauth_callback。当应用为pc客户端或手机客户端应用时,没有回调url(oauth_callback)的概念,此时设置为字符串null即可。字符串“null”必须是小写
  2. 时间戳与标准时间偏差不得大于8分钟。
示例:

request_token

http://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
参数名 参数值
oauth_consumer_key aca77d2eb96f46e1b3353bc6743e8bfc
oauth_signature_method HMAC-SHA1
oauth_signature exxzU/tTbpdicmYHcyYh5kqgYgo=
oauth_timestamp 1299569145
oauth_nonce yQDMuXvdcEfQs2Mzf3XcT1r36WTULJls
oauth_callback null
oauth_version 1.0

返回结果

oauth_token=hdk48Djdsa&oauth_token_secret=xyz4992k83j47x0b&oauth_callback_confirmed=true
参数名 参数值
oauth_token hdk48Djdsa
oauth_token_secret xyz4992k83j47x0b
oauth_callback_confirmed true

请求用户授权Request Token

此步骤的目的是请求用户授权Request Token,请求URL:

http://open.t.qq.com/cgi-bin/authorize

请求参数:

参数 意义
oauth_token 上一步中获得的未授权的Request Token
wap
(可选参数)
主要用于指定手机授权页的版本
wap=1时,跳转到wap1.0的授权页
wap=2时,跳转到wap2.0的授权页
不带本参数时,手机访问默认跳到wap2.0的授权页

返回参数:

参数 意义
oauth_token 用户授权之后的Token值,与未授权Token值相同。
oauth_verifier 验证码
openid 可以唯一标识一个用户(wap=1或wap=2时不返回该参数)
openkey 与openid对应的用户key,是验证openid身份的验证密钥(wap=1或wap=2时不返回该参数)

说明:

  1. 此页面中会要求用户登陆,然后选择同意或者拒绝对应用授权。
  2. 授权成功后:
# web应用会重定向到oauth_callback所指定的URL(含返回参数)。 
# 客户端应用(oauth_callback=null)会在网页中给出授权码,用户需要手工将验证码输入到应用中才能完成授权流程。

示例:

参数 意义
oauth_token hdk48Djdsa
oauth_verifier 473f82d3
openid 2D4263AB08EE337C3F3F26106BF881DA
openkey 543403C5AA99BDCB6F87DFBB14240E04
oauth_token=hdk48Djdsa&oauth_verifier=473f82d3

使用授权后的Request Token换取Access Token

用户完成授权后,第三方应用可以通过访问如下url,将已授权的Request Token换取Access Token。Access Token将被用于访问或修改受限资源。

http://open.t.qq.com/cgi-bin/access_token

请求参数:

参数 意义
oauth_consumer_key AppKey
oauth_token 第一步中获得的Request Token
oauth_signature_method 签名方法,暂只支持HMAC-SHA1
oauth_signature 签名值,密钥为:App Secret&Request Token Secret。计算说明。
oauth_timestamp 时间戳, 其值是距1970 00:00:00 GMT的秒数,必须是大于0的整数
oauth_nonce 单次值,随机生成的32位字符串,防止重放攻击(每次请求必须不同)
oauth_verifier 上一步请求授权request token时返回的验证码
oauth_version 1.0

返回参数:

参数 意义
oauth_token Access Token
oauth_token_secrete Access Token Secret

说明:

  1. 本步骤用于签名的密钥为App Secret和Request Token Secret(中间使用&分隔)
  2. 获得返回值后就可以使用Access Token来访问资源了。
  3. Access Token和Access Token Secret永远不会过期,直到用户撤销应用授权或腾讯回收您的app访问权限才会失效。

用于签名的Signature Base String格式如下:

示例:access_token:

http://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
参数 意义
oauth_consumer_key aca77d2eb96f46e1b3353bc6743e8bfc
oauth_token 6b99583b7bc8446bb57e86128158994f
oauth_signature_method HMAC-SHA1
oauth_signature 209vcEaHkmb/QwHqsRU3HRPvlqw=
oauth_timestamp 1299569210
oauth_nonce y2FrX7Muouma5vxWTKngEb7uHkRu4P5u
oauth_verifier 877973
oauth_version 1.0

返回结果:

oauth_token=nnch734d00ls2jdk&oauth_token_secreate=pdkkdhi9sl3r4s00
参数 意义
oauth_token nnch734d00ls2jdk
oauth_token_secrete
pdkkdhi9sl3r4s00

至此,您的应用就取得了用户的授权,请妥善保管获得的Access Token和Access Token Secret。

此后,您的应用就可以使用该Access Token访问腾讯微博了。

使用包含Access Token的OAuth标准参数访问腾讯微博

获得Access Token之后,您的应用就可以使用该Access Token访问腾讯微博。

在每次调用接口API时,请求都必须包含如下所示OAuth标准参数:

参数 意义
oauth_consumer_key AppKey
oauth_token Access Token
oauth_signature_method 签名方法,暂只支持HMAC-SHA1
oauth_signature 签名值,密钥为:App Secret&Access Token Secret。
oauth_timestamp 时间戳
oauth_nonce 单次值

示例

调用API:

http://open.t.qq.com/api/t/add  发布一条微博

参数包括:

  1. 接口参数:content和format;
  2. OAuth协议参数
参数 参数值
content helloworld
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

post:

http://open.t.qq.com/api/t/add?content=helloworld&clientip=121.14.96.121&longitude=113.421234&latitude=22.354231&syncflag=0&format=xml&oauth_token=d8b0965f24a14575a84863a5e19a8705&oauth_nonce=709da91378181caec8e709085a757764&oauth_consumer_key=801058005&oauth_signature_method=HMAC-SHA1&oauth_version=1.0&oauth_timestamp=1350653166&oauth_signature=unC%2FaR5N6hoXUsrabBgKHYjKcdg%3D

© 著作权归作者所有

jxlgzwh
粉丝 56
博文 344
码字总数 164232
作品 1
深圳
程序员
私信 提问
开放平台_XAuth

xAuth XAuth也是一种OAuth的认证方法 结构和流程上看XAuth是一种oauth1.0和oauth2.0的集合者 oauth2.0的access_token接口步骤 + oauth1.0的签名方法 为什么出现XAuth? 现在需求是: 1 不希望...

王二狗子11
2018/01/08
0
0
oauth 开放授权

本想前段时间就把自己通过QQ OAuth1.0、OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oauth1.0的认证开发。...

bengozhong
2016/08/15
64
1
开放平台_OAuth2.0

为什么出现oauth2.0 1 oauth1.0对手机客户端,移动设备等非server第三方的支持不好。其实oauth1.0也是可以支持手机客户端,移动设备等,也有相应的流程。但是oauth1.0是将多种流程合并成了一...

王二狗子11
2018/01/08
0
0
OAuth的机制原理讲解及开发流程

本想前段时间就把自己通过QQ OAuth1.0、OAuth2.0协议进行验证而实现QQ登录的心得及Demo实例分享给大家,可一直很忙,今天抽点时间说下OAuth1.0协议原理,及讲解下QQ对于Oauth1.0的认证开发。...

只想一个人静一静
2014/04/26
213
0
OAuth 及 移动端鉴权调研

OAuth OAuth是一个解决用户无需向第三方应用提供用户名密码,让第三方应用访问用户私密资源的授权方案。 举例: 用户a,在网站B存有私密信息(年龄、邮箱、头像),而a在访问第三方网站C时,为...

马肱
2018/05/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

浅谈梯子游戏三门打法技巧走势攻略教程(学会稳稳上岸)

摘要:那么下面我就给大家总结一下技巧和玩法!一、玩梯子的前期准备:1,最重要是zi金准备,提前做好ben金准备能保证自己的zi金链不断,稳中求胜。2,其次是止sun底线,风险控制一定要懂得舍弃,买彩...

V_6696089
39分钟前
8
0
今天发布 需求登记表,不戴眼镜开发的成果

今天是不戴眼镜调理第八天 之前带五百度眼睛0.5 现在是做了三次调理,通常,成人比青少年要慢些 明天正式学习 调理技术 最近不怎么开电脑做开发,发现时间多了许多 虽然想把开发缓一阵子,但...

蒋志祥
47分钟前
4
0
Linux 之docker部署,走过的那些坑

初次使用docker, 多有不足,这里把坑一点点的记下来 概念篇 docker 是什么? 太多文字不同,书读的少, 不懂大大道理; 在我的理解, 它就是个沙箱环境; 在linux中 ,独立进程, 有着自己的小世界 使...

莫库什勒
今天
5
0
vue class绑定 组件

本文转载于:专业的前端网站➬vue class绑定 组件 当在一个自定义组件上使用 class 属性时,这些类将被添加到该组件的根元素上面。这个元素上已经存在的类不会被覆盖。 例如,如果你声明了这个...

前端老手
今天
5
0
exist和in

exist和in select ..from table where exist (子查询) ; select ..from table where 字段 in (子查询) ; 如果主查询的数据集大,则使用In,效率高。 如果子查询的数据集大,则使用exist,效率高...

潦草的犀牛
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部