如何单条命令完成Keycloak token获取并传入后续curl请求header?
解决方案
问题根因
你原有写法不生效的原因是:curl的@-语法仅支持读取请求体内容,不支持动态填充请求头的取值。
方案1:命令替换(最简洁的单命令实现)
直接将获取token的逻辑用$()包裹,作为字符串嵌入到第二个curl的请求头配置中,代码如下:
curl \ -X GET \ -H "Accept: application/json" \ -H "Authorization: Bearer $(curl -X POST \ -d 'client_id=app' \ -d 'username=username' \ -d 'password=password' \ -d 'grant_type=password' \ -d "client_secret=$APP_SECRET" \ 'http://localhost:9000/auth/realms/realm/protocol/openid-connect/token' \ | jq -r '.access_token')" \ -u "username:password" \ "http://localhost:8080/app/api/"
方案2:xargs管道传递(和原写法逻辑最接近)
如果不想嵌套curl命令,可以用xargs接收管道输出的token,替换到指定位置,代码如下:
curl \ -X POST \ -d 'client_id=app' \ -d 'username=username' \ -d 'password=password' \ -d 'grant_type=password' \ -d "client_secret=$APP_SECRET" \ 'http://localhost:9000/auth/realms/realm/protocol/openid-connect/token' \ | jq -r '.access_token' \ | xargs -I % curl \ -X GET \ -H "Accept: application/json" \ -H "Authorization: Bearer %" \ -u "username:password" \ "http://localhost:8080/app/api/"
其中xargs -I %的作用是将标准输入读到的token值,替换后续命令中所有%的位置。
调试小提示
如果执行异常,可以先单独运行获取token的命令curl [参数] | jq -r '.access_token',确认输出的是纯token字符串、没有多余的日志或换行符。
内容的提问来源于stack exchange,提问作者sesodesa
相关产品推荐
相关产品推荐

