https://dev.twitter.com/docs/auth/oauth

OAuth

发送安全认证请求

Twitter使用OAuth来提供API的认证访问

特性

安全-用户不需要向第三方应用程序分享他们的密码,增强了帐户的安全性。
标准-丰富的客户端库和例子代码适合Twitter的OAtuth实现。

API v1.1的认证模型

新模型中有两种认证形式,并且仍旧可以在OAuth1.0A中使用

应用程序-用户认证
这是Twitter OAuth1.0A中最普遍的资源认证方式。你对你的应用程序身份和最终用户的API调用权限两方面进行签名认证,表现为用户的访问令牌(AccessToken)

应用程序认证
这种形式的认证不再被支持。

使用OAuth

介绍

理解OAuth工作的方法可以在使用TwitterAPI进行创建时有所帮助。使用OAuth,应用程序必须:
通过用户帐户的操作,取得AccessToken
认证全部发往TwitterAPI的http请求

客户端库

更多的开发者不需要操作OAuth的细节部分,因为Twitter客户端库已经实现了该协议。
参考:https://dev.twitter.com/docs/twitter-libraries

认证请求

概述

这份文档的目的展示了如何修改http请求来实现向TwitterAPI发送认证过的请求

所有的TwitterAPI都机遇HTTP协议。这意味着你编写的任何访问TwitterAPI的软件,都会发送一系列结构化的信息到Twitter服务器。比如,一个请求发送了推特信息“Hello Ladies + Gentlemen,a signed OAuth request!”,结构会像下面的样子

POST /1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Content-Length: 76
Host: api.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

任何HTTP库都应该可以以最小的代价,生成和发出上面的请求。然而,上面的请求是欠考虑的,因为无法知道:
1.哪个应用程序生成的请求
2。哪个用户发送请求
3。是否用户授权应用程序权限,去发送用户的请求
4.是否请求在交互时被第三方篡改

为了让应用程序提供这些信息,TwitterAPI依赖于OAuth1.0a协议。以一个非常简单的方式,Twitter的实现要求上面问题提出的问题所涉及的认证信息,包含在HTTP认证头中。根据上面的HTTP请求,包含头信息的修改后的样子如下(通常验证头信息应该在一行中,但是为了易读性进行了换行)

