twttier 登录席技PHP API

2012 年 11 月 22 日8480

   

一篇稍微老点得席技文章,关于推特席技的,twttier现在国人使用逐渐多起来,虽然需要fq

原文链接:http://http://www.zjjv.com///tutorials/php/how-to-authenticate-users-with-twitter-oauth/

\

本文中用到的类库 twitteroauth 下载

第一步:创建应用

我们首先需要申请一个新的 Twitter 应用。

点击这里,在 dev.twitter.com 打开注册新应用的表单;

根据你的需要添加表单中的各项内容,确认在应用类型(Application Type)那里要选择“浏览器(Browser)”,并设置一个回调地址(Callback URL),例如像 http://http://www.zjjv.com///twitter_login.php 这样的地址,(http://localhost/ 这样的地址可不行,因为不包含域名信息);

最后选择读和写(Read & Write),并填写验证码,点击注册应用(Register Application)按钮来完成申请。

如果没出现错误,完成以上步骤后,你应该能看到如下画面:

\

注意上图的红框,等一下我们将用到上图中的 Consumer key 和 Consumer secret 信息。

网上已经有了不少现成的 Twitter 认证的类库,可以简化我们的工作。在 PHP 里面我推荐twitteroauth,是比较好用的一个,如果你使用其它开发语言,可以在这里找适合你的类库。

请在下载到的压缩包中找到名为 twitteroauth 的目录,将其部署到你的应用程序根目录下。

在我们开始编码前,我们还需要一张数据库来保存用户信息,下面是一个基本的 Mysql 的例子:





1



2



3



4



5



6



7



8



9







