Repository navigation
Expand file tree
/
Copy pathindex.js
More file actions
56 lines (48 loc) · 1.47 KB
/
Copy pathindex.js
File metadata and controls
56 lines (48 loc) · 1.47 KB
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
const { expressjwt: jwt } = require('express-jwt');
const { UnauthorizedError } = require('@tryghost/errors');
const membersService = require('../../members');
const config = require('../../../../shared/config');
let UNO_MEMBERINO;
async function createMiddleware() {
const { protocol, host } = new URL(config.get('url'));
const siteOrigin = `${protocol}//${host}`;
const membersConfig = await membersService.api.getPublicConfig();
return jwt({
credentialsRequired: false,
requestProperty: 'member',
audience: siteOrigin,
issuer: membersConfig.issuer,
algorithms: ['RS512'],
secret: (req, token) => membersConfig.getVerificationKey(token?.header.kid),
getToken(req) {
if (!req.get('authorization')) {
return null;
}
const [scheme, credentials] = req.get('authorization').split(/\s+/);
if (scheme !== 'GhostMembers') {
return null;
}
return credentials;
},
});
}
module.exports = {
get authenticateMembersToken() {
return async function (req, res, next) {
if (!UNO_MEMBERINO) {
UNO_MEMBERINO = await createMiddleware();
}
try {
const middleware = UNO_MEMBERINO;
middleware(req, res, function (err, ...rest) {
if (err && err.name === 'UnauthorizedError') {
return next(new UnauthorizedError({ err }), ...rest);
}
return next(err, ...rest);
});
} catch (err) {
next(err);
}
};
},
};