【问题标题】:Parse access-token using jq [duplicate]使用 jq 解析访问令牌 [重复]
【发布时间】:2020-12-16 01:56:07
【问题描述】:

下面是我用来解析来自我的 OAuth 提供者的 json 响应的 bash 脚本。我的意图是仅从 json 响应中提取 access-token

CLIENT_ID=MASKED
CLIENT_SECRET=MASKED
RESOURCE=MASKED

TOKEN_JSON_RESPONSE=$(
    curl https://corp.company.com/adfs/oauth2/token/ -H 'Accept: application/json' -H 'Content-Type: application/x-www-form-urlencoded' -d 'client_id='$CLIENT_ID'&client_secret='$CLIENT_SECRET'&grant_type=client_credentials&resource='$RESOURCE
)

echo 'The token response is ' $TOKEN_JSON_RESPONSE

echo ' @@@@@@@@@@@@@@@@@  '

ACCESS_TOKEN=$TOKEN_JSON_RESPONSE | jq '.access_token'

echo 'The access token is '$ACCESS_TOKEN

我得到了正确的 JSON 响应,下面是那个

{
   "access_token":"eyJxxxxxxxx",
   "token_type":"bearer",
   "expires_in":3600
}

我只需要提取access_token 中的值。目前在上面的脚本中,使用 jq-parser 后我得到一个空字符串

更新:

当我直接以这种方式打印时,它可以工作echo $TOKEN_JSON_RESPONSE|jq '.access_token’

而当我把它放在一个变量中时它不起作用

ACCESS_TOKEN=$TOKEN_JSON_RESPONSE|jq '.access_token’ echo $ACCESS_TOKEN

【问题讨论】:

  • 这条线ACCESS_TOKEN=$TOKEN_JSON_RESPONSE | jq ...应该做什么?
  • 这一行应该在一个变量中单独捕获访问令牌,我将在对我的应用程序进行 API 调用时进一步重用这个变量.. 将附加这个不记名令牌并进行多次调用
  • 它不是那样工作的。您需要在那里进行命令替换,例如ACCESS_TOKEN=$(jq ... <<<"$TOKEN_JSON_RESPONSE")
  • 我不相信这个问题应该作为非 jq 特定问题的副本,尤其是 stackoverflow.com/questions/4775548/… 的副本而关闭。有多种方法可以向 jq 提供数据(在模式中,通过标准输入和通过一堆不同的命令行选项),有些方法比其他方法更合适。除此之外,这个问题的关键在于将输出捕获到一个变量中,这不是链接问题的主题。

标签: bash jq


【解决方案1】:

您需要将 TOKEN_JSON_RESPONSE 值传递给 jq 标准输入。它将打印到粗壮的结果,然后将此结果保存到变量:

#!/bin/bash                                                                                                                                                                                                                                 

TOKEN_JSON_RESPONSE='                                                                                                                                                                                                                       
{                                                                                                                                                                                                                                           
   "access_token":"eyJxxxxxxxx",                                                                                                                                                                                                            
   "token_type":"bearer",                                                                                                                                                                                                                   
   "expires_in":3600                                                                                                                                                                                                                        
}'

echo 'The token response is ' $TOKEN_JSON_RESPONSE

ACCESS_TOKEN=$(echo $TOKEN_JSON_RESPONSE | jq -j '.access_token')

echo 'The access token is '$ACCESS_TOKEN

执行:

The token response is  { "access_token":"eyJxxxxxxxx", "token_type":"bearer", "expires_in":3600 }
The access token is eyJxxxxxxxx

#Update1

正如下面的 cmets 所建议的,它可以不用回显来编写:

jq -jn "$TOKEN_JSON_RESPONSE|.access_token"

【讨论】:

  • 您需要jq -jjq -r 来输出原始数据,或者您将输出作为带引号的JSON 字符串。
  • @LéaGris,谢谢,固定的,很好的方法来摆脱我不知道的答案中的引号
  • ACCESS_TOKEN=$(jq -jn "$TOKEN_JSON_RESPONSE|.access_token") 并且不需要echo ... |jq -n 用于空输入。
  • 我知道问题结束后有点晚了,但与其在其他人的控制下将任意数据插入到模式中,通常更好的做法是将其作为单独的争论。例如。 jq -jn -argjson response "$TOKEN_JSON_RESPONSE" '$response.access_token' 在这里可能没有太大关系,但是如果由于某种原因响应不是有效的 JSON,这可以避免它被解释为模式的风险。
猜你喜欢
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
  • 2011-05-13
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多