Created
December 8, 2014 03:40
-
-
Save feltnerm/cd3a03e7cd675f2759bf to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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