Skip to content

Instantly share code, notes, and snippets.

@tanpinsiang
Forked from netconstructor/cartodb.js
Created June 14, 2013 18:48
Show Gist options
  • Save tanpinsiang/5784262 to your computer and use it in GitHub Desktop.
Save tanpinsiang/5784262 to your computer and use it in GitHub Desktop.
// OAuth supports 3 legged and 2 legged (aka XAuth) authentication.
// This app demonstrates how to use 2 legged authentication with CartoDB
var sys = require('sys')
, querystring = require('querystring')
, OAuth = require('oauth').OAuth
, EventEmitter = require('events').EventEmitter;
function CartoDBClient(user, password, consumer_key, consumer_secret) {
this.user = user;
var cartodb_request_url = 'https://' + user + '.cartodb.com/oauth/request_token'
this.cartodb_access_url = 'https://' + user + '.cartodb.com/oauth/access_token'
this.cartodb_api_url = 'https://' + user + '.cartodb.com/api/v1/sql';
this.password = password;
this.oa = new OAuth(cartodb_request_url, this.cartodb_access_url, consumer_key, consumer_secret, "1.0", null, "HMAC-SHA1");
}
CartoDBClient.prototype = new EventEmitter();
CartoDBClient.prototype.connect = function() {
var self = this;
sys.puts('connecting');
self.oa.getOAuthRequestToken(function(error, request_key, request_secret, results){
if(error) sys.puts('error :' + error);
else {
sys.puts('\n== Request Tokens ==');
sys.puts('request key :' + request_key);
sys.puts('request secret :' + request_secret);
// Configure XAuth request
var xauth = {x_auth_mode:"client_auth", x_auth_username: self.user , x_auth_password: self.password };
console.log(xauth)
// Request access key and secret tokens via XAuth
// ** NOTE: Do NOT post the request_secret in argument 3 **
sys.puts("\nRequesting access tokens via XAuth...");
self.oa.post(self.cartodb_access_url, request_key, null, xauth, null, function(error, data) {
if(error) {
sys.puts(require('sys').inspect(error));
throw new Error("...XAuth failed. Please check your password and username.");
} else {
sys.puts("...XAuth successful!");
// Parse access tokens from returned query string
var access_tokens = querystring.parse(data);
self.access_key = access_tokens['oauth_token'];
self.access_secret = access_tokens['oauth_token_secret'];
self.emit('connect');
}
});
}
});
}
function tmpl(s,d){
for(var p in d)
s=s.replace(new RegExp('{'+p+'}','g'), d[p]);
return s;
}
CartoDBClient.prototype.sql = function(_sql, args) {
var sql = tmpl(_sql, args);
console.log("sending", sql)
var self = this;
function _response(error, data, response) {
if(error) {
self.emit('error', error)
} else {
self.emit('data', data, response);
}
}
if(sql.length > 2048) {
var protected_request = this.cartodb_api_url + "?q=" + querystring.escape(sql);
this.oa.get(protected_request, this.access_key, this.access_secret, _response);
} else {
var protected_request = this.cartodb_api_url;
var body = {q: sql}
this.oa.post(protected_request, this.access_key, this.access_secret, body, null, _response)
}
}
module.exports = {
CartoDBClient: CartoDBClient
}
/*
console.log("init");
var c = new CartoDBClient(....);
c.connect();
c.on('connect', function() {
console.log("connected");
var sql = "INSERT INTO aaaaa (event, date, the_geom) VALUES ('test', '2011-12-17 20:50:00', GEOMETRYFROMTEXT('POINT(-4.831201 41.71381)',4326))";
c.sql(sql);
});
c.on('error', function(error) {
console.log("ERROR", error);
});
c.on('data', function(data) {
console.log(data);
});
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment