You need to enable JavaScript to run this app. 如何获取调用本地部署API的客户端IP或域名以实现逻辑判断?
优惠活动
大模型
产品
解决方案
定价
更多

如何获取调用本地部署API的客户端IP或域名以实现逻辑判断?

实现说明

该需求完全可行,基于你当前使用的FastAPI框架,不需要引入额外第三方依赖,通过框架内置的请求上下文对象,就可以稳定获取所有需要的请求来源信息,实现来源识别和分支逻辑判断。

可获取的请求来源信息维度

你可以直接从请求对象中拿到三类核心的来源标识:

  • 调用方IP地址:直连场景下可直接获取客户端真实IP,反向代理部署场景下可从指定请求头解析真实访问IP
  • 调用来源域名/跳转来源:从请求头的Referer字段提取,可识别调用方从哪个外部域名页面发起的请求
  • 当前接口的完整访问URL:直接通过请求对象的内置属性获取,包含协议、域名、路径、查询参数全量信息

基础实现示例

首先需要修改原有代码的函数定义,将FastAPI的Request对象作为参数注入,框架会自动为每个请求传递对应的上下文信息,完整可运行的逻辑参考如下:

from fastapi import FastAPI, Request

app = FastAPI()

# 预先配置需要执行专属操作的来源白名单
SPECIAL_TREATMENT_IPS = ["192.168.3.15", "114.114.114.114"]
SPECIAL_TREATMENT_DOMAINS = ["https://your-trusted-domain.com", "https://partner.example.cn"]

@app.post("/test/api")
async def handle_api(request: Request):
    # 1. 获取调用方IP
    # 直连场景下直接取客户端IP
    direct_client_ip = request.client.host
    # 如果服务前挂了Nginx/CDN等反向代理,优先从转发头取真实IP
    real_client_ip = request.headers.get(
        "X-Forwarded-For", direct_client_ip
    ).split(",")[0].strip()

    # 2. 获取调用来源域名
    request_referer = request.headers.get("Referer", "")
    # 从Referer字符串中提取纯域名部分,避免路径、参数干扰匹配
    referer_domain = ""
    if request_referer:
        url_parts = request_referer.split("/")
        if len(url_parts) >= 3:
            referer_domain = f"{url_parts[0]}//{url_parts[2]}"

    # 3. 匹配特殊来源规则,执行分支逻辑
    need_special_operation = (
        real_client_ip in SPECIAL_TREATMENT_IPS
        or referer_domain in SPECIAL_TREATMENT_DOMAINS
    )

    if need_special_operation:
        # 执行预先定义的专属操作
        pass
    else:
        # 跳过专属操作
        pass

    # 原有正常接口返回逻辑
    return {"code": 0, "msg": "success"}

落地注意事项

  • 反向代理部署场景一定要确认IP获取逻辑,否则直接拿到的客户端IP实际是代理服务器的IP,会导致来源匹配失效
  • Referer字段受浏览器安全策略影响,部分端到端加密、跨域请求场景下不会携带该字段,如果对来源识别稳定性要求高,可以要求可信调用方在请求中携带自定义的来源标识头,比默认的Referer更可靠
  • 请求头内容是可被客户端伪造的,如果专属操作涉及高权限逻辑,不能仅依靠来源识别做判断,需要搭配对应的身份鉴权逻辑
  • 白名单配置建议独立存储在配置文件或配置中心,调整规则不需要修改核心接口代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 02:06:07