/
config.js
124 lines (104 loc) · 3.35 KB
/
config.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
'use strict'
var dcopy = require('deep-copy')
// oauth scope transform
exports.scope = function (provider, options) {
var scope = options.scope||provider.scope
if (!scope) return
provider.scope = (scope instanceof Array)
? scope.join(provider.scope_delimiter||',')
: scope
if (provider.linkedin) {
// LinkedIn accepts an extended "scope" parameter when obtaining a request.
// Unfortunately, it wants this as a URL query parameter, rather than encoded
// in the POST body (which is the more established and supported mechanism of
// extending OAuth).
provider.request_url = provider.request_url.replace(/(.*)\?scope=.*/,'$1')
provider.request_url += '?scope='+provider.scope
}
}
exports.transform = function (provider, options) {
this.scope(provider, options)
}
exports.override = function (provider, options) {
var override = dcopy(provider)
for (var key in options) {
if (!options[key]) continue
override[key] = options[key]
}
return override
}
exports.dynamic = function (provider, options) {
var override = this.override(provider, options)
this.transform(override, options)
return override
}
exports.state = function (provider) {
var state
if (typeof provider.state == 'string' || typeof provider.state == 'number') {
state = provider.state.toString()
}
else if (typeof provider.state == 'boolean' && provider.state) {
state = (Math.floor(Math.random() * 999999) + 1).toString()
}
return state
}
exports.init = function (config) {
config = config||{}
// oauth configuration
var oauth = require('../config/oauth.json')
// generated below
var result = {}
// generate provider options
for (var key in oauth) {
// oauth provider settings
var provider = dcopy(oauth[key])
// oauth application options
var options = config[key]||{}
// provider shortcuts
provider[key] = true
provider.name = key
// application credentials
provider.key = options.key
provider.secret = options.secret
// server options
provider.protocol = options.protocol||config.server.protocol
provider.host = options.host||config.server.host
provider.callback = options.callback||config.server.callback
provider.transport = options.transport||config.server.transport
// oauth state
provider.state = options.state||config.server.state
// custom
var reserved = ['protocol', 'host', 'callback', 'key', 'secret', 'scope', 'state']
for (var key in options) {
if (reserved.indexOf(key) == -1 && typeof options[key] !== 'object') {
provider[key] = options[key]
}
}
// overrides
var overrides = {}
for (var key in options) {
if (key != 'scope' && typeof options[key] === 'object') {
overrides[key] = this.dynamic(provider, options[key])
}
}
this.transform(provider, options)
provider.overrides = overrides
result[provider.name] = provider
}
return result
}
exports.provider = function (config, session) {
var provider = config[session.provider]
if (session.override && provider.overrides) {
var override = provider.overrides[session.override]
if (override) provider = override
}
if (session.dynamic) {
provider = this.dynamic(provider, session.dynamic)
}
if (provider.state) {
provider = dcopy(provider)
provider.state = this.state(provider)
}
return provider
}