将 stdin 管道传输到 cURL header

Piping stdin to a cURL header

我正在尝试从 Keycloak 端点读取获取身份验证令牌并使用它来访问另一个资源。获得令牌不是问题,但在另一个请求的 header 中传递它被证明是不可能的壮举,至少在一个命令中是这样:

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' \
| \
curl \
    -X GET \
    -H "Accept: application/json" \
    -H "Authorization: Bearer @-" \ # <- read header value from stdin
    -u "username:password" \
    "http://localhost:8080/app/api/"

实现此目标的替代方法是什么?

与其创建一个 复杂的 命令,不如将其拆分为 2 个操作:

  1. Save the token to a variable
  2. Pass the variable to the header

# Get token
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')

# Send request
curl \
    -X GET \
    -H "Accept: application/json" \
    -H "Authorization: Bearer $token" \
    -u "username:password" \
    "http://localhost:8080/app/api/"

另一个答案提供了更好的解决方案,但这个 post 回答了所问的字面问题。

您可以使用以下内容:

"Authorization: Bearer $( cat )"

演示:

$ echo foo | printf "%s\n" "Authorization: Bearer $( cat )"
Authorization: Bearer foo

事实上,您可以将整个令牌获取代码放在 $().

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/"

演示:

$ printf "%s\n" "Authorization: Bearer $( echo foo )"
Authorization: Bearer foo

同样,我认为这些不如@0stone0 提供的更清晰的解决方案。我 post 出于教育目的使用它们。