2012-05-29 62 views
0

我有一个Phonegap应用程序,它使用ChildBrowser授权我的应用程序使用Oauth与用户Twitter帐户连接。一旦用户登录他们的Twitter帐户授权应用程序连接,Twitter将ChildBrowser发送到回调网址,在那里我从url中检索request_token。但后来我尝试调用API来为access_token交换request_token,并且应用程序不会继续超过这一点。它看起来应用程序中断API调用获取access_token,但我不知道如何。使用jsOAuth从Twitter Oauth API检索access_token

任何帮助将不胜感激!

非常感谢你们!

这里是我的javascript:

/* -- Twitter START -- */ 

var Twitter = { 
    init:function() { 

     var oauth; 
     var requestParams; 
     var options = { 
      consumerKey: 'blahblah', 
      consumerSecret: 'blahblah', 
      callbackUrl: "http://beaconize.com/" 
     }; 
     alert(localStorage.twitterKey); 
     var cb = ChildBrowser.install(); // install our ChildBrowser (cb)  
     var twitterKey = "twttrKey"; // what we will store our twitter user information in 


     // our storedAccessData and Raw Data 
     var storedAccessData, rawData = localStorage.getItem(twitterKey); 

     // First thing we need to do is check to see if we already have the user saved! 
     if(localStorage.getItem(twitterKey) !== null){ 

      // If we already have them 
      storedAccessData = JSON.parse(rawData); // Parse our JSON object 
      options.accessTokenKey = storedAccessData.accessTokenKey; // This is saved when they first sign in 
      options.accessTokenSecret = storedAccessData.accessTokenSecret; // this is saved when they first sign in 

      oauth = OAuth(options); 
      oauth.get('https://api.twitter.com/1/account/verify_credentials.json?skip_status=true', 
       function(data) { 
        var entry = JSON.parse(data.text); 
        alert("USERNAME: " + entry.screen_name); 
       } 
      ); 
     } else { 

      // We don't have a user saved yet 
      oauth = OAuth(options); 
      oauth.get('https://api.twitter.com/oauth/request_token', 
       function(data) { 
        requestParams = data.text; 
        cb.showWebPage('https://api.twitter.com/oauth/authorize?'+data.text); // This opens the Twitter authorization/sign in page  
        cb.onLocationChange = function(loc){ Twitter.success(loc); }; // When the ChildBrowser URL changes we need to track that 
       }, 
       function(data) { 
        alert("ERROR: "+data); 
       } 
      ); 
     } 
    }, 

    /* 
    When The ChildBrowser URL changes we will track it here. 
    We will also determine if the request was a success or not here 
    */ 
    success:function(loc) { 
     // The supplied oauth_callback_url for this session is being loaded 

     /* 
     We will check to see if the childBrowser's new URL matches our callBackURL 
     */ 
     if (loc.indexOf("http://beaconize.com/?") >= 0) { 

      // Parse the returned URL 
      var index, verifier = '';    
      var params = loc.substr(loc.indexOf('?') + 1); 

      params = params.split('&'); 
      for (var i = 0; i < params.length; i++) { 
       var y = params[i].split('='); 
       if(y[0] === 'oauth_verifier') { 
        verifier = y[1]; 
       } 
      } 


      // After the next line, nothing executes. It stops in ChildBrowser on my callback_url. 


      oauth.get('https://api.twitter.com/oauth/access_token?oauth_verifier='+verifier+'&'+requestParams, 
         function(data) {    
         var accessParams = {}; 
         var qvars_tmp = data.text.split('&'); 
         for (var i = 0; i < qvars_tmp.length; i++) { 
          var y = qvars_tmp[i].split('='); 
          accessParams[y[0]] = decodeURIComponent(y[1]); 
         } 

         oauth.setAccessToken([accessParams.oauth_token, accessParams.oauth_token_secret]); 

         // Save access token/key in localStorage 
         var accessData = {}; 
         accessData.accessTokenKey = accessParams.oauth_token; 
         accessData.accessTokenSecret = accessParams.oauth_token_secret; 

         // SETTING OUR LOCAL STORAGE 
         alert("TWITTER: Storing token key/secret in localStorage3"); 
         localStorage.setItem(twitterKey, JSON.stringify(accessData)); 
         }, 
         function(data) { 
         console.log(data); 

         } 
      ); 
         oauth.get('https://api.twitter.com/1/account/verify_credentials.json?skip_status=true', 
           function(data) { 
           var entry = JSON.parse(data.text); 
           alert("TWITTER USER: "+entry.screen_name); 

           // FOR EXAMPLE ONLY 
           //app.init(); 
           }, 
           function(data) { 
           alert("ERROR: " + data); 
           } 
           ); 

         // Since everything went well we can close our childBrowser!        
         window.plugins.childBrowser.close(); 


     } else { 
      // do nothing 
     } 
    }, 
    tweet:function() { 
     var storedAccessData, rawData = localStorage.getItem(twitterKey); 

     storedAccessData = JSON.parse(rawData); // Parse our JSON object 
     options.accessTokenKey = storedAccessData.accessTokenKey; // This is saved when they first sign in 
     options.accessTokenSecret = storedAccessData.accessTokenSecret; // this is saved when they first sign in 

     // jsOAuth takes care of everything for us we just need to provide the options 
     oauth = OAuth(options); 
     oauth.get('https://api.twitter.com/1/account/verify_credentials.json?skip_status=true', 
      function(data) { 
       var entry = JSON.parse(data.text); 
       Twitter.post(); 
      } 
     ); 
    }, 
    /* 
    Now that we have the information we can Tweet! 
    */ 
    post:function() { 
     var theTweet = $("#tweet").val(); // Change this out for what ever you want! 

     oauth.post('https://api.twitter.com/1/statuses/update.json', 
      { 'status' : theTweet, // jsOAuth encodes for us 
      'trim_user' : 'true' }, 
      function(data) { 
       var entry = JSON.parse(data.text); 
       alert(entry); 

       // FOR THE EXAMPLE 
       app.done(); 
      }, 
      function(data) { 
       alert(data); 
      } 
     );  
    } 
}; 

