Недавно доверенная публикация попала в pypi.
Это своего рода обмен ключами без явного секрета от Github. Я изо всех сил пытаюсь вернуть api_token от pypi.
# retrieve the ambient OIDC token
resp=$(curl -H "Authorization: bearer $ACTIONS_ID_TOKEN_REQUEST_TOKEN" \
"$ACTIONS_ID_TOKEN_REQUEST_URL&audience=pypi")
echo "RESP ${resp}"
oidc_token=$(jq '.value' <<< "${resp}")
echo "OIDC ${oidc_token}"
# exchange the OIDC token for an API token
resp=$(curl -X POST https://pypi.org/_/oidc/github/mint-token -d '{"token":"${oidc_token}"}')
echo "RESP ${resp}"
api_token=$(jq '.token' <<< "${resp}")
echo "api_token ${api_token}"
В настоящее время я получаю сообщение о том, что служба недоступна (503). Я предпринял многочисленные попытки в https://github.com/tschm/pyhrp. Я подозреваю, что делаю какую-то глупость с запросом POST.
В pypi я определил доверенного издателя для этого конкретного проекта.
Переменные оболочки не будут раскрываться в одинарных кавычках. Внутри двойных кавычек необходимо экранировать вложенные двойные кавычки JSON.
Хорошо, это изменило сообщение об ошибке :-). Это снег
RESP {"errors":[{"code":"invalid-payload","description":"1 ошибка проверки для TokenPayload\n__root__\n Ожидается разделитель ',': строка 1, столбец 12 (char 11) (type=value_error .jsondecode; msg=Ожидается разделитель ','; doc = {\"token\":\"\"***"\"}; pos=11; lineno=1; colno=12)"}],"сообщение ":"Запрос токена не удался"} 94 api_token null
Хорошо, проблема в том, что я поместил ${ocid_token} в двойные кавычки, хотя он уже указан в двойных кавычках. Как только они удалены, он начинает работать. Я обновлю официальную документацию
Вместо этого используйте необработанный вывод -r
с jq
, то есть oidc_token=$(jq -r '.value' <<< "${resp}")
.
А еще лучше пусть jq
сделает все, т.е. json_data=$(jq -c '{"token": "\(.value)"} | @json' <<< "${resp}")
. Нет необходимости экранировать его вручную. Сейчас уже убежал.
В '{"token":"${oidc_token}"}'
переменная oidc_token
не будет расширяться, поскольку переменные оболочки не расширяются, если они заключены в одинарные кавычки.
Таким образом, использование двойных кавычек и экранирование вложенных двойных кавычек должно исправить это.
Изменять
'{"token":"${oidc_token}"}'
к
"{\"token\":\"${oidc_token}\"}"
и это должно работать.
Кроме этого здесь:
oidc_token=$(jq '.value' <<< "${resp}")
При отсутствии необработанного флага вывода -r
вывод будет заключен в двойные кавычки, т. е. "token"
.
Чтобы исправить это, используйте -r
:
oidc_token=$(jq -r '.value' <<< "${resp}")
oidc_token
теперь не будет окружать двойные кавычки, т.е. token
.
А еще лучше, вы можете позволить jq
сделать все за вас, то есть создать JSON с токеном и также экранировать:
json_data=$(jq -c '{"token": "\(.value)"} | @json' <<< "${resp}")
json_data
теперь будет:
"{\"token\":\"token\"}"
Вы можете напрямую использовать его в своем POST-запросе с флагом -d
.
'{"token":"${oidc_token}"}'
=>"{\"token\":\"${oidc_token}\"}"