将 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 个操作:
- Save the token to a variable
- 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 出于教育目的使用它们。
我正在尝试从 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 个操作:
- Save the token to a variable
- 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 出于教育目的使用它们。