Files

104 lines
3.3 KiB
Lua

local _M = {}
local cjson = require "cjson"
local resolver_utils = require "utils.resolver_utils"
-- Configuration loading function that will be called by timer
function _M.load_config(premature)
if premature then
return
end
-- Use provided config file path or fallback
local config_path = os.getenv("AUTH_CONFIG_FILE") or "/app/auth_config.json"
-- Get Go Auth Service URL from environment variable
local base_auth_url = os.getenv("GO_AUTH_SERVICE_URL") or "http://auth-service:8081"
-- Try to resolve auth-service URL using custom DNS if available
local custom_dns = os.getenv("CUSTOM_DNS") or "127.0.0.11" -- Docker DNS
local resolved_url, err = resolver_utils.resolve_url_with_custom_dns(base_auth_url, custom_dns)
-- Remove trailing slash to fix proxy_pass behavior
local final_url = (resolved_url or base_auth_url):gsub("/$", "")
_M.go_auth_service_url = final_url
if resolved_url then
ngx.log(ngx.NOTICE, "auth_config: Successfully resolved auth service URL")
else
ngx.log(ngx.WARN, "auth_config: Failed to resolve auth service URL, using fallback. Error: ", err or "unknown")
end
-- Read and parse JSON config file
local config_data = _M.read_json_config(config_path)
if config_data then
-- JWT rate limiting configuration
_M.requests_per_token = config_data.requests_per_token or 100
-- JWT token expiry configuration
_M.token_expiry_minutes = config_data.token_expiry_minutes or 10
-- Log the initialized values
ngx.log(ngx.NOTICE, "auth_config: Loaded from ", config_path)
else
-- Fallback to environment variables if JSON config fails
_M.requests_per_token = 100
_M.token_expiry_minutes = 10
end
end
-- Initialize configuration using timer
function _M.init()
-- Set default values immediately to prevent race conditions
-- Remove trailing slash to fix proxy_pass behavior
local default_url = os.getenv("GO_AUTH_SERVICE_URL") or "http://auth-service:8081"
_M.go_auth_service_url = default_url:gsub("/$", "")
_M.requests_per_token = 100
_M.token_expiry_minutes = 10
-- Schedule config loading using timer
local ok, err = ngx.timer.at(0, _M.load_config)
if not ok then
ngx.log(ngx.ERR, "auth_config: Failed to create timer: ", err)
end
end
-- Read and parse JSON configuration file
function _M.read_json_config(file_path)
local file = io.open(file_path, "r")
if not file then
ngx.log(ngx.ERR, "auth_config: Could not open config file: ", file_path)
return nil
end
local content = file:read("*all")
file:close()
if not content or content == "" then
ngx.log(ngx.ERR, "auth_config: Config file is empty: ", file_path)
return nil
end
local ok, config_data = pcall(cjson.decode, content)
if not ok then
ngx.log(ngx.ERR, "auth_config: Failed to parse JSON config: ", config_data)
return nil
end
return config_data
end
-- Getter functions for clean access
function _M.get_requests_per_token()
return _M.requests_per_token
end
function _M.get_token_expiry_minutes()
return _M.token_expiry_minutes
end
function _M.get_go_auth_service_url()
return _M.go_auth_service_url
end
return _M