我有一个 Phonegap 应用程序,它使用 ChildBrowser 授权我的应用程序使用 Oauth 与用户 Twitter 帐户连接。一旦用户登录他们的 Twitter 帐户并授权应用程序连接,Twitter 就会将 ChildBrowser 发送到回调 url,我从该 url 中检索 request_token。但随后我尝试调用 API 以将 request_token 交换为 access_token,并且应用程序不会继续超过该点。看起来应用程序在 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 -- */