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

如何从curl返回的JSON输出中提取X-Subject-Token值?

如何从OpenStack认证请求中提取X-Subject-Token

看起来你是在对接OpenStack的Keystone认证接口对吧?这里有个关键误区需要先澄清:X-Subject-Token并不是返回在响应体的JSON数据里,而是在HTTP响应的头部字段中——这就是你用json.load(sys.stdin)['X-Subject-Token']会报错的核心原因。

下面给你几种实用的提取方法:

方法1:直接用curl+文本工具提取响应头

你可以调整curl命令,加上-i参数让curl输出响应头,再用grep和awk快速提取目标字段:

curl -s -i -X POST https://host.com:13000/v3/auth/tokens?nocatalog \
  -H "Content-Type: application/json" \
  -d '{"auth": {"identity": {"methods": ["password"],"password": {"user": {"domain": {"name": "你的域名"},"name": "你的用户名","password": "你的密码"}}}}}' \
| grep -i "X-Subject-Token" | awk '{print $2}'
  • -s:静默模式,屏蔽进度条等冗余输出
  • -i:强制curl输出HTTP响应头内容
  • grep -i "X-Subject-Token":忽略大小写匹配目标头字段所在行
  • awk '{print $2}':提取行中的第二个字段,也就是最终需要的token值

方法2:用Python脚本更优雅处理(推荐)

如果你的工作流需要用Python处理,直接用requests库发送请求会比curl+Python的组合更直观,还能直接获取响应头:

import requests

# 配置认证参数
auth_url = "https://host.com:13000/v3/auth/tokens?nocatalog"
auth_headers = {"Content-Type": "application/json"}
auth_payload = {
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "domain": {"name": "你的域名"},
                    "name": "你的用户名",
                    "password": "你的密码"
                }
            }
        }
    }
}

# 发送请求(若目标站点证书不合法,可添加verify=False,生产环境不建议)
response = requests.post(auth_url, headers=auth_headers, json=auth_payload)

# 提取并输出X-Subject-Token
subject_token = response.headers.get("X-Subject-Token")
if subject_token:
    print(f"提取到的Subject Token: {subject_token}")
else:
    print("未获取到X-Subject-Token,请检查认证参数是否正确")

补充:为什么原方法行不通?

再明确下:Keystone v3认证接口成功后,X-Subject-Token是作为响应头返回的,响应体的JSON里只有用户、项目等认证元数据,并没有这个token字段——所以直接解析JSON自然找不到对应的键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:02:25