POST /1/statuses/update.json?include_entities=true HTTP/1.1
Accept: */*
Connection: close
User-Agent: OAuth gem v0.4.4
Content-Type: application/x-www-form-urlencoded
Authorization:
OAuth oauth_consumer_key="xvz1evFS4wEEPTGEFPHBog",
oauth_nonce="kYjzVBB8Y0ZFabxSWbWovY3uYSQ2pTgmZeNu2VS4cg",
oauth_signature="tnnArxj06cWHq44gCs1OSKk%2FjLY%3D",
oauth_signature_method="HMAC-SHA1",
oauth_timestamp="1318622958",
oauth_token="370773112-GmHxMAgYyLbNEtIKZeRNFsMKPR9EyMZeS9weJAEb",
oauth_version="1.0"
Content-Length: 76
Host: api.twitter.com

status=Hello%20Ladies%20%2b%20Gentlemen%2c%20a%20signed%20OAuth%20request%21

收集参数

你应该可以看到头信息中包含7对键值,所有的键名以“oauth_”开头。任何TwitterAPI请求,都会收集这7组值,并且创建一个相似的头信息,允许你为该请求指定认证信息。每一个值描述如下:

Consumer key

oauth_consumer_key 标识哪一个应用程序生成请求。可以在应用程序管理界面dev.twitter.com/apps 获得这个值

Nonce

oauth_nonce参数是一个唯一的token值,应用程序应该为每一个请求生成它。Twitter会使用这个直来判断是否一个请求被提交了多次。这个值以32字节随机数据进行base64编码生成,并且剔除所有非文字字符,但是任何方式生成相对随机数的字符串都可以被接受。

Signature

oauth_signature参数包含一个值,该值以其他所有的请求参数和两个密码值进行签名算法生成。
目的是Twitter可以判断请求在传输中没有被篡改,验证应用程序发送的请求,验证应用程序具有和用户帐户交互的权限。
运算oauth_signature的过程参考:https://dev.twitter.com/docs/auth/creating-signature

Signature method

Twitter使用的oauth_signature_method是HMAC-SHA1。该值应该在所有的验证过的请求中发送格Twitter API

Timestamp

oauth_timestamp参数标识请求何时被创建。这个值应该是从Unix纪元到请求被生成时点的秒数,在大多数的编程语言中都很好实现。Twitter会拒绝太久之前的请求,所以保证生成请求的计算机时钟正确很重要。

Token

oauth_token参数通常代表用户许可应用程序访问他们的帐户。
有一些认证请求不需要传递这个值或者使用不同形式的token,这些情况的详细参考:https://dev.twitter.com/docs/auth/obtaining-access-tokens。
更多通常目的的请求,你应该使用access token。
你可以在你的应用程序管理界面dev.twitter.com/apps ,为你的帐号生成一个有效的access token

Version

oauth_version参数应该一直是1.0。

创建头信息字符串

为了创建头信息字符串,设想向一个名为DST的字符串进行输出。
1.追加字符串"OAuth "(包含最后的空格)到DST。
2.对7组中的每一组键值对进行:
1.对键名进行Percent encode (https://dev.twitter.com/docs/auth/percent-encoding-parameters)并追加到DST
2.追加等于号字符“=”到DST
3.追加一个双引号字符“ 到DST
4.Percent encode 值,并且追加到DST
5.追加一个双引号 “ 到DST
6.如果还有键值对没有被处理,追加逗号 , 和 空格 到DST

获取access token

为了进行认证调用Twitter API,你的应用程序必须首先获得OAuth access token。取得token的方式取决于你的用例。
想要提供一个“Sign in with Twitter”按钮在你的网站上:https://dev.twitter.com/docs/auth/implementing-sign-twitter
想要代表访问你网站的访客,读取或者发送Twitter数据:https://dev.twitter.com/docs/auth/3-legged-authorization
有一个手机或者桌面或者嵌入式的,不可以访问浏览器的应用程序时:https://dev.twitter.com/docs/auth/pin-based-authorization
只是想用你自己的帐户访问API时:https://dev.twitter.com/docs/auth/tokens-devtwittercom
需要使用用户名/密码,并且可以使用xAuth时:https://dev.twitter.com/docs/oauth/xauth
提供一个API,客户端可以代替Twitter用户发送数据:https://dev.twitter.com/docs/auth/oauth/oauth-echo
拥有ios5集成,并且需要access token进行服务器端集成:https://dev.twitter.com/docs/ios/using-reverse-auth

OAuth Echo
(https://dev.twitter.com/docs/auth/oauth/oauth-echo)

OAuth Echo是当和API交互时,保证OAuth和第三方认证进行认证的方案。在Twitter生态系统中,我门使用OAuth Echo意味着允许你的应用程序使用诸如Twipic(http://twitpic.com/)和yfrog的应用。
OAuth Echo仍旧是OAuth。OAuth Echo不需要xAuth(不要让那些x_*的都信息蒙蔽你,那些只是定义自定义HTTP头信息的标准方式)。

在这种交互中有4个部分:
用户:使用Twitter的具体用户和验证过的Twitter应用
消费者:或者说是Twitter应用程序,尝试去和第三方媒体提供商进行交互。
委托方:或者说是第三方的媒体提供商。
服务提供商:Twitter本身。

本质上,你需要为发送给TwitterAPI的委托方准备个请求。// TODO

Implementing Sign in with Twitter
//TODO

https://dev.twitter.com/docs/auth/implementing-sign-twitter

实现Twiter的登录

概述

基于OAuth的浏览器和手机网络实现Twitter的登录。下文演示了如何让请求获得一个有标记的访问令牌的流程。对于如何登陆Twitter的iOS版本的详细信息,请参阅:https://dev.twitter.com/docs/ios

此页面功能实现的前提是读者已经知道如何使用oauth 1.0协议的请求。如果不了解协议的请求及注册,请参阅:https://dev.twitter.com/docs/auth/authorizing-request

第一步.获得一个请求令牌

在开始登录之前,你的应用程序必须通过发送给 POST oauth/request_token 一个签名的消息来获得一个请求令牌。这个请求中唯一的参数是oauth_callback,它必须是一个URL格式的URL,你希望你的用户在完成第二步时会被重新定向,且剩余的参数在OAuth签名过程中会被定义。

请求示例(授权的开头已被封装):

POST /oauth/request_token HTTP/1.1
User-Agent: themattharris' HTTP Client
Host: api.twitter.com
Accept: */*
Authorization: OAuth oauth_callback="http%3A%2F%2Flocalhost%2Fsign-in-with-twitter%2F",oauth_consumer_key="cChZNFj6T5R0TigYB9yd1w",oauth_nonce="ea9ec8429b68d6b77cd5600adbbb0456",oauth_signature="F1Li3tvehgcraF8DMJ7OyxO4w9Y%3D",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1318467427",oauth_version="1.0"