CREATE TABLE `users` (



`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,



`oauth_provider` VARCHAR(10),



`oauth_uid` text,



`oauth_token` text,



`oauth_secret` text,



`username` text,



PRIMARY KEY (`id`)



) ENGINE=MyISAM DEFAULT CHARSET=latin1;

注意oauth_token 和oauth_secret 这两个字段。Twitter 的OAuth认证需要 token 和 token_secret 两个参数来完成认证,所以我们需要预留两个字段来记录他们。

第二步:注册用户

我们需要依次完成以下工作:

向 Twitter 发起认证申请

注册/或者登录,如果用户已经有帐号的情况下

将相关数据保存在 Session 中

申请认证

基于 OAuth 的认证流程从生成一个网址开始。用户被重定向到该网址要求认证,认证通过后,会重定向到我们的应用服务器,并会将两个认证后的参数通过 URL 方式传回。

准备好刚才下载的类库,初始化 Session,让我们开始吧:





1



2







require("twitteroauth/twitteroauth.php");



session_start();

创建一个新的 TwitterOAuth 实例,传入我们在第一步申请应用时获取到的 consumer key 和 consumer secret。接下来我们准备发出认证请求,保存认证信息到 Session 中,然后重定向到 Twitter 网站进行认证。





1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18







// 创建 TwitterOAuth 对象实例



$twitteroauth = new TwitterOAuth('YOUR_CONSUMER_KEY', 'YOUR_CONSUMER_SECRET');



// Requesting authentication tokens, the parameter is the URL we will be redirected to



$request_token = $twitteroauth->getRequestToken('http://http://www.zjjv.com///twitter_oauth.php');







// 保存到 session 中



$_SESSION['oauth_token'] = $request_token['oauth_token'];



$_SESSION['oauth_token_secret'] = $request_token['oauth_token_secret'];







// 如果没有错误发生



if($twitteroauth->http_code==200){



// Let's generate the URL and redirect



$url = $twitteroauth->getAuthorizeURL($request_token['oauth_token']);



header('Location: '. $url);



} else {



// 发生错误,你可以做一些更友好的处理



die('Something wrong happened.');



}

将代码保存为 twitter_login.php, 然后访问 http://http://www.zjjv.com///twitter_login.php 进行测试,如果一切 OK 的话,你应该会被重定向到 twitter.com,你将看到如下画面:

\

点击允许(allow)按钮,你将被重定向到 http://http://www.zjjv.com///twitter_oauth.php — 这是我们在上段代码里设置过的,不过我们还没创建这个文件,所以现在代码会抛出一个错误。让我们建立这个文件,记得要先加入包含类库和初始化 Session 的代码,就像我们第一个例子里那样。

接下来,我们还需要在这个文件中完成以下三件事:

验证 URL 中的数据

验证 Session 中的 token 数据

验证 Session 中的 secret 数据

所以,首先要进行数据合法性的判断:





1



2



3



4



5



6







if(!empty($_GET['oauth_verifier']) && !empty($_SESSION['oauth_token']) && !empty($_SESSION['oauth_token_secret'])){



// 数据合法,继续



} else {



// 数据不完整,转到上一步



header('Location: twitter_login.php');



}

如果所有数据库都是合法的,我们需要创建一个新的 TwitterOAuth 对象实例,跟之前不同的是,我们要把获取到的 token 数据做为参数传入对象。之后,我们应该可以获取到一个 access token,这个获取到的数据应该是一个数组,这个 access token 是我们唯一需要保存起来的数据,先来做一个简单的测试吧:





1



2



3



4



5



6



7



8



9



10







// TwitterOAuth 对象实例,注意新加入的两个参数



$twitteroauth = new TwitterOAuth('YOUR_CONSUMER_KEY', 'YOUR_CONSUMER_SECRET', $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']);



// 获取 access token



$access_token = $twitteroauth->getAccessToken($_GET['oauth_verifier']);



// 将获取到的 access token 保存到 Session 中



$_SESSION['access_token'] = $access_token;



// 获取用户信息



$user_info = $twitteroauth->get('account/verify_credentials');



// 打印用户信息



print_r($user_info);

一切正常的话,上面的代码会输出用户的资料。你可以通过$user_info->id来获得用户的 ID,通过$user_info->screen_name来获取用户名,等等,其它的信息也可以通过同样的方式获取。

需要重点指出的是,oauth_verifier 这个传回来的参数不能被重用,如果上面的代码已经正确输出了用户信息,你可以试着重新刷新页面,应该会看到页面会抛出一个错误信息,因为 oauth_verifier 已经被我们用过一次了。要再次使用,需要到 twitter_login.php 页面重新发起一个认证请求。

用户注册

获得了用户信息后,现在我们要开始把用户信息注册到我们自己的数据库中,当然前提是用户没有在本地数据库注册过。首先要连接数据库,代码如下:





1



2







mysql_connect('localhost', 'YOUR_USERNAME', 'YOUR_PASSWORD');



mysql_select_db('YOUR_DATABASE');

上面代码中的数据库链接信息要改成你自己的。如果用户已经存在于我们的数据库中,我们需要更新用户的 tokens 字段,因为这说明 Twitter 生成了新的 tokens,数据库中的 tokens 已经过期了。如果用户不存在,我们需要新加一条记录,并将相关的数据保存在 Session中,最后重定向回 twitter_update.php 页面。相关代码如下:





1



2



3



4



5



6



7



8



9



10



11



12



13



14



15



16



17



18



19



20



21



22



23



24



25



26



27







if(isset($user_info->error)){



// Something's wrong, go back to square 1



header('Location: twitter_login.php');



} else {



// Let's find the user by its ID



$query = mysql_query("SELECT * FROM users WHERE oauth_provider = 'twitter' AND oauth_uid = ". $user_info->id);



$result = mysql_fetch_array($query);







// If not, let's add it to the database



if(empty($result)){



$query = mysql_query("INSERT INTO users (oauth_provider, oauth_uid, username, oauth_token, oauth_secret) VALUES ('twitter', {$user_info->id}, '{$user_info->screen_name}', '{$access_token['oauth_token']}', '{$access_token['oauth_token_secret']}')");



$query = mysql_query("SELECT * FROM users WHERE id = " . mysql_insert_id());



$result = mysql_fetch_array($query);



} else {



// Update the tokens



$query = mysql_query("UPDATE users SET oauth_token = '{$access_token['oauth_token']}', oauth_secret = '{$access_token['oauth_token_secret']}' WHERE oauth_provider = 'twitter' AND oauth_uid = {$user_info->id}");



}







$_SESSION['id'] = $result['id'];



$_SESSION['username'] = $result['username'];



$_SESSION['oauth_uid'] = $result['oauth_uid'];



$_SESSION['oauth_provider'] = $result['oauth_provider'];



$_SESSION['oauth_token'] = $result['oauth_token'];



$_SESSION['oauth_secret'] = $result['oauth_secret'];







header('Location: twitter_update.php');



}

需要注意的是,上面代码中的 SQL 没有经过验证,你在实际使用的时候可能要经过修改。连接数据库前,我们需要先验证一下用户是否已经登录





1



2



3



4







if(!empty($_SESSION['username'])){



// User is logged in, redirect



header('Location: twitter_update.php');



}

有了用户名,我们就可以展示一条个性的欢迎信息了:





1







<h2>Hello <?=(!empty($_SESSION['username']) ? '@' . $_SESSION['username'] : 'Guest'); ?></h2>

Let’s get to the fun side: updating, following and reading.

第三步:获取用户状态

Twitter 官方 API 提供了二十余种资源供开发者使用,例如:timeline, tweets, users, trends, lists, direct messages, 等等。 每一种资源都有对应一堆的方法可供调用的,具体的用法和介绍可以参见官方文档。我们这里只实现最简单的,其它的你可以举一反三。

跟前两步一样,代码开始前你要先创建对象实例,并初始化 Session。





1



2



3







if(!empty($_SESSION['username'])){



$twitteroauth = new TwitterOAuth('YOUR_CONSUMER_KEY', 'YOUR_CONSUMER_SECRET', $_SESSION['oauth_token'], $_SESSION['oauth_secret']);



}

我们来试着获取用户的 timeline 数据,手册告诉我们,资源的路径是statuses/home_timeline,手册上的版本号和格式参数我们不需要关心,类库已经帮我们自己完成了。





1



2







$home_timeline = $twitteroauth->get('statuses/home_timeline');



print_r($home_timeline);

用上面的代码,你应该可以获取到正确的数据了。如果你愿意,可以用一个 foreach 来循环展示具体的条目。手册上关于 timeline 资源的说明中,还有一些参数可以供选择的,例如每次获取的条数。上面代码的 get 方法有一个可选参数,你可以根据需要传入相应的值。如果想获取最新的 40 条数据,只需要使用下面的代码:





1







$home_timeline = $twitteroauth->get('statuses/home_timeline', array('count' => 40));

当然,你可以获取任何人的公开的 timeline 数据。使用 statues/user_timeline 资源即可,需要传入要获取用户的用户 ID 或用户名。例如想获取 @nettuts 的 timeline 数据,你需要下面的代码:





1







$nettuts_timeline = $twitteroauth->get('statuses/user_timeline', array('screen_name' => 'nettuts'));

看到了吧,只要授权通过,获取这些 timeline 数据,只不过是小意思。

第四步:好友关系

通过好友关系,你可以检查某个用户是否是另一个用户的关注者(Follows),当然也可以关注、或者取消关注指定的用户,下面的代码片断用来检查你是否是笔者的关注者,如果不是的话,则会自动关注笔者。

首先,让我们先来看一下开发者手册上关于friendships/exists和friendships/create的这部分说明。注意到了吗?friendships/create 的调用方法是 POST,跟我们前面用的 GET 有些不同。当然,我们用的类库中已经包含了一个叫 post() 的方法,使用起来跟之前的 get() 差不多,唯一不同的地方在于 get() 是用来获取数据的,而 post() 一般用来更新、创建和删除数据。

friendships/exists 需要传入两个参数:用户A 和 用户B。friendships/create 则只需要一个参数:用户名(screen_name)或 用户ID( user_id)。





1



2



3



4



5







$follows_faelazo = $twitteroauth->get('friendships/exists', array('user_a' => $_SESSION['username'], 'user_b' => 'faelazo'));



if(!$follows_faelazo){



echo 'You are NOT following @faelazo!';



$twitteroauth->post('friendships/create', array('screen_name' => 'faelazo'));



}

同样,你可以用类似的代码来取消关注某个用户,只需简单的把 create 替换为 destory:





1



2



3



4



5







$follows_faelazo = $twitteroauth->get('friendships/exists', array('user_a' => $_SESSION['username'], 'user_b' => 'faelazo'));



if($follows_faelazo){



echo 'You are following @faelazo! Proceed to unfollow...';



$twitteroauth->post('friendships/destroy', array('screen_name' => 'faelazo'));



}

第五步:更新

This is probably the most interesting section, since it’s Twitter’s core: posting an update, as you might have imagined, is pretty straightforward. The path is statuses/update, the method is POST (since we are not reading), and the one required argument is status.





1







$twitteroauth->post('statuses/update', array('status' => 'Hello Nettuts+'));

如果上面的代码执行成功的,到你的 Twitter 页面看下,你应该会看到类似的画面:

\

让我们试着转发 @Nettut 的这条 twitter:the HTML 5 Competition,这条记录的 ID 是 19706871538,手册告诉我们,转发需要调用的资源路径是: statuses/retweet/:id, :id 即是我们要转发的消息 ID,方法为 POST,此方法不需要其它附加的参数。





$twitteroauth->post('statuses/retweet/19706871538');



要删除某条消息,我们需要传入要删除的消息 ID,就像转发的操作那样,假设消息的 ID 为 123456789,删除这条消息的代码如下:





1







$twitteroauth->post('statuses/destroy/123456789');

当然,上面删除的代码有个前提,只会删除有经过我们授权的用户消息。

小结

Twitter 的 API 很简单,很容易让人理解,甚至比 FaceBook 的文档都容易得多。遗憾的是认证的过程需要绕一些弯子。

有一点需要特别提醒的是,如果你的应用得到了用户的授权(你的应用有了读写权限),你基本上就相当于控制了这个用户帐户使用权。请小心使用你的权利,少做一些未经过用户授权的事,这会给你制造不少麻烦。

Twitter 很快就会取缔基本身份验证模式(Basic Authentication),OAuth 是最终的解决方案。你现在就可以试着将本文学到的知识应用到你的网站上。让用户不用注册,就可以用世界上最流行的网站帐号直接登录,不也是一件很酷的事情吗?

[翻译:avenger]

0 0