Вопрос или проблема
Я пытаюсь аутентифицироваться в GitHub Container Registry (ghcr.io) через curl, и у меня не очень хорошо получается. Я знаю, что мне нужен GitHub PAT с правами package:read
, которые у меня есть, и затем я могу использовать это для генерации токена.
При получении публичного изображения я могу выполнить эту команду и получить токен без проблем, если переменные окружения $USER_NAME
и $IMAGE
установлены на правильные значения.
curl -v "https://ghcr.io/token?service=ghcr.io&scope=repository:$USER_NAME/$IMAGE:pull"
Но когда я пытаюсь сделать то же самое для приватного изображения.
curl -v -H "Authorization: Bearer $GITHUB_TOKEN" "https://ghcr.io/token?service=ghcr.io&scope=repository:$USER_NAME/$IMAGE:pull"
Я получаю
< HTTP/2 401
< content-type: application/json
< docker-distribution-api-version: registry/2.0
< www-authenticate: Bearer realm="https://ghcr.io/token",service="ghcr.io",scope="repository:user/image:pull"
< date: Fri, 08 Nov 2024 00:36:26 GMT
< content-length: 73
< x-github-request-id: C559:34E8D2:158A23A:18442CA:672D5D0A
<
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required"}]}
* Подключение #0 к хосту ghcr.io осталось нетронутым
Я даже пытался дать PAT все разрешения в своей учетной записи. Я вижу в выводе curl, что PAT выводится правильно.
Оказывается, что ghcr.io использует базовую аутентификацию в формате <username>:<PAT>
Поэтому это будет выглядеть примерно так.
curl -H "Authorization: Basic $BASE64_CREDENTIALS" "https://ghcr.io/token?service=ghcr.io&scope=repository:<user>/<image>:pull"
{"token":"xyz"}
Ответ или решение
Как получить токен API для GitHub Container Registry
При работе с GitHub Container Registry (ghcr.io) для аутентификации и получения временного токена вам потребуется следовать определённой последовательности действий. В этой статье подробно обсуждается процесс получения токена, необходимого для доступа к закрытым образам.
Шаг 1: Создание персонального токена доступа (PAT)
Для начала вам нужно создать персональный токен доступа (PAT) с соответствующими правами. Ниже приведены шаги по созданию PAT с правами package:read
и другими необходимыми правами, если хотите:
- Перейдите в настройки вашего GitHub-аккаунта.
- В разделе "Developer settings" (Настройки разработчика) выберите "Personal access tokens" (Персональные токены доступа).
- Нажмите на кнопку "Generate new token" (Создать новый токен).
- Укажите название токена и установите срок действия.
- Убедитесь, что вы выбрали разрешения, в частности:
package:read
— для чтения пакетов.
Сохраните полученный токен, так как он будет использоваться в дальнейшем.
Шаг 2: Кодирование учетных данных
Чтобы использовать ваш персональный токен доступа для аутентификации, вам нужно закодировать учетные данные в формате Base64. Формат должен выглядеть следующим образом: <username>:<PAT>
.
Например, используя команду в терминале:
echo -n "$GITHUB_USERNAME:$GITHUB_TOKEN" | base64
Где:
$GITHUB_USERNAME
— ваше имя пользователя GitHub.$GITHUB_TOKEN
— ваш персональный токен доступа.
Результатом выполнения этой команды будет строка, которую вы будете использовать в следующем шаге.
Шаг 3: Запрос токена для доступа к образу
Теперь вы можете выполнить запрос к GitHub Container Registry для получения токена. Используя команду curl
, вам нужно передать заголовок Authorization
с вашим закодированным токеном. Пример команды:
curl -H "Authorization: Basic $BASE64_CREDENTIALS" "https://ghcr.io/token?service=ghcr.io&scope=repository:$USER_NAME/$IMAGE:pull"
Где:
$BASE64_CREDENTIALS
— результат кодирования учетных данных в Base64.$USER_NAME
— ваше имя пользователя GitHub.$IMAGE
— имя вашего образа.
Шаг 4: Обработка ответа
Если все выполнено корректно, вы получите ответ, содержащий токен, который вы сможете использовать для аутентификации и получения доступ к закрытым образам в GitHub Container Registry. Пример успешного ответа выглядит так:
{"token":"xyz"}
Заключение
В результате выполнения всех вышеописанных шагов вы сможете успешно аутентифицироваться в GitHub Container Registry и получать токены для доступа к приватным изображениям. Этот процесс может показаться сложным, однако, следуя этому алгоритму, вы сможете избежать большинства распространённых ошибок и неудач, которые возникают при работе с API GitHub. Не забывайте бережно относиться к вашему токену доступа и никогда не делитесь им с третьими лицами.