twitter 授权过程
转自:http://blog.csdn.net/yangjian8915/article/details/11816669
官方的流程图如下:
下面开始一步步讲解,如何获取最终的access_token与access_token_secret,注:认证的全过程都是通过发送http GET/POST进行的:
1. 首先通过第三方应用,获取其应用的oauth_consumer_key与oauth_consumer_secret,这一对是由第三方应用提供的,当然,自己也可以通过twitter账户申请自己的应用,这样就有了key/secret。
2. 使用http://api.twitter.com/oauth/request_token获取未授权的token:
2.1. 使用GET方法
2.2. 使用的参数是图中A标识的列表:oauth_consumer_key,oauth_signature_method,oauth_signature,oauth_timestamp,oauth_nonce,oauth_version.(由于不是Web应用,故不需要oauth_callback)
2.3. 如何构造每个参数:
2.3.1. oauth_consumer_key,从第三方应用程序获得的
2.3.2. oauth_signature_method,签名方法,有3种:HMAC-SHA1,RSA-SHA1, PLAINTEXT,由于twitter只支持HMAC-SHA1,故此参数值固定,为HMAC-SHA1
2.3.3. oauth_signature,签名(此参数容易错,稍后再谈)
2.3.4. oauth_timestamp,时间戳,根据1970-1-1 0:0:0到现在所经过的秒数,如1280817414
2.3.5. oauth_nonce,随机字符串,注意,每次此参数都必须要不一样的,例如3d1sdf34
2.3.6. oauth_version,可选参数,目前版本是1.0,故值固定为1.0,但为方便扩展,最好加上
2.4. 最终以url?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求
http://api.twitter.com/oauth/request_token?oauth_consumer_key=gReNivhwQsHJ8401DYGtAw&oauth_nonce=1234abcd1234&oauth_signature=TrKrYdCxmpWdLeZBrifNg5HBGFw%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1280818011&oauth_version=1.0
2.5. 如图中B所示,成功发送后会得到返回的值未授权的oauth_token, oauth_token_secret (第三个只要是true就行了),我的返回串如下:
oauth_token=1SXf0MSsj8HcZffAma1pnHhbG1rzbXSmlh4deChw8&oauth_token_secret=CYoxvrSNX5IT1O02QrPydK3peZ0oRRvvvRkyMVBLTU&oauth_callback_confirmed=true
3. 使用http://api.twitter.com/oauth/authorize进行确认
3.1. 使用GET方法
3.2. 使用的参数为:
3.2.1. oauth_consumer_key,从第三方应用程序获得的
3.2.2. oauth_nonce,随机字符串,注意,每次都不一样
3.2.3. oauth_signature_method,签名方法,同上,只能是HMAC-SHA1
3.2.4. oauth_signature,签名,(容易出错,后面说)
3.2.5. oauth_timestamp,时间戳,一定要比上一次的大
3.2.6. oauth_token,未授权的token,即步骤2返回的第一个值
3.2.7. oauth_version,同上,1.0
3.3. 最终以url?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求
http://api.twitter.com/oauth/authorize?oauth_consumer_key=gReNivhwQsHJ8401DYGtAw&oauth_nonce=14234ab12234&oauth_signature=1zR5E6gH7RSlmjT3uUL2EeMBzuE%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1280819022&oauth_token=1SXf0MSsj8HcZffAma1pnHhbG1rzbXSmlh4deChw8&oauth_version=1.0
3.4. 成功返回后,是HTML代码(由于较多,我只展示显示的结果),将它显示出来即:
此截图对应流程图所示C到D的过程中,需要真正的twitter用户(应用程序拥有者用户也可以)进行确认,是否允许自己的账户被名为XXX的应用访问(其标识即是oauth_consumer_key与oauth_consumer_secret),并且输入twitter账号与密码,进行allow或者deny。
而我们要做的就是解析HTML代码(其实只需要解析出其中的一个字串即可),然后通过POST来模拟Allow的按钮提交,这样就不需要浏览这个页面了。先解析出来,HTML中必包含一行:
<input name="authenticity_token"type="hidden" value="98d562c5c67cd90a56e7da4c6bdef28b4c8fe6b2"/>
4. 仍然使用http://api.twitter.com/oauth/authorize获取确认码(PIN)。
4.1. 使用POST方法
4.2. 使用的参数为:
4.2.1. authenticity_token,值为解析出来的98d562c5c67cd90a56e7da4c6bdef28b4c8fe6b2
4.2.2. oauth_token,未授权token,即步骤2返回的第一个值
4.2.3. session[username_or_email],用户名,如myusername
4.2.4. session[password],密码,如 mypassword
4.3. 最终POST http://api.twitter.com/oauth/authorize,POST的数据为
authenticity_token=98d562c5c67cd90a56e7da4c6bdef28b4c8fe6b2&oauth_token=1SXf0MSsj8HcZffAma1pnHhbG1rzbXSmlh4deChw8&session[username_or_email]= myusername&session[password]= mypassword
4.4. 返回成功结果仍然是HTML代码(由于较多,我只展示显示的结果),将它显示出来即:
此截图对应的是流程图中的标识D,上面的确认码(PIN),即为oauth_verifier
而我们要做的就是,解析HTML(也就是获取上面的数字字符串),HTML中仅有这么一个字段:
<divid="oauth_pin">
3638897
</div>
其中oauth_pin是唯一的,所以可以通过它来提取确认码。
5. 使用http://api.twitter.com/oauth/access_token用已授权的token与PIN码换取我们开头的最终目标:access_token与access_token_secret
5.1. 使用GET方法
5.2. 使用的参数是图中E标识的列表:oauth_consumer_key,request_token,oauth_signature_method,oauth_signature,oauth_timestamp,oauth_nonce,oauth_version,oauth_verifier
5.3. 如何构造每个参数:
5.3.1. oauth_consumer_key,从第三方应用程序获得的
5.3.2. request_token,步骤2得到的
5.3.3. oauth_signature_method,仍然是HMAC-SHA1
5.3.4. oauth_signature,签名,(容易出错,后面说)
5.3.5. oauth_timestamp,时间戳,一定要比上次大
5.3.6. oauth_nonce,随机串,每次要不一样
5.3.7. oauth_version,版本号,固定为1.0
5.3.8. oauth_verifier,步骤4得到的PIN码,即3638897
5.4. 最终以url?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求
http://api.twitter.com/oauth/access_token?oauth_consumer_key=gReNivhwQsHJ8401DYGtAw&oauth_nonce=3654cf32ds2f&oauth_signature=aHEXqn2nu%2BRCszMp9P5BqJTpu4o%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1280821505&oauth_token=1SXf0MSsj8HcZffAma1pnHhbG1rzbXSmlh4deChw8&oauth_verifier=3638897&oauth_version=1.0
5.5. 成功返回,获得
oauth_token=169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2&oauth_token_secret=0BQFkAcOqYGNgbt0NwoF7w3G9MUlt9AkSJBIwkxoFA&user_id=15834158&screen_name=mytesttwitter
此结果对应流程图中的标识F,其中oauth_token与oauth_token_secret即我们最终需要的access_token与access_token_secret。user_id是用户的ID号,很有用,很多API都需要用自己的ID号作为参数;screen_name是屏显名字,有些API也需要它作为参数
至此,我们的OAuth认证过程完全结束。
6. 使用access_token与access_token_secret进行调用API,而不需要用户名与密码,我们此处试着调用http://api.twitter.com/1/statuses/home_timeline.xml来获取用户的timeline。
6.1. 使用GET方法
6.2. 使用的参数是图中G标识的列表:oauth_consumer_key,oauth_token,oauth_signature_method,oauth_signature,oauth_timestamp,oauth_nonce,oauth_version
6.2.1. oauth_consumer_key,从第三方应用程序获得的
6.2.2. oauth_token,即access_token,步骤5得到的
6.2.3. oauth_signature_method,HMAC-SHA1
6.2.4. oauth_signature,签名,(容易出错,后面说)
6.2.5. oauth_timestamp,时间戳,每次要比上一次的大
6.2.6. oauth_nonce,随机串,每次要不一样
6.2.7. oauth_version,版本号,1.0
6.3. 最终以url?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求
http://api.twitter.com/1/statuses/home_timeline.xml?oauth_consumer_key=gReNivhwQsHJ8401DYGtAw&oauth_nonce=365fd4ff32ffddffs2f&oauth_signature=MxEA2lODZ5QQh8icOL8z8f1PNOQ%3D&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1280822863&oauth_token=169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2&oauth_version=1.0
6.4. 成功返回后即可得到相应xml格式的timeline
7. 签名方法
7.1. 背景:Twitter使用的是HMAC-SHA1方法进行签名,在以上1-5认证的步骤中,有2,3,5需要签名。而在使用API时,只要需要认证的API,都需要进行签名,方可成功调用。
7.2. 原理:OAuth认证通过用户在调用API时自行签名的结果,与API一起发送到服务器,服务器再用相同的方法进行签名,将结果与我们传过去的结果相比较,如果相同,那么签名通过,我们每次的随机串与时间戳都不一样,所以防止了重放攻击,同时这个过程中没有透露用户的账号与密码,增强了账号安全性。
7.3. 方法:签名需要签名串(text)与密钥(key)
7.3.1. 签名串(text)的构成:HttpMethod&url&参数。三个红色串必须用urlencode进行编码编码中的%xx符号,xx中的字母必须为大写
其中HttpMethod为GET/POST/PUT/DELETE等http方法之一,必须全为大写,编码后仍为本身
url为不带参数的url,如http://api.twitter.com/1/statuses/home_timeline.xml,必须全为小写,编码后的结果为http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml
参数即此次请求中的除了oauth_signature以外的所有参数,包括一些API所要求的参数,比如在更新自己状态时,需要status参数。格式为按照[参数名=参数值]的格式中间用&隔开,并且要按照字母顺序升序排列,如果参数名相同,那么按照参数值的字母顺序升序排列。如
oauth_consumer_key=gReNivhwQsHJ8401DYGtAw&oauth_nonce=df563232s&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1280824014&oauth_token=169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2a4sZZX2&oauth_version=1.0
编码后为
oauth_consumer_key%3DgReNivhwQsHJ8401DYGtAw%26oauth_nonce%3Ddf563232s%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1280824014%26oauth_token%3D169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2%26oauth_version%3D1.0
那么将三者再用&组合起来后,即为
GET&http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml&
oauth_consumer_key%3DgReNivhwQsHJ8401DYGtAw%26oauth_nonce%3Ddf563232s%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1280824014%26oauth_token%3D169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2%26oauth_version%3D1.0
注意,这个是1个字符串,上面由于缩进不够,所以换了行。这样,签名串(text)就构造好了。
7.3.2.密钥(key)的构成:oauth_consumer_secret&oauth_token_secret
其中
oauth_consumer_secret即从第三方应用程序获得的。
oauth_token_secret在步骤2时还没获得,那么即为空,但&得保留;在步骤3、5时,由于在步骤2获得了未授权的token与token_secret,此时就用未授权的token_secret;步骤6以及后续所有的API调用时,就用获得的最终的access_token_secret,以后也永远用这个,除非重新认证。
例如:
在步骤2中,key就是:
gReNivhwQsHJ8401DYGtAw&
在步骤3、5中,key就是:
gReNivhwQsHJ8401DYGtAw&CYoxvrSNX5IT1O02QrPydK3peZ0oRRvvvRkyMVBLTU
在步骤6及以后的调用中,key就是:
gReNivhwQsHJ8401DYGtAw&0BQFkAcOqYGNgbt0NwoF7w3G9MUlt9AkSJBIwkxoFA
这样,密钥(key)就构造好了。
7.4. 生成signature – signature也要用url encode进行编码
自己用程序实现HMAC-SHA1的加密签名算法。下面给个利用上面的text/key结果,用HMAC-SHA1算法生成的signature,你也可以通过这个来判断自己的算法正不正确。
Text:
GET&http%3A%2F%2Fapi.twitter.com%2F1%2Fstatuses%2Fhome_timeline.xml&
oauth_consumer_key%3DgReNivhwQsHJ8401DYGtAw%26oauth_nonce%3Ddf563232s%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1280824014%26oauth_token%3D169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2dg4ZZX2%26oauth_version%3D1.0
Key:
gReNivhwQsHJ8401DYGtAw&0BQFkAcOqYGNgbt0NwoF7w3G9MUlt9AkSJBIwkxoFA
生成的signature:
ITtbuTI901ie4bCFg5vGfb1mCxM=
最后,生成的signature也要用url encode进行编码,编码后的结果为
ITtbuTI901ie4bCFg5vGfb1mCxM%3D
此时再将此字串填充到要发送的http请求中即可。
后记:
1.在认证过程中未获得最终的access_token/key之前的那个未授权的oauth_token在使用时是有有效期的,应该是几分钟之内,因为在编写此文档时,每次回头继续时都超时了,所以后面的几个步骤我都是重新申请的,而且每次生成的都不一样,但为了统一,我就将后面的几次oauth_token又换回到第一次申请到的,仅为方便理解。
2.认证的过程全貌在此,主要容易错的地方就是签名,最好反复对照签名方法,及上面的认证步骤,加深理解。
3.最后,介绍一个工具,http://developer.netflix.com/resources/OAuthTest
可以直接生成已签名的http请求,可以拿它来验证自己的每次请求。
转载于:https://www.cnblogs.com/JohnnyYin/p/3426045.html
twitter 授权过程相关推荐
- Spring Security 源码分析:Spring Security 授权过程
Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring I ...
- ASP.NET Core Identity 实战(4)授权过程
这篇文章我们将一起来学习 Asp.Net Core 中的(注:这样描述不准确,稍后你会明白)授权过程 前情提要 在之前的文章里,我们有提到认证和授权是两个分开的过程,而且认证过程不属于Identity ...
- 【49.Auth2.0认证与授权过程-微博开放平台认证授权过程-百度开放平台认证授权过程-社交登录实现(微博授权)-分布式Session问题与解决方案-SpringSession整合-Redis】
一.知识回顾 [0.三高商城系统的专题专栏都帮你整理好了,请点击这里!] [1-系统架构演进过程] [2-微服务系统架构需求] [3-高性能.高并发.高可用的三高商城系统项目介绍] [4-Linux云 ...
- shiro认证授权过程
οnclick="formSubmit('${ctx}/login.action','_self');"---> public String login() throws E ...
- twitter授权登录 php,PHP版实现Twitter第三方登录的成功案例
QQ.微信.Fackbook等第三方登录使用OAuth2.0,随便找一些文档跟着做很快实现,没什么难度.等轮到Twitter时候,如果你也这样想,后面它就会证明你是错的! Twitter在当前时间(2 ...
- Python分享消息到Twitter、Youtube、Facebook平台
Python分享消息到Twitter.Youtube.Facebook平台 浏览器 概述 第三方登录平台免不了需要登录验证,比起命令行输入账号密码再填充表单,不如直接用浏览器实在 环境配置 运行库 p ...
- 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程
授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...
- OAuth2.0认证和授权原理
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和 ...
- OAuth认证与授权
什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准. 允许第三方网站在用户授权的前提下访问在用户在服务商那里存储的各种信息. 而这种授权无需将用户提供用户名和密码提 ...
- Spring security 集成 JustAuth 实现第三方授权登录
Spring security 集成 JustAuth 实现第三方授权登录脚手架: 一.特性 spring security 集成 JustAuth 实现第三方授权登录 : 此项目从 用户管理脚手架( ...
最新文章
- IOS7为什么遭吐槽?
- OPenGL中的缓冲区对象
- Python浅谈gevent实现协程
- qml入门学习(七):单独文件自定义组件
- deepin系统15.6版本安装执行那个exe文件_深度操作系统 deepin 20(1003)正式版发布:计算器支持科学计算,新增邮件、相机等应用...
- 如何判定选择的日期与当前日期的前后关系
- 30个值得关注的Vue开源项目
- python字符串常用函数-Python字符串常用函数详解
- 防火墙、WAF、IPS、IDS都是什么
- 如何下载vue.js
- 电机专题2:直流有刷电机工作原理
- 解决:删除文件时“文件正在使用”不能完成
- R语言使用grid包的unit函数将数据对象转化为有计量单位的数据(例如转化为毫米单位、长度单位mm)
- 【Java】多人协同在线编辑Excel源代码及部署包
- Dubbo+zookeeper
- 罗晨:梦想照进现实,一个独立开发者的田园诗
- vb透明控件窗体不透明函数
- 如何成为一名项目经理
- 1032 挖掘机技术哪家强 (20分) 测试点4
- 使用Logstash接收Netflow日志并发送到syslog服务器
热门文章
- KinectV2 qt opencv 实现平面测量
- 树莓派硬件编程——(零)先导篇
- 2019腾讯广告算法大赛
- java 间接引用_Java中的四种引用方式的区别
- org.apache.hadoop.security.JniBasedUnixGroupsMappingWithFallback not org.apache.hadoop.security.Grou
- Maven私服nexus磁盘空间清理
- 几句代码让Ios系统内核崩溃
- word文字上下间距怎么调_word表格中怎么调整文字行间距以及字符间距
- 【优化求解】基于粒子群算法求解仓库成本控制优化问题含Matlab源码
- 基于 YOLOV5 的 SAR 图像舰船检测