Skip to content

Commit 8e367d2

Browse files
2 parents f06bccd + 8a89a98 commit 8e367d2

File tree

5 files changed

+82
-9
lines changed

5 files changed

+82
-9
lines changed

build.sh

100644100755
File mode changed.

common/helper.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,8 @@ function validateEventPayload (event) {
190190
}
191191

192192
function verifyTokenScope (req, scope) {
193-
const isMachineToken = _.get(req, 'authUser.isMachine', false)
194-
const scopes = _.get(req, 'authUser.scopes', [])
193+
const isMachineToken = _.get(req.swagger.params, 'authUser.isMachine', false)
194+
const scopes = _.get(req.swagger.params, 'authUser.scopes', [])
195195
if (isMachineToken && !(_.indexOf(scopes, scope) >= 0)) {
196196
throw createError.Unauthorized('Check your token scope.')
197197
}

deploy.sh

100644100755
File mode changed.

index.js

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ const jsyaml = require('js-yaml')
1111

1212
const MessageBusService = require('./service/MessageBusService')
1313
const logger = require('./common/logger')
14+
const AuthService = require('./service/AuthService')
1415

1516
const serverPort = config.PORT
1617

@@ -31,13 +32,9 @@ swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) {
3132
app.use(middleware.swaggerMetadata())
3233

3334
// Authentication
34-
// app.use(middleware.swaggerSecurity({
35-
// Bearer: (req, authOrSecDef, scopesOrApiKey, callback) => {
36-
// // authOrSecDef: { type: 'apiKey', name: 'Authorization', in: 'header' }
37-
// // scopesOrApiKey: Bearer test (What I passed in Authorization header)
38-
// callback()
39-
// }
40-
// }))
35+
app.use(middleware.swaggerSecurity({
36+
Bearer: AuthService()
37+
}))
4138

4239
// Validate Swagger requests
4340
app.use(middleware.swaggerValidator())

service/AuthService.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
const config = require('config')
2+
const { verifier } = require('tc-core-library-js').auth
3+
const _ = require('lodash')
4+
5+
const NOT_AUTHORIZED = 401
6+
7+
/**
8+
* Function body is similar to tc-core-library-js
9+
* jwt auth middleware. That function is expressjs specific
10+
* and thus using the modified version here specific for
11+
* swagger code gen
12+
*/
13+
module.exports = function () {
14+
let secret = config.get('AUTH_SECRET')
15+
let validIssuers = JSON.parse(config.get('VALID_ISSUERS'))
16+
17+
if (!secret || secret.length === 0) {
18+
throw new Error('Auth secret not provided')
19+
}
20+
21+
if (!validIssuers || validIssuers.length === 0) {
22+
throw new Error('JWT Issuers are not configured')
23+
}
24+
25+
let authVerifier = verifier(validIssuers)
26+
27+
return function (req, authOrSecDef, scopesOrApiKey, callback) {
28+
if (!!scopesOrApiKey && scopesOrApiKey.indexOf('Bearer') === 0) {
29+
const token = scopesOrApiKey.split('Bearer ')[1]
30+
31+
authVerifier.validateToken(token, secret, (err, decoded) => {
32+
let scopes
33+
34+
if (err) {
35+
err.statusCode = NOT_AUTHORIZED
36+
return callback(err)
37+
}
38+
39+
decoded.userId = _.parseInt(_.find(decoded, (value, key) => {
40+
return (key.indexOf('userId') !== -1)
41+
}))
42+
decoded.handle = _.find(decoded, (value, key) => {
43+
return (key.indexOf('handle') !== -1)
44+
})
45+
decoded.roles = _.find(decoded, (value, key) => {
46+
return (key.indexOf('roles') !== -1)
47+
})
48+
49+
scopes = _.find(decoded, (value, key) => {
50+
return (key.indexOf('scope') !== -1)
51+
})
52+
53+
if (scopes) {
54+
decoded.scopes = scopes.split(' ')
55+
56+
let grantType = _.find(decoded, (value, key) => {
57+
return (key.indexOf('gty') !== -1)
58+
})
59+
if (grantType === 'client-credentials' &&
60+
!decoded.userId &&
61+
!decoded.roles) {
62+
decoded.isMachine = true
63+
}
64+
}
65+
66+
req.swagger.params.authUser = decoded
67+
68+
callback()
69+
})
70+
} else {
71+
const error = new Error('You are not authorized to access this resource')
72+
error.statusCode = NOT_AUTHORIZED
73+
callback(error)
74+
}
75+
}
76+
}

0 commit comments

Comments
 (0)