-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
76 lines (70 loc) · 2.33 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
var request = require('request')
var events = require('events')
var url = require('url')
var crypto = require('crypto')
module.exports = function(opts) {
if (!opts.callbackURI) opts.callbackURI = '/github/callback'
if (!opts.loginURI) opts.loginURI = '/github/login'
if (typeof opts.scope === 'undefined') opts.scope = 'user'
if (typeof opts.state === 'undefined') opts.state = '0'
var urlObj = url.parse(opts.baseURL)
urlObj.pathname = url.resolve(urlObj.pathname, opts.callbackURI)
var redirectURI = url.format(urlObj)
var emitter = new events.EventEmitter()
function changeState(state) {
opts.state = state
}
function addRoutes(router, loginCallback) {
// compatible with flatiron/director
router.get(opts.loginURI, login)
router.get(opts.callbackURI, callback)
if (!loginCallback) return
emitter.on('error', function(token, err, resp, tokenResp, req) {
loginCallback(err, token, resp, tokenResp, req)
})
emitter.on('token', function(token, resp, tokenResp, req) {
loginCallback(false, token, resp, tokenResp, req)
})
}
function login(req, resp) {
var u = 'https://github.com/login/oauth/authorize'
+ '?client_id=' + opts.githubClient
+ (opts.scope ? '&scope=' + opts.scope : '')
+ '&redirect_uri=' + redirectURI
+ '&state=' + opts.state
;
resp.statusCode = 302
resp.setHeader('location', u)
resp.end()
}
function callback(req, resp, cb) {
var query = url.parse(req.url, true).query
var code = query.code
if (!code) return emitter.emit('error', {error: 'missing oauth code'}, resp)
var u = 'https://github.com/login/oauth/access_token'
+ '?client_id=' + opts.githubClient
+ '&client_secret=' + opts.githubSecret
+ '&code=' + code
+ '&state=' + opts.state
;
request.get({url:u, json: true}, function (err, tokenResp, body) {
if (err) {
if (cb) {
err.body = body
err.tokenResp = tokenResp
return cb(err)
}
return emitter.emit('error', body, err, resp, tokenResp, req)
}
if (cb) {
cb(null, body)
}
emitter.emit('token', body, resp, tokenResp, req)
})
}
emitter.login = login
emitter.callback = callback
emitter.addRoutes = addRoutes
emitter.changeState = changeState
return emitter
}