Skip to content

Instantly share code, notes, and snippets.

@jonmaim
Created March 21, 2017 10:53
Show Gist options
  • Save jonmaim/4c4d02f68f5696902d40b627a0785bb3 to your computer and use it in GitHub Desktop.
Save jonmaim/4c4d02f68f5696902d40b627a0785bb3 to your computer and use it in GitHub Desktop.
OAuth 1.0 3-legged server side flow (motorsportreg example)
'use strict';
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
var localtunnel = require('localtunnel');
var request = require('request');
var qs = require('querystring');
var url = require('url');
var http = require('http');
const apiUrl = 'https://demo.motorsportreg.com:9201/';
const requestUrl = apiUrl + 'rest/tokens/request';
const accessUrl = apiUrl + 'rest/tokens/access';
const meUrl = apiUrl + 'rest/me.json';
const consumerKey = '*';
const consumerSecret = '*';
const authorizePage = 'https://demo.motorsportreg.com/index.cfm/event/oauth';
const port = 8000;
localtunnel(port, function(err, tunnel) {
if (err) { throw err; }
console.log('tunnel url:', tunnel.url);
var oauth = {
callback: tunnel.url,
'consumer_key': consumerKey,
'consumer_secret': consumerSecret
};
/* leg 1: request token */
request.post({url: requestUrl, oauth: oauth}, function (e, r, body) {
if (r.statusCode !== 200) { throw r.headers; }
var reqData = qs.parse(body);
console.log('reqData', reqData);
/* leg 2: authorize */
console.log('***');
console.log('authorize page (Cmd + double click to open):', authorizePage + '?' + body);
console.log('***');
http.createServer(function(req, res) {
var parsedUrl = url.parse(req.url, true);
if (parsedUrl.pathname === '/') { /* skip favicon.ico request */
/* leg 3: access token */
var authData = parsedUrl.query;
console.log('authData', authData);
var oauth = {
'consumer_key': consumerKey,
'consumer_secret': consumerSecret,
token: authData['oauth_token'],
'token_secret': reqData['oauth_token_secret'],
verifier: authData['oauth_verifier']
};
request.post({url: accessUrl, oauth: oauth}, function (e, r, body) {
if (r.statusCode !== 200) { throw r.headers; }
var permData = qs.parse(body);
console.log('permData', permData);
var oauth = {
'consumer_key': consumerKey,
'consumer_secret': consumerSecret,
token: permData['oauth_token'],
'token_secret': permData['oauth_token_secret'],
};
request.get({url: meUrl, oauth: oauth, json: true}, function(e, r, body) {
if (r.statusCode !== 200) { throw r.headers; }
console.log('user', JSON.stringify(body.response));
});
});
}
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify({url: req.url, headers: req.headers}, null, 2));
}).listen(port, function() {
console.log('listening to', port);
});
});
});
@jonmaim
Copy link
Author

jonmaim commented Mar 22, 2017

Don't forget to install packages:
npm install --save localtunnel request

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment