Обмен ключами для надежной публикации на pypi?

Недавно доверенная публикация попала в 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 я определил доверенного издателя для этого конкретного проекта.


53
1

Ответ:

Решено

В '{"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.