2011-10-27 55 views
0

我目前正在网站上工作。将有几种类型的授权,其中之一是“通过Twitter”。我正在使用亚伯拉罕威廉姆斯的TwitterOAuth图书馆。我会尽力解释如何下面的脚本作品:Twitter OAuth 1.0。 Opera重定向失败

  1. 当你“登陆”在的index.php弹出窗口(login.php中)按钮打打开,并询问批准的应用程序一起工作您的推特帐号
  2. 提交后,它将通过$ _GET参数中的“访问令牌”重定向到api.twitter.com。
  3. 然后,twitter会授权该“标记”,并返回到在twitter应用程序的设置中定义的回调URL。

它的工作原理非常完美,除了在从api.twitter.com重定向到回调URL时,Opera有问题。似乎根本没有执行重定向。

下面是来源:

的index.php

<?php 
session_start(); 
session_destroy(); 
?> 
<!DOCTYPE html> 
<html> 

    <head> 

     <meta charset="utf-8" /> 
     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script> 
     <script type="text/javascript"> 
     function popup(url) 
     { 
      var addr = document.location.href.replace('index.php',''); 
      popUpObj = window.open(addr + url, 'Twitter', 'width=700,height=600,menubar=yes,status=yes'); 

     } 

     function transferdata(data) 
      { 
       if (data.screen_name) 
       { 
        (elem = document.getElementById('tw-login')).parentNode.removeChild(elem); 
        document.getElementById('menu').innerHTML = 'Hello, ' + data.screen_name; 
       } 
       else 
        document.getElementById('menu').innerHTML = 'Twitter didn\'t authorize you :('; 
      } 
     </script> 
     <style type="text/css"> 

     #tw-login 
     { 
      display: block; 
      background-color: #ccc; 
      text-align: center; 
      font-family: "Trebuchet MS", Vernanda, serif; 
      color: #fff; 
      margin: 5px; 
      padding: 4px 6px; 
      text-decoration: none; 
      width: 80px; 
     } 
     #tw-logout 
     { 
      display: block; 
      background-color: #ccc; 
      text-align: center; 
      font-family: "Trebuchet MS", Vernanda, serif; 
      color: #fff; 
      margin: 5px; 
      padding: 4px 6px; 
      text-decoration: none; 
      width: 80px; 
     } 

     </style> 

    </head> 

    <body> 
     <a id="tw-login" href="" onclick="popup('login.php');">Log in</a> 
     <a id="tw-logout" href="session_clear.php">Log out</a> 
     <div id="menu"> 

     </div>  
    </body> 
</html> 

的login.php

<?php 
session_start(); 
include 'twitteroauth/twitteroauth.php'; 
define('TWITTER_KEY', '*******'); 
define('TWITTER_KEY_SECRET', '*******'); 


$twitteroauth = new TwitterOAuth(TWITTER_KEY, TWITTER_KEY_SECRET); 
$requestToken = $twitteroauth->getRequestToken(); 
$_SESSION['oauth_token'] = $requestToken['oauth_token']; 
$_SESSION['oauth_token_secret'] = $requestToken['oauth_token_secret']; 

if($twitteroauth->http_code == 200) 
{ 
    $url = $twitteroauth->getAuthorizeURL($requestToken['oauth_token']); 
    header('Location: ' . $url); 
} 
else 
{ 
    die('Something wrong happened.'); 
} 

callback.php

<?php 
session_start(); 
include 'twitteroauth/twitteroauth.php'; 
define('TWITTER_KEY', '*******'); 
define('TWITTER_KEY_SECRET', '*******'); 

if (!empty($_GET['oauth_verifier']) && !empty($_SESSION['oauth_token']) && !empty($_SESSION['oauth_token_secret'])) 
{ 
    $twitteroauth = new TwitterOAuth(TWITTER_KEY, TWITTER_KEY_SECRET, $_SESSION['oauth_token'], $_SESSION['oauth_token_secret']); 
    $accessToken = $twitteroauth->getAccessToken($_GET['oauth_verifier']); 
    $_SESSION['access_token'] = $accessToken; 
    $userinfo = $twitteroauth->get('account/verify_credentials'); 
} 
else 
    header('Location: login.php'); 

?> 
<!DOCTYPE html> 
<html> 
    <head> 

     <meta charset="utf-8"> 
     <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.3/jquery.min.js"></script> 
     <script type="text/javascript"> 
     $(document).ready(SendToMain()); 

     function SendToMain() 
     { 
      if(window.opener != null || !window.opener.closed) 
      { 
       window.opener.transferdata(<?php echo json_encode($userinfo); ?>); 
       window.close(); 
      } 
     } 
     </script> 

    </head> 

    <body> 
    </body> 
</html> 

session_clear.php

<?php 
session_start(); 
session_destroy(); 
header('Location: index.php'); 
+0

如果这些API密钥真的是秘密的,也许你应该从公共StackOverflow后删除它们:-) – hallvors

回答

1

您的重定向URI不使用ssl。要解决此问题,请改用https。

0

你必须发送一些浏览器状态码301一样或303,他们将重定向之前。尝试这样:

header("Status: 303"); 
header("Location: /home.php"); 
exit; 
+0

我的重定向工作正常。从api.twitter.com重定向到回调失败。我不幸地无法访问twitter.com资源:) – mintobit

+0

在这种情况下,您必须提供更多详细信息 - 因为不知道Twitter如何实际执行重定向,我们无法调试此:-(如果您不想给我们一个显示问题的URL,或许您可以使用Fiddler HTTP调试器来探索Twitter发送到各种浏览器的内容?顺便说一下,您正在Intranet或Internet上重定向到的站点? – hallvors