-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
42 lines (32 loc) · 1.3 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
const boom = require('@hapi/boom');
const pkg = require('./package.json');
const to = (promise) => promise
.then((data) => [null, data])
.catch((err) => [err, null]);
const test = (server, request) => async (strategy) => {
const [error, auth] = await to(server.auth.test(strategy, request));
if (error) {
const preparedError = boom.boomify(error, { decorate: { strategy } });
preparedError.message = `Strategy ${strategy}: ${preparedError.message}`;
preparedError.output.payload.message = `Strategy ${strategy}: ${preparedError.output.payload.message}`;
throw preparedError;
}
return auth;
};
const authenticate = (server, strategies) => async (request, h) => {
const [aggregateError, auth] = await to(Promise.any(strategies.map(test(server, request))));
if (aggregateError) {
const preparedAggregateError = boom.boomify(aggregateError, { statusCode: 401 });
preparedAggregateError.output.payload.message = aggregateError.errors.map(({ output }) => output.payload.message).join(', ');
throw preparedAggregateError;
}
return h.authenticated(auth);
};
const register = (server, { name = 'any' }) => {
const scheme = (_, { strategies }) => ({ authenticate: authenticate(server, strategies) });
server.auth.scheme(name, scheme);
};
module.exports = {
register,
pkg,
};