如何获取调用本地部署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
相关产品推荐
相关产品推荐