应用程序会检查响应HTTP的状态。任何大于200的值都会导致失败。响应的部分包括:oauth_token, oauth_token_secret, and oauth_callback_confirmed等参数。应用程序应该确认oauth_callback_confirmed值为真而且存储有其他两个下一步的值。

响应示例(请求部分已被封装):

HTTP/1.1 200 OK
Date: Thu, 13 Oct 2011 00:57:06 GMT
Status: 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 146
Pragma: no-cache
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Vary: Accept-Encoding
Server: tfeoauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&
oauth_token_secret=veNRnAWe6inFuo8o2u8SLLZLjolYDmDP7SzL0YfYI&
oauth_callback_confirmed=true

第二步.重定向用户

这一步直接让用户连接到twitter以便他们可以按照正确的流程完成登录。用户直接获取获取OAuth /authenticate ,然后传递步骤1中获得的令牌oauth_token参数。

对一个网站的来说最无缝的方式来实现这一点的就是发出一个HTTP 302来重定向到原来的“登录”请求的响应。手机应用会打开一个浏览器窗口或者直接通过内嵌的web view打开URL。

例如:URL重定向到:

https://api.twitter.com/oauth/authenticate?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0

根据用户的状态,在终点的标志将表现为以下三种方式之一:

  1. Item 1登录和核对成功:如果用户已登录twitter.com而且已经成功调用应用程序。他们会被立刻验证然后返回一个带有正确的认证请求令牌的回调URL。此时不显示重定向到twitter.com的用户。
  2. Item 2登录但未核对成功:如果用户已登录twitter.com但未成功调用应用程序。请求认证的应用程序将会显示。接受授权请求后,用户会被重定向到带着有效的OAuth请求令牌的回调URL中。
  3. Item 3未登录成功:如果用户未成功登录 twitter.com,他们会被提示进入到证书页面中然后授予应用程序访问权限在同一屏幕中来访问他们的信息。登录成功后,返回一个带有正确的认证请求令牌的回调URL。

数据交互中可能的状态的符号的流程图如下所示:

身份验证成功后,您的callback_url会收到一个请求,其中包含oauth_token和oauth_verifier参数的。你的应用程序会验证令牌是否与第一步中收到的令牌相匹配。

来自客户端的请求重定向(封装查询字符串参数):

GET /sign-in-with-twitter/?oauth_token=NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0&oauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.5 (KHTML, like Gecko) Chrome/16.0.891.1 Safari/535.5
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://localhost/sign-in-with-twitter/
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

第三步.从请求令牌转换到访问令牌

要想让请求令牌转换成一个可用的访问令牌,你的应用程序必须在 POST oauth/request_token 端获得一个包括第二步中得到的oauth_verifier值的返回值。请求令牌也要在oauth_token的标头部分验证通过,但是这将在已经添加了签名过程之后发生。

请求示例(授权的开头已被封装):

