serverless-sam
Version:
Serverless framework plugin to export AWS SAM templates for a service
93 lines (85 loc) • 2.89 kB
JavaScript
const jwt = require('jsonwebtoken')
// Set in `enviroment` of serverless.yml
const AUTH0_CLIENT_ID = process.env.AUTH0_CLIENT_ID
const AUTH0_CLIENT_SECRET = process.env.AUTH0_CLIENT_SECRET
// Policy helper function
const generatePolicy = (principalId, effect, resource) => {
const authResponse = {}
authResponse.principalId = principalId
if (effect && resource) {
const policyDocument = {}
policyDocument.Version = '2012-10-17'
policyDocument.Statement = []
const statementOne = {}
statementOne.Action = 'execute-api:Invoke'
statementOne.Effect = effect
statementOne.Resource = resource
policyDocument.Statement[0] = statementOne
authResponse.policyDocument = policyDocument
}
return authResponse
}
// Reusable Authorizer function, set on `authorizer` field in serverless.yml
module.exports.auth = (event, context, callback) => {
console.log('event', event)
if (!event.authorizationToken) {
return callback('Unauthorized')
}
const tokenParts = event.authorizationToken.split(' ')
const tokenValue = tokenParts[1]
if (!(tokenParts[0].toLowerCase() === 'bearer' && tokenValue)) {
// no auth token!
return callback('Unauthorized')
}
const options = {
audience: AUTH0_CLIENT_ID,
}
// decode base64 secret. ref: http://bit.ly/2hA6CrO
const secret = new Buffer.from(AUTH0_CLIENT_SECRET, 'base64')
try {
jwt.verify(tokenValue, secret, options, (verifyError, decoded) => {
if (verifyError) {
console.log('verifyError', verifyError)
// 401 Unauthorized
console.log(`Token invalid. ${verifyError}`)
return callback('Unauthorized')
}
// is custom authorizer function
console.log('valid from customAuthorizer', decoded)
return callback(null, generatePolicy(decoded.sub, 'Allow', event.methodArn))
})
} catch (err) {
console.log('catch error. Invalid token', err)
return callback('Unauthorized')
}
}
// Public API
module.exports.publicEndpoint = (event, context, callback) => {
return callback(null, {
statusCode: 200,
headers: {
/* Required for CORS support to work */
"Access-Control-Allow-Origin": "*",
/* Required for cookies, authorization headers with HTTPS */
"Access-Control-Allow-Credentials": true
},
body: JSON.stringify({
message: 'Hi ⊂◉‿◉つ from Public API',
}),
})
}
// Private API
module.exports.privateEndpoint = (event, context, callback) => {
return callback(null, {
statusCode: 200,
headers: {
/* Required for CORS support to work */
"Access-Control-Allow-Origin": "*",
/* Required for cookies, authorization headers with HTTPS */
"Access-Control-Allow-Credentials": true
},
body: JSON.stringify({
message: 'Hi ⊂◉‿◉つ from Private API. Only logged in users can see this',
}),
})
}