Skip to content

Commit 8a9d74a

Browse files
committed
restructure options
1 parent a18305f commit 8a9d74a

File tree

6 files changed

+177
-466
lines changed

6 files changed

+177
-466
lines changed

src/cache.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ let instance
77
* Initiate a cache singleton
88
*
99
* @param {Hapi.Server} server The created server instance
10-
* @param {Object|false} opts The instance its options
10+
* @param {Object|boolean} opts The instance its options
1111
* @returns {Object} The cache instance
1212
*/
1313
function init (server, opts) {
1414
if (instance === undefined) {
1515
if (opts === false) {
1616
instance = false
1717
} else {
18-
instance = server.cache(opts)
18+
instance = server.cache(opts === true ? {} : opts)
1919
}
2020
}
2121

src/index.js

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,15 @@ const pkg = require('../package.json')
88
* @type Object
99
* @private
1010
*
11-
* Internally used properties
11+
* The plugin related options
1212
*/
13-
const internals = {
14-
clientOptions: undefined,
15-
userInfoFields: undefined
16-
}
13+
let options
1714

1815
function validateOnline (token) {
19-
const opts = internals.clientOptions
20-
21-
return axios.post(`${opts.realmUrl}/protocol/openid-connect/token/introspect`, {
16+
return axios.post(`${options.realmUrl}/protocol/openid-connect/token/introspect`, {
2217
token,
23-
client_secret: opts.secret,
24-
client_id: opts.clientId
18+
client_secret: options.secret,
19+
client_id: options.clientId
2520
}).then(({ data }) => {
2621
if (!data.active) {
2722
throw Error(error.msg.invalid)
@@ -42,7 +37,7 @@ function validateOnline (token) {
4237
*/
4338
function handleKeycloakValidation (tkn, reply) {
4439
validateOnline(tkn.get()).then((res) => {
45-
const { expiresIn, credentials } = tkn.getData(internals.userInfoFields)
40+
const { expiresIn, credentials } = tkn.getData(options.userInfo)
4641
const userData = { credentials }
4742

4843
cache.set(tkn.get(), userData, expiresIn)
@@ -113,11 +108,8 @@ function strategy (server) {
113108
* @param {Function} next The callback handler
114109
*/
115110
function plugin (server, opts, next) {
116-
opts = verify(opts)
117-
cache.init(server, opts.cache)
118-
119-
internals.clientOptions = opts.client
120-
internals.userInfoFields = opts.userInfo
111+
options = verify(opts)
112+
cache.init(server, options.cache)
121113

122114
server.auth.scheme('keycloak-jwt', strategy)
123115
server.decorate('server', 'kjwt', { validate })

src/utils.js

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,14 @@ const joi = require('joi')
88
* The plugin options scheme
99
*/
1010
const scheme = joi.object({
11-
client: joi.object({
12-
realmUrl: joi.string().uri().required(),
13-
clientId: joi.string().min(1).required(),
14-
secret: joi.string().min(1).required()
15-
}).unknown(true).required(),
11+
realmUrl: joi.string().uri().required(),
12+
clientId: joi.string().min(1).required(),
13+
secret: joi.string().min(1).required(),
1614
cache: joi.alternatives().try(joi.object({
1715
segment: joi.string().default('keycloakJwt')
18-
}), joi.boolean().invalid(true)).default(false),
16+
}), joi.boolean()).default(false),
1917
userInfo: joi.array().items(joi.string().min(1))
20-
}).unknown(true).required()
18+
}).required()
2119

2220
/**
2321
* @function

test/_helpers.js

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,22 @@ const fixtures = require('./_fixtures')
99
*
1010
* The default plugin configuration
1111
*/
12-
const defaults = {
13-
client: fixtures.clientConfig,
14-
cache: false,
12+
const defaults = Object.assign({
13+
cache: undefined,
1514
userInfo: undefined
15+
}, fixtures.clientConfig)
16+
17+
/**
18+
* @function
19+
* @public
20+
*
21+
* Get overriden valid default options with customs.
22+
*
23+
* @param {Object} customs The options to be changed
24+
* @returns {Object} The customized options
25+
*/
26+
function getOptions (customs) {
27+
return Object.assign({}, defaults, customs)
1628
}
1729

1830
/**
@@ -131,6 +143,7 @@ function getServer (options, done) {
131143
}
132144

133145
module.exports = {
146+
getOptions,
134147
getServer,
135148
registerPlugin,
136149
mock

test/index.spec.js

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
const test = require('ava')
22
const nock = require('nock')
33
const cache = require('../src/cache')
4-
const { mock, getServer, registerPlugin } = require('./_helpers')
4+
const helpers = require('./_helpers')
55
const fixtures = require('./_fixtures')
66

77
test.afterEach('reset instances and prototypes', () => {
@@ -10,16 +10,16 @@ test.afterEach('reset instances and prototypes', () => {
1010
})
1111

1212
test.cb.serial('throw error if plugin gets registered twice', (t) => {
13-
getServer(undefined, (server) => {
14-
t.throws(() => registerPlugin(server), Error)
13+
helpers.getServer(undefined, (server) => {
14+
t.throws(() => helpers.registerPlugin(server), Error)
1515
t.end()
1616
})
1717
})
1818

1919
test.cb.serial('authentication does succeed', (t) => {
20-
mock(200, fixtures.content.userData)
20+
helpers.mock(200, fixtures.content.userData)
2121

22-
getServer(undefined, (server) => {
22+
helpers.getServer(undefined, (server) => {
2323
server.inject({
2424
method: 'GET',
2525
url: '/',
@@ -35,7 +35,7 @@ test.cb.serial('authentication does succeed', (t) => {
3535
})
3636

3737
test.cb.serial('authentication does succeed – cached', (t) => {
38-
mock(200, fixtures.content.userData)
38+
helpers.mock(200, fixtures.content.userData)
3939

4040
const mockReq = {
4141
method: 'GET',
@@ -45,10 +45,9 @@ test.cb.serial('authentication does succeed – cached', (t) => {
4545
}
4646
}
4747

48-
getServer({
49-
client: fixtures.clientConfig,
50-
cache: {}
51-
}, (server) => {
48+
helpers.getServer(helpers.getOptions({
49+
cache: true
50+
}), (server) => {
5251
server.inject(mockReq, () => {
5352
server.inject(mockReq, (res) => {
5453
t.truthy(res)
@@ -60,9 +59,9 @@ test.cb.serial('authentication does succeed – cached', (t) => {
6059
})
6160

6261
test.cb.serial('authentication does success – valid roles', (t) => {
63-
mock(200, fixtures.content.userData)
62+
helpers.mock(200, fixtures.content.userData)
6463

65-
getServer(undefined, (server) => {
64+
helpers.getServer(undefined, (server) => {
6665
server.inject({
6766
method: 'GET',
6867
url: '/role',
@@ -78,9 +77,9 @@ test.cb.serial('authentication does success – valid roles', (t) => {
7877
})
7978

8079
test.cb.serial('authentication does fail – invalid roles', (t) => {
81-
mock(200, fixtures.content.userData)
80+
helpers.mock(200, fixtures.content.userData)
8281

83-
getServer(undefined, (server) => {
82+
helpers.getServer(undefined, (server) => {
8483
server.inject({
8584
method: 'GET',
8685
url: '/role/guest',
@@ -96,9 +95,9 @@ test.cb.serial('authentication does fail – invalid roles', (t) => {
9695
})
9796

9897
test.cb.serial('authentication does fail – invalid token', (t) => {
99-
mock(200, { active: false })
98+
helpers.mock(200, { active: false })
10099

101-
getServer(undefined, (server) => {
100+
helpers.getServer(undefined, (server) => {
102101
server.inject({
103102
method: 'GET',
104103
url: '/',
@@ -115,7 +114,7 @@ test.cb.serial('authentication does fail – invalid token', (t) => {
115114
})
116115

117116
test.cb.serial('authentication does fail – invalid header', (t) => {
118-
getServer(undefined, (server) => {
117+
helpers.getServer(undefined, (server) => {
119118
server.inject({
120119
method: 'GET',
121120
url: '/',
@@ -132,9 +131,9 @@ test.cb.serial('authentication does fail – invalid header', (t) => {
132131
})
133132

134133
test.cb.serial('server method validates token', (t) => {
135-
mock(200, fixtures.content.userData)
134+
helpers.mock(200, fixtures.content.userData)
136135

137-
getServer(undefined, (server) => {
136+
helpers.getServer(undefined, (server) => {
138137
server.kjwt.validate(`bearer ${fixtures.jwt.userData}`, (err, res) => {
139138
t.falsy(err)
140139
t.truthy(res)
@@ -145,9 +144,9 @@ test.cb.serial('server method validates token', (t) => {
145144
})
146145

147146
test.cb.serial('server method invalidates token – validation error', (t) => {
148-
mock(400, 'an error', true)
147+
helpers.mock(400, 'an error', true)
149148

150-
getServer(undefined, (server) => {
149+
helpers.getServer(undefined, (server) => {
151150
server.kjwt.validate(`bearer ${fixtures.jwt.userData}`, (err, res) => {
152151
t.falsy(res)
153152
t.truthy(err)
@@ -160,9 +159,9 @@ test.cb.serial('server method invalidates token – validation error', (t) => {
160159
})
161160

162161
test.cb.serial('server method invalidates token – invalid', (t) => {
163-
mock(200, { active: false })
162+
helpers.mock(200, { active: false })
164163

165-
getServer(undefined, (server) => {
164+
helpers.getServer(undefined, (server) => {
166165
server.kjwt.validate(`bearer ${fixtures.jwt.userData}`, (err, res) => {
167166
t.falsy(res)
168167
t.truthy(err)
@@ -175,7 +174,7 @@ test.cb.serial('server method invalidates token – invalid', (t) => {
175174
})
176175

177176
test.cb.serial('server method invalidates token – wrong format', (t) => {
178-
getServer(undefined, (server) => {
177+
helpers.getServer(undefined, (server) => {
179178
server.kjwt.validate(fixtures.jwt.userData, (err, res) => {
180179
t.falsy(res)
181180
t.truthy(err)

0 commit comments

Comments
 (0)