ошибка синтаксического анализа: неверная цифра c литерал в строке 1, столбец 8 - PullRequest
0 голосов
/ 12 марта 2020

Я пытаюсь получить токен для какого-либо сайта с помощью curl. Похоже, что запрос выполнен правильно, потому что мне нужно немного подождать ответа, однако что-то происходит во время десериализации, потому что я всегда получаю ошибку: ошибка синтаксического анализа: неверное число c литерал в строке 1, столбец 8

Это как выглядит скрипт:

TOKEN=$(curl --request POST \
--url 'https://${DOMAIN_NAME}/getmy/token' \
--header 'content-type: application/json' \
--data '{"grant_type":"password", "username":"${USER_EMAIL}",
"password":"${USER_PASSWORD}",
"audience":"https://localhost:8443/my-composite-service", "scope":"openid
email test:read test:write", "client_id": "${CLIENT_ID}",
"client_secret": "${CLIENT_SECRET}"}' -s | jq -r .access_token)

Это из-за jq?

Более того, я уверен, что переменные env существуют, даже с жестко закодированными значениями будет выдана та же ошибка.

Заранее спасибо

1 Ответ

1 голос
/ 12 марта 2020

Некоторые подсказки:

  • Не помещайте все в одну строку, вместо этого сделайте его читабельным.
  • Структурируйте свой код с помощью функций.
  • Делайте обработку ошибок.
  • Используйте функции отладки Bash.
  • Не собирайте JSON с конкатенацией строк, используйте вместо этого JQ, потому что только JQ правильно цитирует данные JSON. Пароль может содержать символы кавычек.

Пример:

set -eu
set -x

USER_EMAIL="user@domain.org"
USER_PASSWORD="password"
CLIENT_ID="id"
CLIENT_SECRET="secret"
DOMAIN_NAME="domain.org"

data()
{
  local template='
{
  "grant_type":    "password",
  "username":      $username,
  "password":      $password,
  "audience":      "https://localhost:8443/my-composite-service",
  "scope":         "openid email test:read test:write",
  "client_id":     $client_id,
  "client_secret": $client_secret
}'

  if jq <<<null -c \
        --arg username      "${USER_EMAIL}" \
        --arg password      "${USER_PASSWORD}" \
        --arg client_id     "${CLIENT_ID}" \
        --arg client_secret "${CLIENT_SECRET}" \
        "$template"
  then
    return
  else
    printf "ERROR: Can not format request data." >&2
    exit 1
  fi
}

post()
{
  if curl --request POST \
          --url     'https://${DOMAIN_NAME}/getmy/token' \
          --header  'content-type: application/json' \
          --data    "$1" \
          -s
  then
    return
  else
    printf "ERROR: Can not send post request." >&2
    exit 1
  fi
}

token()
{
  if jq -r .access_token
  then
    return
  else
    printf "ERROR: Can not parse JSON response." >&2
    exit 1
  fi
}

TOKEN="$(post "$(data)" | token)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...