POST /oauth/access_token HTTP/1.1
User-Agent: themattharris' HTTP Client
Host: api.twitter.com
Accept: */*
Authorization: OAuth oauth_consumer_key="cChZNFj6T5R0TigYB9yd1w",oauth_nonce="a9900fe68e2573b27a37f10fbad6a755",oauth_signature="39cipBtIOHEEnybAR4sATQTpl2I%3D",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1318467427",oauth_token="NPcudxy0yU5T3tBzho7iCotZ3cnetKwcTIRlX0iwRl0",oauth_version="1.0"
Content-Length: 57
Content-Type: application/x-www-form-urlencodedoauth_verifier=uw7NjWHT6OJ1MpJOXsHfNxoAhPKpgI8BlYDhxEjIBY

一个成功的返回值包括:oauth_token, oauth_token_secret, user_id 和 screen_name参数。令牌和令牌密码将会被保存以便用于未来的身份验证及请求Twitter的API。

响应示例(请求部分已被封装):

HTTP/1.1 200 OK
Date: Thu, 13 Oct 2011 00:57:08 GMT
Status: 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 157
Pragma: no-cache
Expires: Tue, 31 Mar 1981 05:00:00 GMT
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
Vary: Accept-Encoding
Server: tfeoauth_token=7588892-kagSNqWge8gB1WwE3plnFsJHAZVfxWD7Vb57p0b4&
oauth_token_secret=PbKfYqSryyeKDWz4ebtY3o5ogNLG11WJuZBc9fQrQo

Twitter 4J

http://twitter4j.org/en/index.html#introduction

概述

Twitter4J是非官方的Twitter API 的Java库。有了它,你可以很容易地整合Java应用程序与Twitter服务。

特点:

  • 100%纯正Java –适用任何1.4.2或更高版本的Java平台。
  • 适用于安卓 和谷歌 的应用平台。
  • 零依赖:不需要额外的jar包。
  • 内置oauth支持。
  • 直接解压即可使用。

系统需求:

  • OS: Windows或Unix的支持Java的任何版本。
  • JVM: Java 1.4.2或更高版本。

使用方法:

添加twitter4j-core-2.2.6.jar 到你的工程中的classpath目录下。

如果你熟悉Java语言,开始使用的最简单的办法是查询JavaDoc 。

源代码:

文档中已包含的文件和源代码。
您也可以通过以下链接浏览项目库:
http://github.com/yusuke/twitter4j/
你也可以查看最近更新的源代码:
http://github.com/yusuke/twitter4j.git/

取得自己ID的方法-getID

返回用户认证的用户ID。
如果这个实例通过提供的Basic和Email address来代替用户名且验证成功,或者通过令牌验证成功,这个方法会调用内部名为verifyCredentials()的参数。来返回认证用户的ID。

示例:

  if (friendsListener != null) {try {long userId = twitter.getId();friendsListener.onGotMyself(String.valueOf(userId));getFriends(friendsListener, parameter);} catch (IllegalStateException e) {e.printStackTrace();} catch (TwitterException e) {e.printStackTrace();}}

取得好友ID的方法-getFriendsIDs

返回一组认证用户的数字型的ID。

参数

  • UserId:返回指定用户的好友列表。
  • 光标:每次最多5000个ID从连接列表被分解在页面显示。在链接查询暂停的用户被过滤出之后返回的ID数不能保证是5000。
    首先页面提供了一个值为-1的光标。从API的返回值会包括previous_cursor和next_cursor两部分来允许页面返回和前进。
    返回值为一组认证用户好友的数字型的ID。

示例:

public final class GetFriendsIDs {/*** Usage: java twitter4j.examples.friendsandfollowers.GetFriendsIDs [screen name]** @param args message*/public static void main(String[] args) {try {Twitter twitter = new TwitterFactory().getInstance();long cursor = -1;IDs ids;System.out.println("Listing following ids.");do {if (0 < args.length) {ids = twitter.getFriendsIDs(args[0], cursor);} else {ids = twitter.getFriendsIDs(cursor);}for (long id : ids.getIDs()) {System.out.println(id);}} while ((cursor = ids.getNextCursor()) != 0);System.exit(0);} catch (TwitterException te) {te.printStackTrace();System.out.println("Failed to get friends' ids: " + te.getMessage());System.exit(-1);}}

