# ============================================================
# Nginx 外部认证子请求配置示例 (auth_request)
# ============================================================
#
# 功能说明:
# - 将认证委托给外部服务
# - 支持子请求模式
# - 可转发请求头到认证服务
#
# Lolly 对应配置:
# server:
#   security:
#     auth_request:
#       enabled: true
#       uri: "/auth/validate"  # 认证服务地址
#       method: "GET"
#       auth_timeout: 5s
#       headers:
#         X-Original-Uri: "$request_uri"
#         X-Original-Method: "$request_method"
#       forward_headers: ["Cookie", "Authorization", "X-Forwarded-For"]
# ============================================================

# auth_request 模块示例
http {
    server {
        listen 80;
        server_name auth-request.example.com;

        # 外部认证配置
        # Lolly 对应: security.auth_request 配置块

        location /api {
            # 发送子请求到认证服务
            # Lolly 对应: uri: "/auth/validate"
            auth_request /auth/validate;

            # 认证超时
            # Lolly 对应: auth_timeout: 5s
            auth_request_timeout 5s;

            # 设置子请求头（传递给认证服务）
            # Lolly 对应: headers 配置
            auth_request_set $auth_user $upstream_http_x_auth_user;
            auth_request_set $auth_role $upstream_http_x_auth_role;

            # 认证成功后继续处理
            proxy_pass http://backend:8080;

            # 将认证结果传递给后端
            proxy_set_header X-Auth-User $auth_user;
            proxy_set_header X-Auth-Role $auth_role;
        }

        # 认证服务端点
        location = /auth/validate {
            internal;  # 仅允许内部调用

            # 转发原始请求头到认证服务
            proxy_pass http://auth-service:8080/validate;
            proxy_pass_request_body off;  # 不转发请求体
            proxy_set_header Content-Length "";
            proxy_set_header X-Original-URI $request_uri;
            proxy_set_header X-Original-Method $request_method;
            proxy_set_header X-Original-Host $host;

            # 转发认证相关头
            # Lolly 对应: forward_headers
            proxy_set_header Cookie $http_cookie;
            proxy_set_header Authorization $http_authorization;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

        # 认证失败处理
        error_page 401 = @auth_error;
        error_page 403 = @auth_error;

        location @auth_error {
            default_type application/json;
            return 401 '{"error": "Authentication failed", "message": "Please login first"}';
        }
    }
}

# OAuth2/OIDC 认证代理示例
http {
    server {
        listen 443 ssl;
        server_name oauth.example.com;

        ssl_certificate /etc/nginx/ssl/server.crt;
        ssl_certificate_key /etc/nginx/ssl/server.key;

        # OAuth2 introspection 认证
        location /api {
            auth_request /oauth/introspect;
            auth_request_timeout 5s;

            # 从认证响应获取用户信息
            auth_request_set $auth_user $upstream_http_x_auth_user;
            auth_request_set $auth_scopes $upstream_http_x_auth_scopes;

            proxy_pass http://backend:8080;
            proxy_set_header X-Auth-User $auth_user;
        }

        # OAuth2 introspection 端点
        location = /oauth/introspect {
            internal;

            proxy_pass http://oauth-server:8080/introspect;
            proxy_pass_request_body off;
            proxy_set_header Content-Length "";
            proxy_set_header Authorization "Bearer $http_authorization";
            proxy_set_header X-Token $http_authorization;
        }
    }
}

# auth_request 说明:
#
# 1. 工作流程:
#    a. 客户端请求 /api/resource
#    b. nginx 发送子请求到 /auth/validate
#    c. 认证服务返回 200（成功）或 401/403（失败）
#    d. 认证成功：继续处理原始请求
#    e. 认证失败：返回错误响应
#
# 2. 子请求特性:
#    - internal: 仅允许 nginx 内部调用
#    - 不转发请求体：节省资源
#    - 可设置自定义头
#
# 3. 认证响应头:
#    - 认证服务可通过响应头返回用户信息
#    - 使用 auth_request_set 捕获响应头
#    - 可传递给后端服务
#
# 4. 适用场景:
#    - OAuth2/OIDC 验证
#    - JWT 验证
#    - 自定义认证逻辑
#    - 权限检查
#
# 5. Lolly 支持:
#    - auth_request 模块实现
#    - 支持相对路径和完整 URL
#    - 自动转发常用认证头
#    - 支持自定义请求头