转自:http://blog.csdn.net/yangjian8915/article/details/11816669

官方的流程图如下:

下面开始一步步讲解,如何获取最终的access_tokenaccess_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.

2.3.5.  oauth_nonce,随机字符串,注意,每次此参数都必须要不一样的,例如3d1sdf34

2.3.6.  oauth_version,可选参数,目前版本是1.0,故值固定为1.0,但为方便扩展,最好加上

2.4.       最终以url?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求

&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?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求

&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_tokenaccess_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.

5.4.       最终以url?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求

&&oauth_version=1.0

5.5.       成功返回,获得

&screen_name=mytesttwitter

此结果对应流程图中的标识F,其中oauth_token与oauth_token_secret即我们最终需要的access_tokenaccess_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?{参数名=参数值,&}格式发送出去,此处我给出我的发送串,参数顺序随便,但签名时有要求

&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_token=169731880-OzvV2F9vWN2HwztmJi7HAvsOM78pU7Xc2a4sZZX2&oauth_version=1.0

编码后为

%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请求,可以拿它来验证自己的每次请求。

twitter 授权过程的更多相关文章

  1. OAuth授权过程

    什么是OAuth授权? 一.什么是OAuth协议 OAuth(开放授权)是一个开放标准,所谓OAuth(即Open Authorization,开放授权),它是为用户资源授权提供了一种安全简单的标准, ...

  2. 第三方登录(1)OAuth(开放授权)简介及授权过程

    3个角色:服务方,开发者,用户 a.用户在第在服务注册填写个人信息, b.服务方开放OAuth, c.开发者在服务方申请第3方登录,在程序中得到令牌后,经用户同意,可得到用户的个人信息. OAuth ...

  3. ASP.NET Core Identity 实战(4)授权过程

    这篇文章我们将一起来学习 Asp.Net Core 中的(注:这样描述不准确,稍后你会明白)授权过程 前情提要 在之前的文章里,我们有提到认证和授权是两个分开的过程,而且认证过程不属于Identity ...

  4. Spring Security 解析(一) —— 授权过程

    Spring Security 解析(一) -- 授权过程   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把Spring Security .S ...

  5. OAuth 授权过程工作原理讲解

    转自:http://www.imooc.com/article/10931 在一个单位中,可能是存在多个不同的应用,比如学校会有财务的系统会有学生工作的系统,还有图书馆的系统等等,如果每个系统都用独立 ...

  6. 十五、Android学习笔记_授权过程

    1.需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. 2.通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理 ...

  7. 基于shiro授权过程

    1.对subject进行授权,调用方法isPermitted("permission串")2.SecurityManager执行授权,通过ModularRealmAuthorize ...

  8. Android学习笔记_73_授权过程

    .需要申请App Key和App Secret.不同的开发平台有不同的接入方式,可以参考文档,然后将这两个值放进去. .通过OAuth类实现认证,它会自动跳转到认证界面,进行授权,成功之后需要处理回调 ...

  9. python爬虫登录

    python3 urllib.request 网络请求操作 http://www.cnblogs.com/cocoajin/p/3679821.html python实现 爬取twitter用户姓名 ...

随机推荐

  1. 写得好 git 提交信息

    编写好 git 提交信息 提交信息 我们作出答复,更改将提交相关信息,这些信息通常被认为是重要的信息会小心留下应该离开,你为什么需要这个提交实例,提交解决任何问题. 我们需要良好的信息组织,虽然后来, ...

  2. Atitit.软体guibuttonand面板---通信子系统(范围)-- github 采用....

    Atitit.软体guibuttonand面板---通讯子系统(区)-- github 的使用.... 1. 1.注冊账户以及创建仓库 1 2. 二.在GitHub中创建项目(create a new ...

  3. js敏感词过滤

    var filterWord={ words:"", tblRoot:{}, //敏感词文件 file:"sensitiveWords.txt", //载入敏感 ...

  4. T4模版引擎之基础入门

    额,T4好陌生的名字,和NuGet一样很悲催,不为世人所熟知,却又在背后默默无闻的奉献着,直到现在我们项目组的人除了我之外,其它人还是对其豪无兴趣,基本上是连看一眼都懒得看,可怜的娃啊... T4(T ...

  5. crawler_爬虫分布式设计图收集_01

  6. Web监控工具

    .Rabbitmq的使用及Web监控工具使用   一.文档资料        1.官方网站:http://www.rabbitmq.com/        2.安装教程:http://www.rabb ...

  7. 管理员控制Windows Service

    C# 以管理员方式启动Winform,进而使用管理员控制Windows Service   问题起因: 1,) 问题自动分析Windows服务在正常运行时,确实会存在程序及人为原因导致该服务停止.为了 ...

  8. JavaScript语法细节——引用与复制

    原文:JavaScript语法细节--引用与复制 我们都知道,JS中变量的赋值有两种方式,最近在折腾自己写的标签栏插件,碰到了很多平时没注意的问题.正好,那边处理清楚了,稍微整理一下关于引用与复制相关 ...

  9. c++ Constructor FAQ 继续

    这一章的时候,才明白什么是编译器的声明只会是一个默认的构造.这也解释了为什么同一似乎没有意义的界定,如果不还声明默认构造函数的意义. Q:当编译器隐含定义了一个默认的构造函数. 答: 一个隐式声明的默 ...

  10. 从.net复制源代码中国农历阵列,必要做日历

    从.net复制源代码中国农历阵列,必要做日历 const { 闰月的月份.春节的阳历日期(农历正月初一).农历的每一个月天数 } c_arrLunarInfo: array [1900 .. 2100 ...