[SNS]Twitter相关推荐

  1. 收藏一篇访谈并做笔记:《[独家]与周鸿祎谈乔布斯》

    五点第一觉醒来,看到Apple4us上的一篇访谈<[独家]与周鸿祎谈乔布斯>,通读下来,甚是喜欢.周鸿祎的每一个回答我都非常认同,也想到了一些自己正在做的事,错误与正确.同时,这让我对周鸿 ...

  2. 使用json web token[转]

    使用json web token[转] 由来 做了这么长时间的web开发,从JAVA EE中的jsf,spring,hibernate框架,到spring web MVC,到用php框架thinkPH ...

  3. [Linux]从控制台一次读取一个字符,无需等待回车键

    [Linux]从控制台一次读取一个字符,无需等待回车键 周银辉 读取字符嘛,可以使用getchar(),getch()等等函数,但它们都需要等待回车键以结束输入,而不是按下键盘时立即响应,看上去不那么 ...

  4. 如何理解:先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1的方法,即对于机器数为负数,则有[X]原=[[X]补]补。

    对二进制数来说,先减1后取反和先取反后加1得到的结果是一样的,故仍可采用取反加1的方法,即对于机器数为负数,则有[X]原=[[X]补]补. 当然你也可以用先减1后取反的方法来求补码对应的原码. 对于求 ...

  5. 开源的悲哀——袁萌100天变身实录[2]

    承接上文:开源的悲哀--袁萌100天变身实录[1] 2008年2月末:赤裸裸的微软支持者! 2008年2月29日是ISO为OOXML设置"快速通道"的投票日,因此2月下旬成为OOX ...

  6. 中职计算机应用基础每章知识点,[定稿]中职计算机应用基础教案_1-5章V3.1

    <[定稿]中职计算机应用基础教案_1-5章.doc>由会员分享,可免费在线阅读全文,更多与<[定稿]中职计算机应用基础教案_1-5章(V3.1)>相关文档资源请在帮帮文库(ww ...

  7. Linux RCU机制详解[转]

    一:前言 RCU机制出现的比较早,只是在linux kernel中一直到2.5版本的时候才被采用.关于RCU机制,这里就不做过多的介绍了,网上有很多有关RCU介绍和使用的文档.请自行查阅.本文主要是从 ...

  8. i27岁转行java,JavaTM I/O 性能分析[转]

    JavaTM I/O 性能分析[转] 上一篇 / 下一篇  2008-07-30 13:04:44 / 个人分类:Zee的生活 这篇文章讨论和阐明了提供 JavaTM I/O 性能的多种设计问题,例如 ...

  9. linux下arp***的解决方案[转]

    linux下arp***的解决方案[转]      原贴:http://hi.baidu.com/yk103/blog/item/ede09a2fc5fcba391e3089f2.html linux ...

最新文章

  1. web应用的绝对路径和相对路径
  2. oracle sql MERGE 关键字
  3. Linux 高可用(HA)集群之keepalived详解
  4. 关于word插入特殊符号不显示的问题及解决
  5. Combinations leetcode java
  6. 011_Validation Rule about Time
  7. 大林算法计算机控制实验报告,大林算法
  8. 移动应用APP性能测试白皮书
  9. Sumsets POJ - 2229(计数dp)
  10. linux7如何进入紧急模式,CentOS7开机进入紧急模式EmergencyMode的解决办法
  11. 反射 字段_一次简单的Go反射实战经历分享
  12. 十分钟了解websql和indexedDB
  13. 如何让百度检索Github博客
  14. java suprious wakeup_Java生产消费问题与虚假唤醒(spurious wakeup)
  15. 「案例」让房东在 Airbnb 上展示他们的热情好客
  16. C++图书ISBN码校验
  17. 正确使用自旋锁、互斥锁
  18. unity3D 点击按钮 播放音频
  19. VLAN、VXLAN
  20. 数据结构—图及其应用(交通问题,实现最短路径、最短时间、最少费用查询)

热门文章

  1. git stash用法详解
  2. php注册路由,thinkphp动态注册路由
  3. html text加提示语
  4. 在Windows系统和Linux系统中,如何打造一个好终端?
  5. 雄迈新合封模组,造就安防精工品质
  6. 机械键盘买青轴好还是茶轴好?
  7. Libra 开发者采风
  8. SQL的NOT EXISTS双重否定
  9. AutoJs学习-修改王者荣耀启动动画
  10. 空间数据索引RTree完全解析