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

'{"token":"${oidc_token}"}' => "{\"token\":\"${oidc_token}\"}"
Azeem 29.04.2023 18:53

Переменные оболочки не будут раскрываться в одинарных кавычках. Внутри двойных кавычек необходимо экранировать вложенные двойные кавычки JSON.

Azeem 29.04.2023 18:57

Хорошо, это изменило сообщение об ошибке :-). Это снег

tschm 30.04.2023 01:50

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

tschm 30.04.2023 01:50

Хорошо, проблема в том, что я поместил ${ocid_token} в двойные кавычки, хотя он уже указан в двойных кавычках. Как только они удалены, он начинает работать. Я обновлю официальную документацию

tschm 30.04.2023 02:00

Вместо этого используйте необработанный вывод -r с jq, то есть oidc_token=$(jq -r '.value' <<< "${resp}").

Azeem 30.04.2023 07:53

А еще лучше пусть jq сделает все, т.е. json_data=$(jq -c '{"token": "\(.value)"} | @json' <<< "${resp}"). Нет необходимости экранировать его вручную. Сейчас уже убежал.

Azeem 30.04.2023 08:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Другие вопросы по теме