-------------------------------------------------------------------------------------
MY HTML CODE IS BELOW
-------------------------------------------------------------------------------------
Sign In With Facebook!
Sign In With Twitter!
-------------------------------------------------------------------------------------------------
MY TWITTER & FACEBOOK SCRIPT IS HERE
-------------------------------------------------------------------------------------------------
// This sample is using jso.js from https://github.com/andreassolberg/jso
var deviceready = function () {
debugger;
var debug = true,
cmdLogin = document.getElementById("cmdLogin"),
twitterlogin = document.getElementById("twitterlogin"),
inAppBrowserRef;
jso_registerRedirectHandler(function (url) {
inAppBrowserRef = window.open(url, "_blank");
inAppBrowserRef.addEventListener('loadstop', function (e) { LocationChange(e.url) }, false);
});
/*
* Register a handler that detects redirects and
* lets JSO to detect incomming OAuth responses and deal with the content.
*/
function LocationChange(url) {
debugger;
outputlog("in location change");
url = decodeURIComponent(url);
outputlog("Checking location: " + url);
jso_checkfortoken('facebook', url, function () {
outputlog("Closing InAppBrowser, because a valid response was detected.");
inAppBrowserRef.close();
});
jso_checkfortoken('twitter', url, function () {
outputlog("Closing InAppBrowser, because a valid response was detected.");
inAppBrowserRef.close();
});
};
/*
* Configure the OAuth providers to use.
*/
jso_configure({
"facebook": {
client_id: "537761576263898",
redirect_uri: "http://www.facebook.com/connect/login_success.html",
authorization: "https://www.facebook.com/dialog/oauth",
presenttoken: "qs"
},
"twitter": {
Consumer_key: "5l7MZyf8q69eucssN8JjNzKNy",
Consumer_secret: "WFez6wgrjP2EBGU3lwCeo0mX2fcwCezdzb5uDrOJo70ybzzXah",
authorization: "https://api.twitter.com/intent/session",
//authorization:"https://api.twitter.com/oauth/authorize",
oauth_token: "2587335836-PxJ1AGrdaCooR0wYOoNuorhyhvMUZDLhfb7nld7",
oauth_token_secret: "ceQayFsXZ6Xy60UVoBDx3YbMv2FrqVRfmcEm80gY7q4Iw",
}
}, { "debug": debug });
cmdLogin.addEventListener("click", function () {
$.oajax({
url: "https://graph.facebook.com/me",
jso_provider: "facebook",
jso_scopes: ["read_stream", "publish_stream"],
jso_allowia: true,
dataType: 'json',
success: function (data) {
debugger;
var finaldata = JSON.stringify(data.data);
var name = data.first_name + " " + data.last_name;
// var app = new kendo.mobile.Application();
app.navigate("#main");
}
});
});
twitterlogin.addEventListener("click", function () {
$.oajax({
url: "https://api.twitter.com/1.1/statuses/home_timeline.json",
//url: "https://api.twitter.com/1.1/statuses/user_timeline.json",
jso_provider: "twitter",
jso_scopes: ["read_stream", "publish_stream"],
jso_allowia: true,
dataType: 'json',
success: function (data) {
debugger;
var finaldata = JSON.stringify(data.data);
var name = data.first_name + " " + data.last_name;
// var app = new kendo.mobile.Application();
app.navigate("#main");
}
});
});
};
function outputlog() {
var resultsField = document.getElementById("result");
}
document.addEventListener('deviceready', this.deviceready, false);
-------------------------------------------------------------------------------------------------
MY JSO.JS IS HERE
-------------------------------------------------------------------------------------------------
(function (exp, $) {
var
config = {},
default_lifetime = 3600,
options = {
"debug": false
},
api_redirect,
Api_default_storage,
api_storage,
internalStates = [];
/*
* ------ SECTION: Utilities
*/
/*
* Returns a random string used for state
*/
var uuid = function () {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
/**
* A log wrapper, that only logs if logging is turned on in the config
* @param {string} msg Log message
*/
var log = function (msg) {
if (!options.debug)
return;
if (!console)
return;
if (!console.log)
return;
// console.log("LOG(), Arguments", arguments, msg)
if (arguments.length > 1) {
console.log(arguments);
}
else {
console.log(msg);
}
}
/**
* Set the global options.
*/
var setOptions = function (opts) {
if (!opts)
return;
for (var k in opts) {
if (opts.hasOwnProperty(k)) {
options[k] = opts[k];
}
}
log("Options is set to ", options);
}
/*
* Takes an URL as input and a params object.
* Each property in the params is added to the url as query string parameters
*/
var encodeURL = function (url, params) {
var res = url;
var k, i = 0;
var firstSeparator = (url.indexOf("?") === -1) ? '?' : '&';
for (k in params) {
res += (i++ === 0 ? firstSeparator : '&') + encodeURIComponent(k) + '=' + encodeURIComponent(params[k]);
}
return res;
}
/*
* Returns epoch, seconds since 1970.
* Used for calculation of expire times.
*/
var epoch = function () {
return Math.round(new Date().getTime() / 1000.0);
}
var parseQueryString = function (qs) {
var e,
a = /\+/g, // Regex for replacing addition symbol with a space
r = /([^&;=]+)=?([^&;]*)/g,
d = function (s) {
return decodeURIComponent(s.replace(a, " "));
},
q = qs,
urlParams = {};
while (e = r.exec(q))
urlParams[d(e[1])] = d(e[2]);
return urlParams;
}
/*
* ------ / SECTION: Utilities
*/
/*
* Redirects the user to a specific URL
*/
api_redirect = function (url) {
window.location = url;
};
Api_default_storage = function () {
log("Constructor");
};
/**
saveState stores an object with an Identifier.
TODO: Ensure that both localstorage and JSON encoding has fallbacks for ancient browsers.
In the state object, we put the request object, plus these parameters:
* restoreHash
* providerID
* scopes
*/
Api_default_storage.prototype.saveState = function (state, obj) {
localStorage.setItem("state-" + state, JSON.stringify(obj));
}
/**
* getStage() returns the state object, but also removes it.
* @type {Object}
*/
Api_default_storage.prototype.getState = function (state) {
// log("getState (" + state+ ")");
var obj = JSON.parse(localStorage.getItem("state-" + state));
localStorage.removeItem("state-" + state)
return obj;
};
/*
* Checks if a token, has includes a specific scope.
* If token has no scope at all, false is returned.
*/
Api_default_storage.prototype.hasScope = function (token, scope) {
var i;
if (!token.scopes)
return false;
for (i = 0; i < token.scopes.length; i++) {
if (token.scopes[i] === scope)
return true;
}
return false;
};
/*
* Takes an array of tokens, and removes the ones that
* are expired, and the ones that do not meet a scopes requirement.
*/
Api_default_storage.prototype.filterTokens = function (tokens, scopes) {
var i, j,
result = [],
now = epoch(),
usethis;
if (!scopes)
scopes = [];
for (i = 0; i < tokens.length; i++) {
usethis = true;
// Filter out expired tokens. Tokens that is expired in 1 second from now.
if (tokens[i].expires && tokens[i].expires < (now + 1))
usethis = false;
// Filter out this token if not all scope requirements are met
for (j = 0; j < scopes.length; j++) {
if (!api_storage.hasScope(tokens[i], scopes[j]))
usethis = false;
}
if (usethis)
result.push(tokens[i]);
}
return result;
};
/*
* saveTokens() stores a list of tokens for a provider.
Usually the tokens stored are a plain Access token plus:
* expires : time that the token expires
* providerID: the provider of the access token?
* scopes: an array with the scopes (not string)
*/
Api_default_storage.prototype.saveTokens = function (provider, tokens) {
// log("Save Tokens (" + provider+ ")");
localStorage.setItem("tokens-" + provider, JSON.stringify(tokens));
};
Api_default_storage.prototype.getTokens = function (provider) {
// log("Get Tokens (" + provider+ ")");
var localTokens = localStorage.getItem("tokens-" + provider),
tokens = localTokens ? JSON.parse(localTokens) : [];
log("Token received", tokens)
return tokens;
};
Api_default_storage.prototype.wipeTokens = function (provider) {
localStorage.removeItem("tokens-" + provider);
};
/*
* Save a single token for a provider.
* This also cleans up expired tokens for the same provider.
*/
Api_default_storage.prototype.saveToken = function (provider, token) {
var tokens = this.getTokens(provider);
tokens = api_storage.filterTokens(tokens);
tokens.push(token);
this.saveTokens(provider, tokens);
};
/*
* Get a token if exists for a provider with a set of scopes.
* The scopes parameter is OPTIONAL.
*/
Api_default_storage.prototype.getToken = function (provider, scopes) {
var tokens = this.getTokens(provider);
tokens = api_storage.filterTokens(tokens, scopes);
if (tokens.length < 1)
return null;
return tokens[0];
};
api_storage = new Api_default_storage();
/**
* Check if the hash contains an access token.
* And if it do, extract the state, compare with
* config, and store the access token for later use.
*
* The url parameter is optional. Used with phonegap and
* childbrowser when the jso context is not receiving the response,
* instead the response is received on a child browser.
*/
exp.jso_checkfortoken = function (providerID, url, callback) {
var
atoken,
h = window.location.hash,
now = epoch(),
state,
co;
log("jso_checkfortoken(" + providerID + ")");
// If a url is provided
if (url) {
// log('Hah, I got the url and it ' + url);
if (url.indexOf('#') === -1)
return;
h = url.substring(url.indexOf('#'));
// log('Hah, I got the hash and it is ' + h);
}
/*
* Start with checking if there is a token in the hash
*/
if (h.length < 2)
return;
if (h.indexOf("access_token") === -1)
return;
h = h.substring(1);
atoken = parseQueryString(h);
if (atoken.state) {
state = api_storage.getState(atoken.state);
}
else {
if (!providerID) {
throw "Could not get [state] and no default providerid is provided.";
}
state = { providerID: providerID };
}
if (!state)
throw "Could not retrieve state";
if (!state.providerID)
throw "Could not get providerid from state";
if (!config[state.providerID])
throw "Could not retrieve config for this provider.";
co = config[state.providerID];
/**
* If state was not provided, and default provider contains a scope parameter
* we assume this is the one requested...
*/
if (!atoken.state && co.scope) {
state.scopes = co.scope;
log("Setting state: ", state);
}
log("Checking atoken ", atoken, " and co ", co);
/*
* Decide when this token should expire.
* Priority fallback:
* 1. Access token expires_in
* 2. Life time in config (may be false = permanent...)
* 3. Specific permanent scope.
* 4. Default library lifetime:
*/
if (atoken["expires_in"]) {
atoken["expires"] = now + parseInt(atoken["expires_in"], 10);
}
else if (co["default_lifetime"] === false) {
// Token is permanent.
}
else if (co["default_lifetime"]) {
atoken["expires"] = now + co["default_lifetime"];
}
else if (co["permanent_scope"]) {
if (!api_storage.hasScope(atoken, co["permanent_scope"])) {
atoken["expires"] = now + default_lifetime;
}
}
else {
atoken["expires"] = now + default_lifetime;
}
/*
* Handle scopes for this token
*/
if (atoken["scope"]) {
atoken["scopes"] = atoken["scope"].split(" ");
}
else if (state["scopes"]) {
atoken["scopes"] = state["scopes"];
}
api_storage.saveToken(state.providerID, atoken);
if (state.restoreHash) {
window.location.hash = state.restoreHash;
}
else {
window.location.hash = '';
}
log(atoken);
if (internalStates[atoken.state] && typeof internalStates[atoken.state] === 'function') {
// log("InternalState is set, calling it now!");
internalStates[atoken.state]();
delete internalStates[atoken.state];
}
if (typeof callback === 'function') {
callback();
}
// log(atoken);
}
/*
* A config object contains:
*/
var jso_authrequest = function (providerid, scopes, callback) {
var
state,
request,
authurl,
co;
if (!config[providerid])
throw "Could not find configuration for provider " + providerid;
co = config[providerid];
log("About to send an authorization request to [" + providerid + "]. Config:")
log(co);
state = uuid();
request = {
"response_type": "token"
};
request.state = state;
if (callback && typeof callback === 'function') {
internalStates[state] = callback;
}
if (co["redirect_uri"]) {
request["redirect_uri"] = co["redirect_uri"];
}
if (co["client_id"]) {
request["client_id"] = co["client_id"];
}
if (scopes) {
request["scope"] = scopes.join(" ");
}
authurl = encodeURL(co.authorization, request);
// We'd like to cache the hash for not loosing Application state.
// With the implciit grant flow, the hash will be replaced with the access
// token when we return after authorization.
if (window.location.hash) {
request["restoreHash"] = window.location.hash;
}
request["providerID"] = providerid;
if (scopes) {
request["scopes"] = scopes;
}
log("Saving state [" + state + "]");
log(JSON.parse(JSON.stringify(request)));
api_storage.saveState(state, request);
api_redirect(authurl);
};
exp.jso_ensureTokens = function (ensure) {
var providerid, scopes, token;
for (providerid in ensure) {
scopes = undefined;
if (ensure[providerid])
scopes = ensure[providerid];
token = api_storage.getToken(providerid, scopes);
log("Ensure token for provider [" + providerid + "] ");
log(token);
if (token === null) {
jso_authrequest(providerid, scopes);
}
}
return true;
}
exp.jso_findDefaultEntry = function (c) {
var
k,
i = 0;
if (!c)
return;
log("c", c);
for (k in c) {
i++;
if (c[k].isDefault && c[k].isDefault === true) {
return k;
}
}
if (i === 1)
return k;
};
exp.jso_configure = function (c, opts) {
config = c;
setOptions(opts);
try {
var def = exp.jso_findDefaultEntry(c);
log("jso_configure() about to check for token for this entry", def);
exp.jso_checkfortoken(def);
}
catch (e) {
log("Error when retrieving token from hash: " + e);
window.location.hash = "";
}
}
exp.jso_dump = function () {
var key;
for (key in config) {
log("=====> Processing provider [" + key + "]");
log("=] Config");
log(config[key]);
log("=] Tokens")
log(api_storage.getTokens(key));
}
}
exp.jso_wipe = function () {
var key;
log("jso_wipe()");
for (key in config) {
log("Wipping tokens for " + key);
api_storage.wipeTokens(key);
}
}
exp.jso_getToken = function (providerid, scopes) {
var token = api_storage.getToken(providerid, scopes);
if (!token)
return null;
if (!token["access_token"])
return null;
return token["access_token"];
}
exp.jso_registerRedirectHandler = function (callback) {
api_redirect = callback;
};
exp.jso_registerStorageHandler = function (object) {
api_storage = object;
};
/*
* From now on, we only perform tasks that require jQuery.
* Like adding the $.oajax function.
*/
if (typeof $ === 'undefined')
return;
$.oajax = function (settings) {
var
allowia,
scopes,
token,
providerid,
co;
providerid = settings.jso_provider;
allowia = settings.jso_allowia || false;
scopes = settings.jso_scopes;
token = api_storage.getToken(providerid, scopes);
co = config[providerid];
// var successOverridden = settings.success;
// settings.success = function(response) {
// }
var errorOverridden = settings.error || null;
var performAjax = function () {
// log("Perform ajax!");
if (!token)
throw "Could not perform AJAX call because no valid tokens was found.";
if (co["presenttoken"] && co["presenttoken"] === "qs") {
// settings.url += ((h.indexOf("?") === -1) ? '?' : '&') + "access_token=" + encodeURIComponent(token["access_token"]);
if (!settings.data)
settings.data = {};
settings.data["access_token"] = token["access_token"];
}
else {
if (!settings.headers)
settings.headers = {};
settings.headers["Authorization"] = "Bearer " + token["access_token"];
}
return $.ajax(settings);
};
settings.error = function (jqXHR, textStatus, errorThrown) {
log('error(jqXHR, textStatus, errorThrown)');
log(jqXHR);
log(textStatus);
log(errorThrown);
if (jqXHR.status === 401) {
log("Token expired. About to delete this token");
log(token);
api_storage.wipeTokens(providerid);
}
if (errorOverridden && typeof errorOverridden === 'function') {
errorOverridden(jqXHR, textStatus, errorThrown);
}
}
if (!token) {
if (allowia) {
log("Perform authrequest");
jso_authrequest(providerid, scopes, function () {
token = api_storage.getToken(providerid, scopes);
performAjax();
});
return;
}
else {
throw "Could not perform AJAX call because no valid tokens was found.";
}
}
return performAjax();
};
})(window, window.jQuery);
-------------------------------------
--------------------------------------