diff --git a/src/config.ts b/src/config.ts index 5aa5eaa..04c2f22 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,9 +1,11 @@ export const Config = { - LISTEN_PORT: process.env.CERC_KCUSERREG_LISTEN_PORT || 9292, + LISTEN_PORT: parseInt(process.env.CERC_KCUSERREG_LISTEN_PORT || '9292'), + LISTEN_ADDR: parseInt(process.env.CERC_KCUSERREG_LISTEN_ADDR || '0.0.0.0'), API_URL: process.env.CERC_KCUSERREG_API_URL || 'http://localhost:57198/auth', REG_USER: process.env.CERC_KCUSERREG_REG_USER || 'admin', REG_PW: process.env.CERC_KCUSERREG_REG_PW || 'admin', REG_CLIENT_ID: process.env.CERC_KCUSERREG_REG_CLIENT_ID || 'admin-cli', TARGET_REALM: process.env.CERC_KCUSERREG_TARGET_REALM || 'cerc', TARGET_GROUPS: process.env.CERC_KCUSERREG_TARGET_GROUPS?.split(',') || ['eth'], + CREATE_ENABLED: "true" === (process.env.CERC_KCUSERREG_CREATE_ENABLED || 'true') }; diff --git a/src/middleware/cors.ts b/src/middleware/cors.ts new file mode 100644 index 0000000..e141498 --- /dev/null +++ b/src/middleware/cors.ts @@ -0,0 +1,11 @@ +import {MiddlewareFunction} from 'http-request-handler'; + +import {Logger} from '../util/logger.js'; + +const log = new Logger('cerc:keycloak-userreg:mw:cors'); + +export const CorsMW: MiddlewareFunction = (request, response, data, resolve, reject) => { + response.setHeader('Access-Control-Allow-Origin', '*') + response.setHeader('Access-Control-Allow-Headers', '*') + resolve() +}; diff --git a/src/middleware/register.ts b/src/middleware/register.ts index 07e5d69..bd09abd 100644 --- a/src/middleware/register.ts +++ b/src/middleware/register.ts @@ -7,7 +7,7 @@ import {Logger} from '../util/logger.js'; const log = new Logger('cerc:keycloak-userreg:mw:register'); export const RegisterMW : MiddlewareFunction = async (request, response, data, resolve, reject) =>{ - if (!data?.json?.username) { + if (!data?.json?.email && !data?.json?.username) { log.error(data); log.error('Invalid request', request.body); reject(400); @@ -15,8 +15,9 @@ export const RegisterMW : MiddlewareFunction = async (request, response, data, r } const userRequest = { - username: data.json.username, - enabled: true, + username: data.json.username || data.json.email, + email: data.json.email, + enabled: Config.CREATE_ENABLED, groups: Config.TARGET_GROUPS, realm: Config.TARGET_REALM }; @@ -31,6 +32,7 @@ export const RegisterMW : MiddlewareFunction = async (request, response, data, r log.debug(user); response.send({ 'username': user?.username, + 'email': user?.email, 'api-key': (user?.attributes as any)['api-key'] }); resolve(); diff --git a/src/userreg.ts b/src/userreg.ts index e7b2cb9..b2def70 100644 --- a/src/userreg.ts +++ b/src/userreg.ts @@ -2,6 +2,7 @@ import * as http from 'http'; import {HttpMethod, HTTPRequestHandler} from 'http-request-handler'; import {Config} from './config.js'; +import {CorsMW} from "./middleware/cors.js"; import {JsonParserMW} from './middleware/json_parser.js'; import {RegisterMW} from './middleware/register.js'; import {Logger} from './util/logger.js'; @@ -9,9 +10,13 @@ import {Logger} from './util/logger.js'; const log = new Logger('cerc:keycloak-userreg'); const handler = new HTTPRequestHandler(); -handler.on(HttpMethod.HTTP_POST, '/register', [JsonParserMW, RegisterMW], async (request, response) => { +handler.on(HttpMethod.HTTP_OPTIONS, '/register', [CorsMW], async (request, response) => { + response.ok() +}); + +handler.on(HttpMethod.HTTP_POST, '/register', [CorsMW, JsonParserMW, RegisterMW], async (request, response) => { // If nothing has answered by now, return an error. response.error(500); }); -http.createServer(handler.getListener()).listen(Config.LISTEN_PORT); +http.createServer(handler.getListener()).listen(Config.LISTEN_PORT, '0.0.0.0');