You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Snowflake容器服务中实现UI与FastAPI的认证集成问题

问题

我尝试在Snowflake Container Services(SPCS)中部署FastAPI(后端)和React(前端)Docker容器,使用服务功能完成部署。目前UI和API均可单独正常运行(API已通过Swagger文档测试),为测试暂时在API代码中覆盖了令牌授权逻辑。但SPCS中部署的每个服务需通过Snowflake默认认证器登录,单独运行正常,当通过环境变量将UI与API集成时,出现跨域重定向错误:Cross-origin redirection to https://sfc-endpoint-login.snowflakecomputing.app/sfc-oauth-begin?xxx。

以下是相关配置代码:

前端配置

CREATE SERVICE ui_service
    IN COMPUTE POOL MYCOMPUTE_POOL
    FROM SPECIFICATION $$spec:
    container:
    - name: ui-container
      image: ui:latest
      env:
       REACT_APP_SERVER_HOST: <API_URL>
    endpoints:
    - name: "ui"
      port: 3001
      public: true
      protocol: HTTP
    $$
EXTERNAL_ACCESS_INTEGRATIONS=(NETWORK_ALLOW_INTEGRATION);

后端配置

CREATE SERVICE api
    IN COMPUTE POOL MY_COMPUTE_POOL
    FROM SPECIFICATION $$spec:
    container:
    - name: api-container
      image: api:1599-1
      env:
       AUTH_OVERRIDE: true
       CLIENT_ORIGIN: <Frontend Host>
    endpoints:
    - name: "api"
      port: 8000
      public: true
      protocol: HTTP
    networkPolicyConfig:
      allowInternetEgress: true
    $$
EXTERNAL_ACCESS_INTEGRATIONS=(NETWORK_ALLOW_INTEGRATION);

FastAPI中间件代码

fast_app_init = FastAPI(
        title="Fast API",
        version="1.0.0",
        summary="API",
        openapi_url="/api/v1/openapi.json",
        docs_url="/api/v1/docs",
        redoc_url="/api/v1/redoc",
        swagger_ui_oauth2_redirect_url="/api/v1/docs/oauth2-redirect",
        lifespan=lifespan,
    )

    allowed_origins = [
        "http://localhost:3000",
        "http://localhost:3001",
        get_config().CLIENT_ORIGIN,
    ]
    # pylint: disable=anomalous-backslash-in-string, line-too-long
    fast_app_init.add_middleware(
        CORSMiddleware,
        allow_origins=allowed_origins,
        allow_credentials=True,
        allow_methods=["*"],
        allow_headers=["*"],
    )

    fast_app_init.include_router(router, prefix="/api/v1")
解决方案

你遗漏的核心配置是SPCS服务间的认证信任、HTTPS协议匹配以及CORS重定向头部支持,具体修复点如下:

  1. 修正CORS中间件的HTTPS域名匹配与头部暴露

    • SPCS公共服务默认使用HTTPS协议,确保CLIENT_ORIGIN是完整的HTTPS域名(而非HTTP),并在CORS配置中暴露重定向所需的Location头部:
      allowed_origins = [
          "http://localhost:3000",
          "http://localhost:3001",
          get_config().CLIENT_ORIGIN.replace("http://", "https://"),  # 强制转为HTTPS格式
      ]
      
      fast_app_init.add_middleware(
          CORSMiddleware,
          allow_origins=allowed_origins,
          allow_credentials=True,
          allow_methods=["*"],
          allow_headers=["*"],
          expose_headers=["Location"],  # 让前端能获取重定向地址
      )
      
  2. 调整SPCS服务的协议与内部访问权限

    • SPCS公共端点默认使用HTTPS,将前后端服务的protocol从HTTP改为HTTPS;同时开启后端服务的internalIngressAllowed,允许同一Compute Pool内的前端服务直接访问:
      后端服务修改后的端点配置:
      endpoints:
      - name: "api"
        port: 8000
        public: true
        protocol: HTTPS
        internalIngressAllowed: true
      
      前端服务修改后的端点配置:
      endpoints:
      - name: "ui"
        port: 3001
        public: true
        protocol: HTTPS
      
  3. 前端请求配置凭证携带与自动重定向

    • React调用API时,需开启凭证携带并让浏览器自动处理Snowflake的认证重定向:
      fetch(`${process.env.REACT_APP_SERVER_HOST}/api/v1/xxx`, {
        method: 'GET',
        credentials: 'include',
        redirect: 'follow'
      })
      
  4. 确认AUTH_OVERRIDE完全绕过认证拦截

    • 检查AUTH_OVERRIDE逻辑是否彻底跳过了所有Snowflake认证中间件,避免残留的认证逻辑触发重定向。可以添加全局中间件强制跳过:
      @fast_app_init.middleware("http")
      async def skip_auth(request: Request, call_next):
          if get_config().AUTH_OVERRIDE:
              return await call_next(request)
          # 原认证逻辑
          ...
      

内容的提问来源于stack exchange,提问作者panch mukesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 03:40:10