# 获取外网IP:登录安全与异常地域风控场景集成指南
> 接口:获取外网IP(apiCode 632,接入点 1) · 免费 · POST/GET · JSON · 适用:后端、安全工程师 · 阅读约 7 分钟
## 核心要点
- 在登录环节调用获取外网IP,用 `region`/`city`/`country` 给账号登录做地域画像与异地告警。
- 结合历史常用地,对"跨省/境外/非常用地"登录触发二次验证或人工审核。
- 用 `isp`/`country` 辅助识别出口代理与境外来源,但注意其只是参考信号,误判需可解。
## Why:登录风控为什么需要它
账号被盗最常见的信号之一,就是"平时都在云南登录,今天突然从境外上线"。如果你能拿到每次登录的公网 IP 与归属地,就能:
- 标记**异地登录**并发起二次验证;
- 对**境外 / 代理出口**登录提高风险等级;
- 为安全团队提供**可追溯的登录地理日志**。
获取外网IP 把"IP → 归属地"这一步免费封装好,你只需在登录流程里加一次调用。
## What:集成点速览
| 项 | 值 |
|----|----|
| 调用时机 | 用户登录校验成功后,异步或同步查询本次登录 IP 属地 |
| 关键字段 | `region` 省、`city` 市、`country` 国家、`en_name_short` 国家短码、`isp` 运营商 |
| 错误兜底 | `showapi_res_code != 0` 或 `ret_code != 0` 时,不阻断登录,仅记日志降级 |
| 计费 | 免费(注意档位限制,见[常见问题](https://www.showapi.com/guides/getip-faq-632)) |
## How:登录环节嵌入一次 IP 属地查询
数据表设计(登录日志):
```sql
CREATE TABLE login_log (
id BIGINT PRIMARY KEY,
user_id BIGINT,
ip VARCHAR(64),
region VARCHAR(32),
city VARCHAR(32),
country VARCHAR(32),
isp VARCHAR(32),
risk_level TINYINT, -- 0 正常 / 1 异地 / 2 高风险
created_at DATETIME
);
```
登录服务伪代码(Python):
```python
import requests
APP_KEY = "YOUR_APPKEY"
def enrich_login(user_id, client_ip):
"""查询本次登录的 IP 属地并写库;失败降级不阻断登录。"""
try:
r = requests.post(
"https://route.showapi.com/632-1",
params={"appKey": APP_KEY},
headers={"content-type": "application/x-www-form-urlencoded"},
timeout=3, # 登录链路超时从紧,避免拖慢主流程
)
data = r.json()
body = data.get("showapi_res_body", {})
region, city = body.get("region"), body.get("city")
country, isp = body.get("country"), body.get("isp")
except Exception:
region = city = country = isp = None # 降级:只记录 IP
# 异地判断:与用户历史常用省对比
usual_regions = get_usual_regions(user_id) # 业务侧维护
risk = 0
if region and usual_regions and region not in usual_regions:
risk = 1
if country and country not in ("中国", "本地局域网"):
risk = max(risk, 2) # 境外来源更高风险
save_login_log(user_id, client_ip, region, city, country, isp, risk)
if risk >= 1:
trigger_step_up_verification(user_id) # 二次验证/告警
```
调用时序:用户提交凭证 → 校验通过 → 同步/异步调用获取外网IP → 落库 + 风险判定 → 异地则二次验证。
## 返回示例与解析
```json
{
"showapi_res_code": 0,
"showapi_res_body": {
"ip": "183.225.1.165",
"region": "云南",
"city": "昆明",
"country": "中国",
"en_name_short": "CN",
"isp": "移动"
}
}
```
判定要点:`region`/`city` 用于异地对比;`country`/`en_name_short` 用于境外识别;`isp` 作为代理/数据中心出口的辅助信号(如值为云厂商名可作为加分项,但非绝对)。
## 进阶 / 边界
- **异步化**:登录是核心链路,建议把 IP 查询放消息队列异步处理,避免接口抖动拖慢登录;失败时仅记日志,不阻断用户。
- **不要唯 IP 论**:NAT、企业出口、VPN 都会让多个用户共享出口 IP 或显示为异地,务必结合设备指纹、历史行为综合判定,给误判留解(如"本次为常用设备则放行")。
- **隐私合规**:记录用户 IP 与属地需符合当地个人信息保护要求,明确告知并取得必要同意,数据最小化存储。
## FAQ
**Q:能不能只靠 IP 属地判断是不是盗号?**
A:不能。IP 属地只是信号之一,NAT/企业出口/VPN 都会造成误判。应结合设备、历史行为做综合风控,并对异地登录提供二次验证而非直接封禁。
**Q:接口慢会不会拖垮登录?**
A:建议异步调用并设短超时(如 3s),失败仅降级记日志,绝不阻断主登录流程。
**Q:为什么有时 `region` 是"本地局域网"?**
A:请求从内网/IDC 出口发出时正常现象,详见[常见问题与边界](https://www.showapi.com/guides/getip-faq-632)。
**Q:免费接口能做生产风控吗?**
A:可以,但需注意档位限制与可用性,高并发或大流量请提前评估档位并规划降级。
## 相关能力 / 下一步阅读
- [获取外网IP:返回字段全解(IP / 经纬度 / 归属地 / 运营商)](https://www.showapi.com/guides/getip-fields-632)
- [获取外网IP:用户地域分布分析怎么做(市场地域分析实战)](https://www.showapi.com/guides/getip-geo-analysis-632)
- [获取外网IP:常见问题与边界(免费档位限制 / 内网·代理 / 字段缺失)](https://www.showapi.com/guides/getip-faq-632)
- **本系列共 8 篇**:查看[获取外网IP 指南总目录](https://www.showapi.com/guides/getip-guides-632)