diff --git a/.env.example b/.env.example index f3870f9..377d26c 100644 --- a/.env.example +++ b/.env.example @@ -18,7 +18,9 @@ JWT_ACCESS_KEY=change-me-access-token-secret ACCESS_TOKEN_EXPIRED_IN=1h JWT_REFRESH_KEY=change-me-refresh-token-secret REFRESH_TOKEN_EXPIRED_IN=7d -FRONTEND_URL= +FRONTEND_URL=http://localhost:5173 +COOKIE_SECURE=false +COOKIE_SAME_SITE=lax # Elasticsearch ELASTICSEARCH_URL=http://elasticsearch:9200 diff --git a/docker-compose.yml b/docker-compose.yml index 5b4ee40..a7e3f58 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,9 @@ services: JWT_REFRESH_KEY: ${JWT_REFRESH_KEY:-change-me-refresh-token-secret} ACCESS_TOKEN_EXPIRED_IN: ${ACCESS_TOKEN_EXPIRED_IN:-1h} REFRESH_TOKEN_EXPIRED_IN: ${REFRESH_TOKEN_EXPIRED_IN:-7d} - FRONTEND_URL: ${FRONTEND_URL:-} + FRONTEND_URL: ${FRONTEND_URL:-http://localhost:5173} + COOKIE_SECURE: ${COOKIE_SECURE:-false} + COOKIE_SAME_SITE: ${COOKIE_SAME_SITE:-lax} ELASTICSEARCH_URL: http://elasticsearch:9200 ELASTICSEARCH_USERNAME: ${ELASTICSEARCH_USERNAME:-elastic} ELASTICSEARCH_PASSWORD: ${ELASTICSEARCH_PASSWORD:-change_me} diff --git a/src/config/env.ts b/src/config/env.ts index 3ebda80..a919970 100644 --- a/src/config/env.ts +++ b/src/config/env.ts @@ -23,6 +23,11 @@ export default { .asString() as ms.StringValue, FRONTEND_URL: env.get('FRONTEND_URL').asString(), + COOKIE_SECURE: env.get('COOKIE_SECURE').default('false').asBoolStrict(), + COOKIE_SAME_SITE: env + .get('COOKIE_SAME_SITE') + .default('lax') + .asEnum(['strict', 'lax', 'none']) as 'strict' | 'lax' | 'none', ELASTICSEARCH_URL: env.get('ELASTICSEARCH_URL').default('http://localhost:9200').asUrlString(), ELASTICSEARCH_USERNAME: env.get('ELASTICSEARCH_USERNAME').default('elastic').asString(), diff --git a/src/modules/Auth/services/Auth.service.ts b/src/modules/Auth/services/Auth.service.ts index 2bcee1a..e6bad8c 100644 --- a/src/modules/Auth/services/Auth.service.ts +++ b/src/modules/Auth/services/Auth.service.ts @@ -25,8 +25,8 @@ export const getLoginContext = (req: Request): LoginContext => ({ export const setRefreshTokenCookie = (res: Response, refreshToken: string): void => { res.cookie('refreshToken', refreshToken, { httpOnly: true, - secure: config.NODE_ENV === 'production', - sameSite: 'strict', + secure: config.COOKIE_SECURE, + sameSite: config.COOKIE_SAME_SITE, maxAge: ms(config.REFRESH_TOKEN_EXPIRED_IN), path: '/api/v1/auth', }); @@ -35,8 +35,8 @@ export const setRefreshTokenCookie = (res: Response, refreshToken: string): void export const clearRefreshTokenCookie = (res: Response): void => { res.clearCookie('refreshToken', { httpOnly: true, - secure: config.NODE_ENV === 'production', - sameSite: 'strict', + secure: config.COOKIE_SECURE, + sameSite: config.COOKIE_SAME_SITE, path: '/api/v1/auth', }); };