diff --git a/.circleci/config.yml b/.circleci/config.yml index ee7fe52..eed75ca 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -82,7 +82,7 @@ workflows: - "build-dev": filters: branches: - only: [dev, 'feature/notification-email-improvements'] + only: dev - "build-prod": filters: branches: diff --git a/README.md b/README.md index 38a2543..cbc2a15 100644 --- a/README.md +++ b/README.md @@ -13,9 +13,8 @@ Configuration for the notification server is at `config/default.js`. The following parameters can be set in config files or in env variables: - LOG_LEVEL: the log level - PORT: the notification server port -- authSecret: TC auth secret -- authDomain: TC auth domain -- validIssuers: TC auth valid issuers +- AUTH_SECRET: TC auth secret +- VALID_ISSUERS: TC auth valid issuers - jwksUri: TC auth JWKS URI - DATABASE_URL: URI to PostgreSQL database - DATABASE_OPTIONS: database connection options @@ -84,9 +83,8 @@ In case it expires, you may get a new token in this way: ## Local deployment - for local development environment you can set variables as following: - - `authSecret`, `authDomain`, `validIssuers` can get from [tc-project-service config](https://github.com/topcoder-platform/tc-project-service/blob/dev/config/default.json) + - `AUTH_SECRET`,`VALID_ISSUERS` can get from [tc-project-service config](https://github.com/topcoder-platform/tc-project-service/blob/dev/config/default.json) - `PORT=4000` because **connect-app** call this port by default - - `jwksUri` - any - `KAFKA_TOPIC_IGNORE_PREFIX=joan-26673.` (with point at the end) - `TC_API_V4_BASE_URL=https://api.topcoder-dev.com/v4` - `TC_API_V3_BASE_URL=https://api.topcoder-dev.com/v3` diff --git a/config/default.js b/config/default.js index e6dfdc0..f93de3a 100644 --- a/config/default.js +++ b/config/default.js @@ -5,9 +5,7 @@ module.exports = { ENV: process.env.ENV, LOG_LEVEL: process.env.LOG_LEVEL, PORT: process.env.PORT, - authSecret: process.env.authSecret, - authDomain: process.env.authDomain, - jwksUri: process.env.jwksUri, + AUTH_SECRET: process.env.authSecret, DATABASE_URL: process.env.DATABASE_URL, DATABASE_OPTIONS: { dialect: 'postgres', @@ -21,7 +19,7 @@ module.exports = { }, }, - validIssuers: process.env.validIssuers ? process.env.validIssuers.replace(/\\"/g, '') : null, + VALID_ISSUERS: process.env.validIssuers ? process.env.validIssuers.replace(/\\"/g, '') : null, KAFKA_URL: process.env.KAFKA_URL, KAFKA_TOPIC_IGNORE_PREFIX: process.env.KAFKA_TOPIC_IGNORE_PREFIX, KAFKA_GROUP_ID: process.env.KAFKA_GROUP_ID, @@ -44,4 +42,14 @@ module.exports = { ENABLE_DEV_MODE: process.env.ENABLE_DEV_MODE || true, DEV_MODE_EMAIL: process.env.DEV_MODE_EMAIL, API_CONTEXT_PATH: process.env.API_CONTEXT_PATH || '/v5/notifications', + + // Configuration for generating machine to machine auth0 token. + // The token will be used for calling another internal API. + AUTH0_URL: process.env.AUTH0_URL, + AUTH0_AUDIENCE: process.env.AUTH0_AUDIENCE, + // The token will be cached. + // We define the time period of the cached token. + TOKEN_CACHE_TIME: process.env.TOKEN_CACHE_TIME || 86400000, + AUTH0_CLIENT_ID: process.env.AUTH0_CLIENT_ID, + AUTH0_CLIENT_SECRET: process.env.AUTH0_CLIENT_SECRET, }; diff --git a/connect/config.js b/connect/config.js index 66691ad..52b9785 100644 --- a/connect/config.js +++ b/connect/config.js @@ -19,4 +19,5 @@ module.exports = { // id of the BOT user which creates post with various events in discussions TCWEBSERVICE_ID: process.env.TCWEBSERVICE_ID || '22838965', + }; diff --git a/connect/service.js b/connect/service.js index 3156895..5efe9f3 100644 --- a/connect/service.js +++ b/connect/service.js @@ -2,8 +2,10 @@ * Service to get data from TopCoder API */ const request = require('superagent'); -const config = require('./config'); +const config = require('config'); const _ = require('lodash'); +const tcCoreLibAuth = require('tc-core-library-js').auth; +const m2m = tcCoreLibAuth.m2m(config); /** * Get project details @@ -68,23 +70,32 @@ const getRoleMembers = (roleId) => request */ const getUsersById = (ids) => { const query = _.map(ids, (id) => 'userId:' + id).join(' OR '); - return request - .get(`${config.TC_API_V3_BASE_URL}/members/_search?fields=userId,email,handle,firstName,lastName&query=${query}`) - .set('accept', 'application/json') - .set('authorization', `Bearer ${config.TC_ADMIN_TOKEN}`) - .then((res) => { - if (!_.get(res, 'body.result.success')) { - throw new Error(`Failed to get users by id: ${ids}`); - } + return m2m.getMachineToken(config.AUTH0_CLIENT_ID, config.AUTH0_CLIENT_SECRET) + .then((token) => { + if (!token && config.TC_ADMIN_TOKEN) token = config.TC_ADMIN_TOKEN; - const users = _.get(res, 'body.result.content'); - return users; - }).catch((err) => { - const errorDetails = _.get(err, 'response.body.result.content.message'); - throw new Error( - `Failed to get users by ids: ${ids}.` + - (errorDetails ? ' Server response: ' + errorDetails : '') - ); + return request + .get(`${config.TC_API_V3_BASE_URL}/members/_search?fields=userId,email,handle,firstName,lastName&query=${query}`) + .set('accept', 'application/json') + .set('authorization', `Bearer ${token}`) + .then((res) => { + if (!_.get(res, 'body.result.success')) { + throw new Error(`Failed to get users by id: ${ids}`); + } + + const users = _.get(res, 'body.result.content'); + return users; + }).catch((err) => { + const errorDetails = _.get(err, 'response.body.result.content.message'); + throw new Error( + `Failed to get users by ids: ${ids}.` + + (errorDetails ? ' Server response: ' + errorDetails : '') + ); + }); + }) + .catch((err) => { + err.message = 'Error generating m2m token: ' + err.message; + throw err; }); }; @@ -97,24 +108,32 @@ const getUsersById = (ids) => { */ const getUsersByHandle = (handles) => { const query = _.map(handles, (handle) => 'handle:' + handle).join(' OR '); - return request - .get(`${config.TC_API_V3_BASE_URL}/members/_search?fields=userId,handle,firstName,lastName&query=${query}`) - .set('accept', 'application/json') - .set('authorization', `Bearer ${config.TC_ADMIN_TOKEN}`) - .then((res) => { - if (!_.get(res, 'body.result.success')) { - throw new Error(`Failed to get users by handle: ${handles}`); - } + return m2m.getMachineToken(config.AUTH0_CLIENT_ID, config.AUTH0_CLIENT_SECRET) + .then((token) => { + if (!token && config.TC_ADMIN_TOKEN) token = config.TC_ADMIN_TOKEN; - const users = _.get(res, 'body.result.content'); + return request + .get(`${config.TC_API_V3_BASE_URL}/members/_search?fields=userId,handle,firstName,lastName&query=${query}`) + .set('accept', 'application/json') + .set('authorization', `Bearer ${token}`) + .then((res) => { + if (!_.get(res, 'body.result.success')) { + throw new Error(`Failed to get users by handle: ${handles}`); + } + const users = _.get(res, 'body.result.content'); - return users; - }).catch((err) => { - const errorDetails = _.get(err, 'response.body.result.content.message'); - throw new Error( - `Failed to get users by handles: ${handles}.` + - (errorDetails ? ' Server response: ' + errorDetails : '') - ); + return users; + }).catch((err) => { + const errorDetails = _.get(err, 'response.body.result.content.message'); + throw new Error( + `Failed to get users by handles: ${handles}.` + + (errorDetails ? ' Server response: ' + errorDetails : '') + ); + }); + }) + .catch((err) => { + err.message = 'Error generating m2m token: ' + err.message; + throw err; }); }; diff --git a/deploy.sh b/deploy.sh index cfb915e..63c5aa4 100755 --- a/deploy.sh +++ b/deploy.sh @@ -71,6 +71,12 @@ AWS_ECS_CONTAINER_NAME=$(eval "echo \$${ENV}_AWS_ECS_CONTAINER_NAME") API_CONTEXT_PATH=$(eval "echo \$${ENV}_API_CONTEXT_PATH") +AUTH0_URL=$(eval "echo \$${ENV}_AUTH0_URL") +AUTH0_AUDIENCE=$(eval "echo \$${ENV}_AUTH0_AUDIENCE") +TOKEN_CACHE_TIME=$(eval "echo \$${ENV}_TOKEN_CACHE_TIME") +AUTH0_CLIENT_ID=$(eval "echo \$${ENV}_AUTH0_CLIENT_ID") +AUTH0_CLIENT_SECRET=$(eval "echo \$${ENV}_AUTH0_CLIENT_SECRET") + echo $APP_NAME configure_aws_cli() { @@ -111,141 +117,161 @@ deploy_cluster() { make_task_def(){ task_template='[ - { - "name": "%s", - "image": "%s.dkr.ecr.%s.amazonaws.com/%s:%s", - "essential": true, - "memory": 500, - "cpu": 100, - "environment": [ - { - "name": "ENV", - "value": "%s" - }, - { - "name": "KAFKA_CLIENT_CERT", - "value": "%s" - }, - { - "name": "KAFKA_CLIENT_CERT_KEY", - "value": "%s" - }, - { - "name": "KAFKA_GROUP_ID", - "value": "%s" - }, - { - "name": "KAFKA_TOPIC_IGNORE_PREFIX", - "value": "%s" - }, - { - "name": "KAFKA_URL", - "value": "%s" - }, - { - "name": "DATABASE_URL", - "value": "%s" - }, - { - "name": "authSecret", - "value": "%s" - }, - { - "name": "authDomain", - "value": "%s" - }, - { - "name": "jwksUri", - "value": "%s" - }, - { - "name": "TC_API_BASE_URL", - "value": "%s" - }, - { - "name": "TC_API_V3_BASE_URL", - "value": "%s" - }, - { - "name": "TC_API_V4_BASE_URL", - "value": "%s" - }, - { - "name": "TC_API_V5_BASE_URL", - "value": "%s" - }, - { - "name": "MESSAGE_API_BASE_URL", - "value": "%s" - }, - { - "name": "TC_ADMIN_TOKEN", - "value": "%s" - }, - { - "name": "ENABLE_EMAILS", - "value": "%s" - }, - { - "name": "MENTION_EMAIL", - "value": "%s" - }, - { - "name": "REPLY_EMAIL_PREFIX", - "value": "%s" - }, - { - "name": "REPLY_EMAIL_DOMAIN", - "value": "%s" - }, - { - "name": "ENABLE_DEV_MODE", - "value": "%s" - }, - { - "name": "DEV_MODE_EMAIL", - "value": "%s" - }, - { - "name": "BUS_API_AUTH_TOKEN", - "value": "%s" - }, - { - "name": "LOG_LEVEL", - "value": "%s" - }, - { - "name": "validIssuers", - "value": "%s" - }, - { - "name": "PORT", - "value": "%s" - }, - { - "name": "API_CONTEXT_PATH", - "value": "%s" - } - ], - "portMappings": [ - { - "hostPort": 0, - "containerPort": 4000, - "protocol": "tcp" - } - ], - "logConfiguration": { - "logDriver": "awslogs", - "options": { - "awslogs-group": "/aws/ecs/%s", - "awslogs-region": "%s", - "awslogs-stream-prefix": "%s_%s" - } - } - } - ]' + { + "name": "%s", + "image": "%s.dkr.ecr.%s.amazonaws.com/%s:%s", + "essential": true, + "memory": 500, + "cpu": 100, + "environment": [ + { + "name": "ENV", + "value": "%s" + }, + { + "name": "KAFKA_CLIENT_CERT", + "value": "%s" + }, + { + "name": "KAFKA_CLIENT_CERT_KEY", + "value": "%s" + }, + { + "name": "KAFKA_GROUP_ID", + "value": "%s" + }, + { + "name": "KAFKA_TOPIC_IGNORE_PREFIX", + "value": "%s" + }, + { + "name": "KAFKA_URL", + "value": "%s" + }, + { + "name": "DATABASE_URL", + "value": "%s" + }, + { + "name": "authSecret", + "value": "%s" + }, + { + "name": "authDomain", + "value": "%s" + }, + { + "name": "jwksUri", + "value": "%s" + }, + { + "name": "TC_API_BASE_URL", + "value": "%s" + }, + { + "name": "TC_API_V3_BASE_URL", + "value": "%s" + }, + { + "name": "TC_API_V4_BASE_URL", + "value": "%s" + }, + { + "name": "TC_API_V5_BASE_URL", + "value": "%s" + }, + { + "name": "MESSAGE_API_BASE_URL", + "value": "%s" + }, + { + "name": "TC_ADMIN_TOKEN", + "value": "%s" + }, + { + "name": "ENABLE_EMAILS", + "value": "%s" + }, + { + "name": "MENTION_EMAIL", + "value": "%s" + }, + { + "name": "REPLY_EMAIL_PREFIX", + "value": "%s" + }, + { + "name": "REPLY_EMAIL_DOMAIN", + "value": "%s" + }, + { + "name": "ENABLE_DEV_MODE", + "value": "%s" + }, + { + "name": "DEV_MODE_EMAIL", + "value": "%s" + }, + { + "name": "BUS_API_AUTH_TOKEN", + "value": "%s" + }, + { + "name": "LOG_LEVEL", + "value": "%s" + }, + { + "name": "validIssuers", + "value": "%s" + }, + { + "name": "PORT", + "value": "%s" + }, + { + "name": "API_CONTEXT_PATH", + "value": "%s" + }, + { + "name": "AUTH0_URL", + "value": "%s" + }, + { + "name": "AUTH0_AUDIENCE", + "value": "%s" + }, + { + "name": "AUTH0_CLIENT_ID", + "value": "%s" + }, + { + "name": "AUTH0_CLIENT_SECRET", + "value": "%s" + }, + { + "name": "TOKEN_CACHE_TIME", + "value": "%s" + } + ], + "portMappings": [ + { + "hostPort": 0, + "containerPort": 4000, + "protocol": "tcp" + } + ], + "logConfiguration": { + "logDriver": "awslogs", + "options": { + "awslogs-group": "/aws/ecs/%s", + "awslogs-region": "%s", + "awslogs-stream-prefix": "%s_%s" + } + } + } +]' - task_def=$(printf "$task_template" $AWS_ECS_CONTAINER_NAME $AWS_ACCOUNT_ID $AWS_REGION $AWS_REPOSITORY $TAG $ENV "$KAFKA_CLIENT_CERT" "$KAFKA_CLIENT_CERT_KEY" $KAFKA_GROUP_ID "$KAFKA_TOPIC_IGNORE_PREFIX" $KAFKA_URL $DATABASE_URL $AUTHSECRET "$AUTHDOMAIN" "$JWKSURI" $TC_API_BASE_URL $TC_API_V3_BASE_URL $TC_API_V4_BASE_URL $TC_API_V5_BASE_URL $MESSAGE_API_BASE_URL $TC_ADMIN_TOKEN $ENABLE_EMAILS $MENTION_EMAIL $REPLY_EMAIL_PREFIX $REPLY_EMAIL_DOMAIN $ENABLE_DEV_MODE $DEV_MODE_EMAIL $BUS_API_AUTH_TOKEN $LOG_LEVEL $VALID_ISSUERS $PORT "$API_CONTEXT_PATH" $AWS_ECS_CLUSTER $AWS_REGION $AWS_ECS_CLUSTER $ENV) + task_def=$(printf "$task_template" $AWS_ECS_CONTAINER_NAME $AWS_ACCOUNT_ID $AWS_REGION $AWS_REPOSITORY $TAG $ENV "$KAFKA_CLIENT_CERT" "$KAFKA_CLIENT_CERT_KEY" $KAFKA_GROUP_ID "$KAFKA_TOPIC_IGNORE_PREFIX" $KAFKA_URL $DATABASE_URL $AUTHSECRET "$AUTHDOMAIN" "$JWKSURI" $TC_API_BASE_URL $TC_API_V3_BASE_URL $TC_API_V4_BASE_URL $TC_API_V5_BASE_URL $MESSAGE_API_BASE_URL $TC_ADMIN_TOKEN $ENABLE_EMAILS $MENTION_EMAIL $REPLY_EMAIL_PREFIX $REPLY_EMAIL_DOMAIN $ENABLE_DEV_MODE $DEV_MODE_EMAIL $BUS_API_AUTH_TOKEN $LOG_LEVEL $VALID_ISSUERS $PORT "$API_CONTEXT_PATH" "$AUTH0_URL" "$AUTH0_AUDIENCE" $AUTH0_CLIENT_ID "$AUTH0_CLIENT_SECRET" $TOKEN_CACHE_TIME $AWS_ECS_CLUSTER $AWS_REGION $AWS_ECS_CLUSTER $ENV) } register_definition() { diff --git a/package-lock.json b/package-lock.json index c2347ab..f728156 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,12 +10,20 @@ "integrity": "sha1-JjNHCk6r6aR82aRf2yDtX5NAe8o=" }, "@types/body-parser": { - "version": "1.16.8", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.8.tgz", - "integrity": "sha512-BdN2PXxOFnTXFcyONPW6t0fHjz2fvRZHVMFpaS0wYr+Y8fWEaNOs4V8LEu/fpzQlMx+ahdndgTaGTwPC+J/EeA==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", + "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", "requires": { - "@types/express": "4.11.1", - "@types/node": "9.6.6" + "@types/connect": "3.4.32", + "@types/node": "10.0.0" + } + }, + "@types/connect": { + "version": "3.4.32", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", + "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "requires": { + "@types/node": "10.0.0" } }, "@types/events": { @@ -28,7 +36,7 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.11.1.tgz", "integrity": "sha512-ttWle8cnPA5rAelauSWeWJimtY2RsUf2aspYZs7xPHiWgOlPn6nnUfBMtrkcnjFJuIHJF4gNOdVvpLK2Zmvh6g==", "requires": { - "@types/body-parser": "1.16.8", + "@types/body-parser": "1.17.0", "@types/express-serve-static-core": "4.11.1", "@types/serve-static": "1.13.1" } @@ -48,7 +56,7 @@ "integrity": "sha512-EehCl3tpuqiM8RUb+0255M8PhhSwTtLfmO7zBBdv0ay/VTd/zmrqDfQdZFsa5z/PVMbH2yCMZPXsnrImpATyIw==", "requires": { "@types/events": "1.2.0", - "@types/node": "9.6.6" + "@types/node": "10.0.0" } }, "@types/express-unless": { @@ -65,9 +73,9 @@ "integrity": "sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==" }, "@types/lodash": { - "version": "4.14.107", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.107.tgz", - "integrity": "sha512-afvjfP2rl3yvtv2qrCRN23zIQcDinF+munMJCoHEw2BXF22QJogTlVfNPTACQ6ieDyA6VnyKT4WLuN/wK368ng==" + "version": "4.14.108", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.108.tgz", + "integrity": "sha512-WD2vUOKfBBVHxWUV9iMR9RMfpuf8HquxWeAq2yqGVL7Nc4JW2+sQama0pREMqzNI3Tutj0PyxYUJwuoxxvX+xA==" }, "@types/mime": { "version": "2.0.0", @@ -75,9 +83,9 @@ "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" }, "@types/node": { - "version": "9.6.6", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.6.tgz", - "integrity": "sha512-SJe0g5cZeGNDP5sD8mIX3scb+eq8LQQZ60FXiKZHipYSeEFZ5EKml+NNMiO76F74TY4PoMWlNxF/YRY40FOvZQ==" + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.0.0.tgz", + "integrity": "sha512-kctoM36XiNZT86a7tPsUje+Q/yl+dqELjtYApi0T5eOQ90Elhu0MI10rmYk44yEP4v1jdDvtjQ9DFtpRtHf2Bw==" }, "@types/serve-static": { "version": "1.13.1", @@ -156,12 +164,12 @@ "dev": true }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", "requires": { - "sprintf-js": "1.0.3" + "underscore": "1.7.0", + "underscore.string": "2.4.0" } }, "array-flatten": { @@ -210,6 +218,25 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, + "auth0-js": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/auth0-js/-/auth0-js-9.5.0.tgz", + "integrity": "sha1-th3+hSJ8dbMb5oREvqyCbhk1vRI=", + "requires": { + "base64-js": "1.3.0", + "idtoken-verifier": "1.2.0", + "js-cookie": "2.2.0", + "qs": "6.5.1", + "superagent": "3.8.3", + "url-join": "1.1.0", + "winchan": "0.2.0" + } + }, + "autolinker": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.15.3.tgz", + "integrity": "sha1-NCQX2PLzRhsUzwkIjV7fh5HcmDI=" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -254,6 +281,11 @@ "resolved": "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz", "integrity": "sha1-eAqZyE59YAJgNhURxId2E78k9rs=" }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + }, "base64url": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", @@ -273,7 +305,7 @@ "resolved": "https://registry.npmjs.org/bin-protocol/-/bin-protocol-3.0.4.tgz", "integrity": "sha1-RlqdNQb+sOEmtStbIWDZNuFbJ/Q=", "requires": { - "lodash": "4.17.5", + "lodash": "4.17.10", "long": "3.2.0", "protocol-buffers-schema": "3.3.2" } @@ -571,6 +603,11 @@ } } }, + "crypto-js": { + "version": "3.1.9-1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", + "integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" + }, "cycle": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", @@ -647,6 +684,11 @@ "isarray": "1.0.0" } }, + "dotenv": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz", + "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==" + }, "dottie": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.0.tgz", @@ -801,7 +843,7 @@ "file-entry-cache": "1.3.1", "glob": "7.1.2", "globals": "9.18.0", - "ignore": "3.3.7", + "ignore": "3.3.8", "imurmurhash": "0.1.4", "inquirer": "0.12.0", "is-my-json-valid": "2.17.2", @@ -809,7 +851,7 @@ "js-yaml": "3.11.0", "json-stable-stringify": "1.0.1", "levn": "0.3.0", - "lodash": "4.17.5", + "lodash": "4.17.10", "mkdirp": "0.5.1", "optionator": "0.8.2", "path-is-absolute": "1.0.1", @@ -1310,10 +1352,22 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" }, + "idtoken-verifier": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/idtoken-verifier/-/idtoken-verifier-1.2.0.tgz", + "integrity": "sha512-8jmmFHwdPz8L73zGNAXHHOV9yXNC+Z0TUBN5rafpoaFaLFltlIFr1JkQa3FYAETP23eSsulVw0sBiwrE8jqbUg==", + "requires": { + "base64-js": "1.3.0", + "crypto-js": "3.1.9-1", + "jsbn": "0.1.1", + "superagent": "3.8.3", + "url-join": "1.1.0" + } + }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", + "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==", "dev": true }, "imurmurhash": { @@ -1353,7 +1407,7 @@ "cli-cursor": "1.0.2", "cli-width": "2.2.0", "figures": "1.7.0", - "lodash": "4.17.5", + "lodash": "4.17.10", "readline2": "1.0.1", "run-async": "0.1.0", "rx-lite": "3.1.2", @@ -1473,6 +1527,11 @@ "topo": "2.0.2" } }, + "js-cookie": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz", + "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=" + }, "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", @@ -1486,13 +1545,23 @@ "requires": { "argparse": "1.0.10", "esprima": "4.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + } } }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "json-schema": { "version": "0.2.3", @@ -1650,9 +1719,9 @@ "integrity": "sha1-/sfervF+fDoKVeHaBCgD4l2RdF0=" }, "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, "lodash.cond": { "version": "4.5.2", @@ -1733,7 +1802,7 @@ "integrity": "sha1-7+ZXBsyKnMZT+A8NWm6jitlQ41I=", "requires": { "lock": "0.1.4", - "lodash": "4.17.5", + "lodash": "4.17.10", "lru-cache": "4.0.2", "very-fast-args": "1.1.0" } @@ -1865,7 +1934,7 @@ "resolved": "https://registry.npmjs.org/nice-simple-logger/-/nice-simple-logger-1.0.1.tgz", "integrity": "sha1-D55khSe+e+PkmrdvqMjAmK+VG/Y=", "requires": { - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "no-kafka": { @@ -1874,7 +1943,7 @@ "integrity": "sha1-jLSk8aDVDqYUXFvAZ6A1Dl5CmMc=", "requires": { "@types/bluebird": "3.5.0", - "@types/lodash": "4.14.107", + "@types/lodash": "4.14.108", "bin-protocol": "3.0.4", "bluebird": "3.5.1", "buffer-crc32": "0.2.13", @@ -2230,6 +2299,15 @@ "backoff": "2.5.0" } }, + "remarkable": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.1.tgz", + "integrity": "sha1-qspJchALZqZCpjoQIcpLrBvjv/Y=", + "requires": { + "argparse": "0.1.16", + "autolinker": "0.15.3" + } + }, "request": { "version": "2.85.0", "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", @@ -2381,7 +2459,7 @@ "dottie": "2.0.0", "generic-pool": "3.4.2", "inflection": "1.12.0", - "lodash": "4.17.5", + "lodash": "4.17.10", "moment": "2.22.1", "moment-timezone": "0.5.16", "retry-as-promised": "2.3.2", @@ -2538,9 +2616,9 @@ "dev": true }, "superagent": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.2.tgz", - "integrity": "sha512-gVH4QfYHcY3P0f/BZzavLreHW3T1v7hG9B+hpMQotGQqurOvhv87GcMCd6LWySmBuf+BDR44TQd0aISjVHLeNQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", + "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", "requires": { "component-emitter": "1.2.1", "cookiejar": "2.1.1", @@ -2579,7 +2657,7 @@ "ajv": "4.11.8", "ajv-keywords": "1.5.1", "chalk": "1.1.3", - "lodash": "4.17.5", + "lodash": "4.17.10", "slice-ansi": "0.0.4", "string-width": "2.1.1" }, @@ -2628,15 +2706,16 @@ } }, "tc-core-library-js": { - "version": "github:appirio-tech/tc-core-library-js#eedc98867f640858fc021fd7dbaec6f7b6732051", + "version": "github:appirio-tech/tc-core-library-js#df1f5c1a5578d3d1e475bfb4a7413d9dec25525a", "requires": { + "auth0-js": "9.5.0", "axios": "0.12.0", "bunyan": "1.8.12", "config": "1.30.0", "jsonwebtoken": "7.4.3", "jwks-rsa": "1.2.1", "le_node": "1.7.1", - "lodash": "4.17.5", + "lodash": "4.17.10", "millisecond": "0.1.2" }, "dependencies": { @@ -2769,11 +2848,26 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "url-join": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", + "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=" + }, "user-home": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", @@ -2823,6 +2917,11 @@ "resolved": "https://registry.npmjs.org/very-fast-args/-/very-fast-args-1.1.0.tgz", "integrity": "sha1-4W0dH6+KbllqJGQh/ZCneWPQs5Y=" }, + "winchan": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/winchan/-/winchan-0.2.0.tgz", + "integrity": "sha1-OGMCjn+XSw2hQS8oQXukJJcqvZQ=" + }, "winston": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz", @@ -2841,7 +2940,7 @@ "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.4.4.tgz", "integrity": "sha512-eVVHka2jRaAp9QanKhLpxWs3AGDV0b8cijlavxBnn4ryXzq5N/3Xe3nkQsI0XMRA16RURwviCWuOCj4mXCmrxw==", "requires": { - "@types/node": "9.6.6" + "@types/node": "10.0.0" } }, "wordwrap": { @@ -2869,7 +2968,7 @@ "resolved": "https://registry.npmjs.org/wrr-pool/-/wrr-pool-1.1.3.tgz", "integrity": "sha1-/a0i8uofMDY//l14HPeUl6d/8H4=", "requires": { - "lodash": "4.17.5" + "lodash": "4.17.10" } }, "xtend": { diff --git a/package.json b/package.json index 7782c6e..d6a7490 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "pg": "^7.3.0", "sequelize": "^4.21.0", "superagent": "^3.8.0", - "tc-core-library-js": "appirio-tech/tc-core-library-js.git#v2.2", + "tc-core-library-js": "appirio-tech/tc-core-library-js.git#v2.3", "winston": "^2.2.0", "remarkable": "^1.7.1" }, diff --git a/src/app.js b/src/app.js index 12dc9a2..2674ce7 100644 --- a/src/app.js +++ b/src/app.js @@ -105,8 +105,8 @@ function startKafkaConsumer(handlers) { }; logger.debug('body', body); logger.debug(`body for generating token: ${JSON.stringify(body)}`); - logger.debug(`authSecret: ${config.authSecret.substring(-5)}`); - const token = jwt.sign(body, config.authSecret, { noTimestamp: true }).split('.')[2]; + logger.debug(`AUTH_SECRET: ${config.AUTH_SECRET.substring(-5)}`); + const token = jwt.sign(body, config.AUTH_SECRET, { noTimestamp: true }).split('.')[2]; logger.debug(`token: ${token}`); const replyTo = `${config.REPLY_EMAIL_PREFIX}+${topicId}/${token}@${config.REPLY_EMAIL_DOMAIN}`; diff --git a/test/token.js b/test/token.js index 25f2084..0a0c8ea 100644 --- a/test/token.js +++ b/test/token.js @@ -20,7 +20,7 @@ if (_.isNaN(userId)) { // generate JWT token const token = jwt.sign({ userId, iss: `https://api.${config.authDomain}` }, - config.authSecret, { expiresIn: '30 days' }); + config.AUTH_SECRET, { expiresIn: '30 days' }); console.info(`JWT Token: ${token}`); // eslint-disable-line no-console process.exit();