/* -- Twitter END -- */ 
+1

只是要检查您的twitter应用程序中的回调URL也是http:// beaconize .com和http:// www。 beaconize .com - 是吗? –

+1

也有你检查,看看既验证者和requestParams具有值之前击中该功能? –

+0

是这两个回调匹配为“http:// beaconize .com /”。在启动函数之前,我会测试以查看这些变量中显示的内容。 – Karl

回答

1

好。这里是我清理出来的地方。

看起来你错过了一些导致这种突破的事情。

这里是原来的代码 - 这应该工作

oauth.get('https://api.twitter.com/oauth/access_token?oauth_verifier='+verifier+'&'+requestParams, 
         function(data) {    
         var accessParams = {}; 
         var qvars_tmp = data.text.split('&'); 
         for (var i = 0; i < qvars_tmp.length; i++) { 
          var y = qvars_tmp[i].split('='); 
          accessParams[y[0]] = decodeURIComponent(y[1]); 
         } 

         oauth.setAccessToken([accessParams.oauth_token, accessParams.oauth_token_secret]); 

         // Save access token/key in localStorage 
         var accessData = {}; 
         accessData.accessTokenKey = accessParams.oauth_token; 
         accessData.accessTokenSecret = accessParams.oauth_token_secret; 

         // SETTING OUR LOCAL STORAGE 
         alert("TWITTER: Storing token key/secret in localStorage3"); 
         localStorage.setItem(twitterKey, JSON.stringify(accessData)); 
         }, 
         function(data) { 
         console.log(data); 

         } 
      ); 
         oauth.get('https://api.twitter.com/1/account/verify_credentials.json?skip_status=true', 
           function(data) { 
           var entry = JSON.parse(data.text); 
           alert("TWITTER USER: "+entry.screen_name); 

           // FOR EXAMPLE ONLY 
           //app.init(); 
           }, 
           function(data) { 
           alert("ERROR: " + data); 
           } 
           ); 

         // Since everything went well we can close our childBrowser!        
         window.plugins.childBrowser.close(); 


     } else { 
      // do nothing 
     } 
    }, 

有一点要注意,这是你的代码,不同的是在第一的OAuth请求误差函数 - 你的代码似乎缺少这一点,这这不是一个大问题 - 但是你已经取消了格式化,所以现在这两个功能正在引发问题。

如果您复制此代码并选择并粘贴到您的代码并切换它们,您将看到造成问题的细微差异!

0

到目前为止,看你的代码,一切看起来是合理的。

我注意到你正在手动进行一些自动跳舞工作。你有没有尝试过使用fetchRequestToken()& fetchAccessToken()方法?我写了boiler plate code to demonstrate this

你能给出错误信息的输出吗?通常它给出了Twitter为什么不授权你的线索。

,所以我比较了您引用原始项目代码,您也可以发现这很有API reference孤单用于解析URL字符串的无证方法parseTokenRequest()

+0

我还没有尝试过fetchRequestToken()和fetchAccessToken()。但是我受到诱惑,因为我无法让它与手动GET调用一起工作。在您的要点中,您使用的是基于PIN的身份验证,但我宁愿避免使用PIN来验证用户身份。您是否有使用fetchRequestToken()和fetchAccessToken()用于常规oauth身份验证的示例? 感谢您的帮助提前! – Karl

+0

另一种方法是检测URL到回调URL的更改,然后刮取oauth变量的查询字符串。 – bytespider

+0

Libby Baldwin在这个http://www.mobiledevelopersolutions.com/home/start/twominutetutorials/tmt5p1上做了一个很好的教程 – bytespider