Skip to content

Instantly share code, notes, and snippets.

@feltnerm
Created December 8, 2014 03:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save feltnerm/cd3a03e7cd675f2759bf to your computer and use it in GitHub Desktop.
Save feltnerm/cd3a03e7cd675f2759bf to your computer and use it in GitHub Desktop.
#!/usr/bin/env node
'use strict';
var fs = require('fs'),
http = require('http'),
url = require('url'),
util = require('util'),
qs = require('querystring');
var minimist = require('minimist');
var argv = minimist(process.argv.slice(2), {
alias: { p: 'port' }
});
var hostname = "localhost" || process.env.HOST || argv.host,
port = parseInt(process.env.PORT) || argv.port || 8000;
var client_id = process.env.CLIENT_ID || argv['client-id'] || '';
var client_secret = process.env.CLIENT_SECRET || argv['client-secret'] || '';
var scope = 'repo';
var ecstatic = require('ecstatic')(__dirname + '/../static');
var OAuth2 = require('oauth').OAuth2;
var oauth = new OAuth2(client_id, client_secret, 'https://github.com/',
'login/oauth/authorize',
'login/oauth/access_token');
var server = http.createServer(function(req, res){
function respond(code, err) {
res.statusCode = code;
res.end(err + '\n');
}
/* thanks: http://stackoverflow.com/questions/3393854/get-and-set-a-single-cookie-with-node-js-http-server */
function parseCookies (request) {
var list = {},
rc = request.headers.cookie;
rc && rc.split(';').forEach(function( cookie ) {
var parts = cookie.split('=');
list[parts.shift().trim()] = unescape(parts.join('='));
});
return list;
}
var cookies = parseCookies(req);
var u = url.parse(req.url);
if (u.pathname.match(/^\/github-callback\/?$/)) {
var m = req.method;
try { var parts = decodeURIComponent(u.pathname).split('/').slice(1); }
catch (err) { return respond(400, err); }
var params = qs.parse(u.query);
// upgrade the code to an access token
console.log("Received GitHub OAuth2 callback.", params);
oauth.getOAuthAccessToken(params.code, {}, function (err, access_token, refresh_token) {
if (err) {
console.log(err);
res.writeHead(500);
res.end(err + '');
return;
}
console.log("Setting user GitHub 'token' cookie.");
res.setHeader('Set-Cookie', util.format('access_token=%s; refresh_token=%s', access_token, refresh_token));
console.log(access_token);
res.statusCode = 302;
res.setHeader("Location", "/")
res.end();
//res.end(access_token + '\n');
return;
});
}
else if (u.pathname.match(/^\/revoke\/?$/)) {
res.statusCode = 302;
res.setHeader("Set-Cookie", 'access_token=;refresh_token');
res.end();
return;
}
else {
if (!cookies.access_token) {
console.log('Attempting to authorize via GitHub.');
res.writeHead(303, {
Location: oauth.getAuthorizeUrl({
redirect_uri: util.format('http://localhost:%d/github-callback', port),
scope: 'repo'
})
});
res.end();
return;
}
req.url = req.url.replace(/^\/\-\//, '/');
ecstatic(req, res);
return;
}
return;
});
server.listen(port);
server.on('listening', function () {
console.log('listening on http://localhost:' + server.address().port);
});
function readStream (file) {
return fs.createReadStream(path.join(__dirname, '../static', file));
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment