Учетные данные в управляемых агентах

Учетные данные — это управляемые сервером секреты, которые позволяют вашим агентам обращаться к сторонним сервисам, не допуская попадания секрета в среду агента. Вы сохраняете учетные данные один раз, обращаетесь к ним по идентификатору, а исходящий прокси-сервер разрешает и внедряет их во время запроса.

Секретные значения доступны только для записи. После сохранения они никогда не возвращаются ни одной конечной точкой, поэтому скомпрометированный агент не сможет прочитать используемые им токены.

В первую очередь учетные данные используются в списке разрешенных сетей (nodelist) в файле environment.network . Сначала сохраните секретный ключ:

Python

from google import genai

client = genai.Client()

credential = client.credentials.create(
    id="github-production",
    type="bearer_token",
    token="ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)

print(f"Credential ID: {credential.id}, Status: {credential.status}")

JavaScript

import { GoogleGenAI } from "@google/genai";

const client = new GoogleGenAI({});

const credential = await client.credentials.create({
    id: "github-production",
    type: "bearer_token",
    token: "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
});

console.log(`Credential ID: ${credential.id}, Status: ${credential.status}`);

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "github-production",
    "type": "bearer_token",
    "token": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'

Затем привяжите его к домену, который он аутентифицирует:

Python

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Triage the open issues in my-org/my-repo.",
    environment={
        "type": "remote",
        "network": {
            "allowlist": [
                {"domain": "api.github.com", "credential": "github-production"},
                {"domain": "*"},
            ]
        },
    },
)

JavaScript

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Triage the open issues in my-org/my-repo.",
    environment: {
        type: "remote",
        network: {
            allowlist: [
                { domain: "api.github.com", credential: "github-production" },
                { domain: "*" },
            ],
        },
    },
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Triage the open issues in my-org/my-repo.",
    "environment": {
        "type": "remote",
        "network": {
            "allowlist": [
                { "domain": "api.github.com", "credential": "github-production" },
                { "domain": "*" }
            ]
        }
    }
}'

Теперь агент отправляет аутентифицированные запросы к api.github.com , и токен никогда не существует внутри песочницы.

Типы учетных данных

У каждых учетных данных есть type , определяющий, какие поля они принимают и как прокси-сервер их применяет.

Тип Вариант использования Поведение
bearer_token Персональные токены доступа, токены ботов, статические ключи API Прокси-сервер внедряет токен в заголовок запроса. Логика обновления отсутствует.
oauth2 Приложения OAuth и потоки, делегируемые пользователем Прокси-сервер обменивает токен обновления на токены доступа и обновляет их по мере истечения срока действия.
environment_variable Клиентские SDK, считывающие секреты из среды процесса. В среду агента поступает заполнитель. Прокси-сервер подставляет настоящий секретный ключ в исходящие запросы.

Используйте учетные данные из списка разрешенных сетей.

Добавьте credential в правило списка разрешенных запросов, и прокси-сервер будет аутентифицировать каждый исходящий запрос к этому домену. Это рекомендуемый способ предоставления агенту доступа к частному API, частному репозиторию или частному хранилищу.

В одном списке разрешенных разрешений можно смешивать правила для аутентифицированных и неаутентифицированных пользователей:

Python

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Sync the open Jira issues into the tracking sheet in my repo.",
    environment={
        "type": "remote",
        "sources": [
            {
                "type": "repository",
                "source": "https://github.com/your-org/backend",
                "target": "/backend-app",
            }
        ],
        "network": {
            "allowlist": [
                {"domain": "github.com", "credential": "github-production"},
                {"domain": "api.atlassian.com", "credential": "jira-oauth"},
                {"domain": "*.googleapis.com"},
            ]
        },
    },
)

JavaScript

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Sync the open Jira issues into the tracking sheet in my repo.",
    environment: {
        type: "remote",
        sources: [
            {
                type: "repository",
                source: "https://github.com/your-org/backend",
                target: "/backend-app",
            },
        ],
        network: {
            allowlist: [
                { domain: "github.com", credential: "github-production" },
                { domain: "api.atlassian.com", credential: "jira-oauth" },
                { domain: "*.googleapis.com" },
            ],
        },
    },
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Sync the open Jira issues into the tracking sheet in my repo.",
    "environment": {
        "type": "remote",
        "sources": [
            {
                "type": "repository",
                "source": "https://github.com/your-org/backend",
                "target": "/backend-app"
            }
        ],
        "network": {
            "allowlist": [
                { "domain": "github.com", "credential": "github-production" },
                { "domain": "api.atlassian.com", "credential": "jira-oauth" },
                { "domain": "*.googleapis.com" }
            ]
        }
    }
}'

Поскольку прокси-сервер обрабатывает учетные данные для каждого запроса, учетные данные oauth2 обновляют свой токен доступа прозрачно. Длительное взаимодействие не прерывается при истечении срока действия токена доступа.

Объединение credential и transform

Правила списка разрешенных запросов также принимают встроенный объект transform , который устанавливает заголовки непосредственно в правиле. Оба механизма применяются исходящим прокси-сервером в сети, поэтому в обоих случаях значение заголовка никогда не существует внутри песочницы. Оба поля могут отображаться в одном и том же правиле.

Настройка правил Поведение
только credential Прокси-сервер обрабатывает учетные данные и добавляет свой заголовок к каждому запросу к домену.
transform только Внедрение статических заголовков. Созданные вами заголовки отправляются как есть.
Оба Сначала применяются учетные данные, затем происходит слияние transform . Если оба параметра устанавливают один и тот же ключ, приоритет имеет явно заданный заголовок transform .
Ни один Домен разрешен, и заголовки не внедряются.

Использование учетных данных оправдано, если вы хотите сохранить секрет один раз и ссылаться на него из каждой среды, агента и триггера в вашем проекте, а также если вам необходимо, чтобы обновление и ротация токенов доступа обрабатывались автоматически. Встроенное transform подходит, когда значение относится к одному вызову, например, токен, который вы генерируете самостоятельно непосредственно перед созданием взаимодействия.

Сочетание этих двух методов является распространенной практикой. Учетные данные содержат заголовок аутентификации, а transform добавляет все остальное, что ожидает вышестоящий сервис в том же запросе:

{
    "domain": "api.atlassian.com",
    "credential": "jira-oauth",
    "transform": {
        "X-Atlassian-Workspace": "my-workspace-id"
    }
}

Чтобы переместить секрет из встроенного transform в учетные данные, сохраните его с помощью POST /credentials , замените заголовок аутентификации в transform на "credential": "<id>" , а остальную часть объекта transform оставьте без изменений.

Используйте учетные данные для работы с серверами MCP.

Удаленные MCP-серверы используют одно и то же поле credential . Установите его в инструменте mcp_server , и прокси-сервер будет внедрять заголовок аутентификации в каждый запрос к этому серверу:

Python

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Create a new issue in my-org/my-repo",
    environment="remote",
    tools=[{
        "type": "mcp_server",
        "name": "github",
        "url": "https://api.githubcopilot.com/mcp",
        "credential": "github-production",
    }],
)

JavaScript

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Create a new issue in my-org/my-repo",
    environment: "remote",
    tools: [{
        type: "mcp_server",
        name: "github",
        url: "https://api.githubcopilot.com/mcp",
        credential: "github-production",
    }],
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Create a new issue in my-org/my-repo",
    "environment": "remote",
    "tools": [
        {
            "type": "mcp_server",
            "name": "github",
            "url": "https://api.githubcopilot.com/mcp",
            "credential": "github-production"
        }
    ]
}'

credential и headers подчиняются тому же правилу приоритета, что и список разрешенных объектов. Сначала применяются учетные данные, а затем происходит слияние headers , поэтому явный заголовок имеет приоритет, если оба параметра устанавливают один и тот же ключ:

{
    "type": "mcp_server",
    "name": "jira",
    "url": "https://jira.atlassian.com/mcp",
    "credential": "jira-oauth",
    "headers": {
        "X-Atlassian-Workspace": "my-workspace-id"
    }
}

Чтобы переместить секретный ключ из встроенных headers в учетные данные, сохраните его с помощью POST /credentials и замените запись auth в headers на credential . Остальные заголовки оставьте без изменений.

Используйте учетные данные в качестве переменных среды.

Некоторые клиентские библиотеки считывают секретные данные из среды выполнения процесса, а не принимают их в качестве заголовков запроса. Чаще всего это клиенты, работающие в режиме сокета или использующие длительное опросное соединение.

Привяжите учетные данные environment_variable к имени переменной в файле environment.env :

Python

interaction = client.interactions.create(
    agent="antigravity-preview-09-2026",
    input="Run the sync script and check notifications.",
    environment={
        "type": "remote",
        "env": {
            "NODE_ENV": "production",
            "SLACK_BOT_TOKEN": {"credential": "slack-bot-token"},
        },
    },
)

JavaScript

const interaction = await client.interactions.create({
    agent: "antigravity-preview-09-2026",
    input: "Run the sync script and check notifications.",
    environment: {
        type: "remote",
        env: {
            NODE_ENV: "production",
            SLACK_BOT_TOKEN: { credential: "slack-bot-token" },
        },
    },
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/interactions" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "agent": "antigravity-preview-09-2026",
    "input": "Run the sync script and check notifications.",
    "environment": {
        "type": "remote",
        "env": {
            "NODE_ENV": "production",
            "SLACK_BOT_TOKEN": { "credential": "slack-bot-token" }
        }
    }
}'

env принимает одновременно строковые литералы и ссылки на учетные данные. Строковый литерал внедряется в контейнер как обычная текстовая переменная.

Ссылка на учетные данные — нет. Переменная получает заполнитель __GEMINI_CRED_<credential-id>__ , и прокси-сервер заменяет его реальным секретом только для исходящих запросов, идущих к домену из списка trusted_domains учетных данных. Запрос к любому другому домену отклоняется, поэтому секрет никогда не покидает периметр, и заполнитель не отправляется вместо него.

Установите trusted_domains для всех учетных данных, environment_variable . Он определяет область действия секретного ключа.

Создать учетные данные

Для каждого запроса на создание требуется указать type , а также все поля, необходимые для этого типа.

При прямом вызове REST все имена полей используют стиль snake_case. Отправка поля в стиле camelCase возвращает ошибку 400 .

Токен предъявителя

Для использования токена носителя требуется только token :

Python

credential = client.credentials.create(
    id="github-production",
    type="bearer_token",
    token="ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
)

JavaScript

const credential = await client.credentials.create({
    id: "github-production",
    type: "bearer_token",
    token: "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "github-production",
    "type": "bearer_token",
    "token": "ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}'

В ответе возвращаются только метаданные, токен никогда не предоставляется:

{
  "id": "github-production",
  "type": "bearer_token",
  "status": "active",
  "create_time": "2026-07-15T10:00:00.000000000Z",
  "update_time": "2026-07-15T10:00:00.000000000Z"
}

По умолчанию прокси отправляет Authorization: Bearer <token> . Переопределите header_name и prefix чтобы выбрать службу, которая ожидает иного:

Python

credential = client.credentials.create(
    id="my-api-key",
    type="bearer_token",
    token="key_xxxxxxxxxxxx",
    header_name="x-goog-api-key",
    prefix="",
)

JavaScript

const credential = await client.credentials.create({
    id: "my-api-key",
    type: "bearer_token",
    token: "key_xxxxxxxxxxxx",
    header_name: "x-goog-api-key",
    prefix: "",
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "my-api-key",
    "type": "bearer_token",
    "token": "key_xxxxxxxxxxxx",
    "header_name": "x-goog-api-key",
    "prefix": ""
}'

Данная конфигурация формирует заголовок x-goog-api-key: key_xxxxxxxxxxxx .

В следующей таблице показано, как сочетаются header_name и prefix :

Конфигурация Впрыскиваемый коллектор
{"token": "ghp_xxx"} Authorization: Bearer ghp_xxx
{"token": "sk_live_xxx"} Authorization: Bearer sk_live_xxx
{"token": "key_xxx", "header_name": "x-goog-api-key", "prefix": ""} x-goog-api-key: key_xxx
{"token": "mytoken", "header_name": "X-API-Token", "prefix": ""} X-API-Token: mytoken

OAuth2

Для использования учетных данных OAuth2 требуются поля client_id , client_secret , refresh_token и token_url . Поле scopes является необязательным:

Python

credential = client.credentials.create(
    id="jira-oauth",
    type="oauth2",
    client_id="my-client-id",
    client_secret="my-client-secret",
    token_url="https://auth.atlassian.com/oauth/token",
    refresh_token="rt_xxxxxxxxxxxxxxxxxxxx",
    scopes=["read:jira-work", "write:jira-work"],
)

JavaScript

const credential = await client.credentials.create({
    id: "jira-oauth",
    type: "oauth2",
    client_id: "my-client-id",
    client_secret: "my-client-secret",
    token_url: "https://auth.atlassian.com/oauth/token",
    refresh_token: "rt_xxxxxxxxxxxxxxxxxxxx",
    scopes: ["read:jira-work", "write:jira-work"],
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "jira-oauth",
    "type": "oauth2",
    "client_id": "my-client-id",
    "client_secret": "my-client-secret",
    "token_url": "https://auth.atlassian.com/oauth/token",
    "refresh_token": "rt_xxxxxxxxxxxxxxxxxxxx",
    "scopes": ["read:jira-work", "write:jira-work"]
}'

Создание учетных данных OAuth2 выполняет обмен токеном в реальном времени с token_url для подтверждения работоспособности конфигурации. Учетные данные сохраняются только в том случае, если провайдер возвращает успешный ответ с токеном, содержащий access_token . Принимаются как ответы в формате JSON, так и ответы в формате form-urlencoded.

Это означает, что при создании вам потребуется действительный, непросроченный токен обновления. Если провайдер отклонит обмен, вам будет возвращена ошибка:

{
  "error": {
    "message": "OAuth token validation failed with HTTP 403: {\"error\":\"unauthorized_client\",\"error_description\":\"refresh_token is invalid\"}",
    "code": "invalid_request"
  }
}

После сохранения прокси-сервер обновляет токены доступа по мере истечения их срока действия. Если провайдер обновляет токены обновления и возвращает новый во время обновления, новый токен автоматически заменяет сохраненный.

Переменная окружающей среды

Для использования environment_variable требуются value и injection_location ):

Python

credential = client.credentials.create(
    id="slack-bot-token",
    type="environment_variable",
    value="xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx",
    trusted_domains=["*.slack.com", "slack.com"],
    injection_location="header",
)

JavaScript

const credential = await client.credentials.create({
    id: "slack-bot-token",
    type: "environment_variable",
    value: "xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx",
    trusted_domains: ["*.slack.com", "slack.com"],
    injection_location: "header",
});

ОТДЫХ

curl -X POST "https://generativelanguage.googleapis.com/v1beta/credentials" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "id": "slack-bot-token",
    "type": "environment_variable",
    "value": "xoxb-xxxxxxxxxxxx-xxxxxxxxxxxx",
    "trusted_domains": ["*.slack.com", "slack.com"],
    "injection_location": "header"
}'

Поле injection_location указывает прокси-серверу, в какой части исходящего запроса следует заменить секретный ключ. Оно принимает header , query или body запроса либо в виде одной строки, либо в виде массива, если сервису требуется более одного параметра:

"injection_location": ["header", "query"]

Замена происходит только в указанных вами местах. Запрос, содержащий заполнитель в любом другом месте, будет отклонен, а не отправлен дальше.

Чтобы привязать учетные данные к имени переменной, см. раздел «Использование учетных данных в качестве переменных среды» .

Сгенерированные идентификаторы

Поле id является необязательным. Если его опустить, сервис сгенерирует UUID:

{
  "id": "9e545973-4330-49bb-9a44-930cea9fbe3c",
  "type": "bearer_token",
  "status": "active",
  "create_time": "2026-07-15T10:00:00.000000000Z",
  "update_time": "2026-07-15T10:00:00.000000000Z"
}

Указывайте собственный идентификатор, если вам нужна стабильная и читаемая ссылка для использования во всех взаимодействиях. Поскольку идентификатор отображается в пути к ресурсу, предпочтительнее использовать буквы и цифры в нижнем регистре с дефисами или подчеркиваниями.

Список учетных данных

Перечислите учетные данные, относящиеся к вашему проекту. Используйте параметры пагинации для управления размером пакета ответов.

Python

response = client.credentials.list(page_size=10)
for credential in response.credentials:
    print(f"Credential ID: {credential.id}, Type: {credential.type}")

JavaScript

const response = await client.credentials.list({ page_size: 10 });
for (const credential of response.credentials) {
    console.log(`Credential ID: ${credential.id}, Type: ${credential.type}`);
}

ОТДЫХ

curl -X GET "https://generativelanguage.googleapis.com/v1beta/credentials?page_size=10" \
-H "x-goog-api-key: $GEMINI_API_KEY"

Ответ содержит только метаданные:

{
  "credentials": [
    {
      "id": "github-production",
      "type": "bearer_token",
      "status": "active",
      "create_time": "2026-07-15T10:00:00.000000000Z",
      "update_time": "2026-07-15T10:00:00.000000000Z"
    },
    {
      "id": "jira-oauth",
      "type": "oauth2",
      "status": "active",
      "create_time": "2026-07-15T10:05:00.000000000Z",
      "update_time": "2026-07-15T10:05:00.000000000Z"
    }
  ],
  "next_page_token": "Cj...5aE="
}

Передайте значение next_page_token обратно в качестве page_token для получения следующей страницы. Это поле опускается, если нет дальнейших результатов.

Параметр Тип Описание
page_size целое число Максимальное количество учетных данных на странице.
page_token нить Токен из next_page_token предыдущего ответа.

Получите учетные данные

Получить метаданные для конкретных учетных данных по их идентификатору.

Python

credential = client.credentials.get(id="github-production")
print(f"Credential ID: {credential.id}, Status: {credential.status}")

JavaScript

const credential = await client.credentials.get("github-production");
console.log(`Credential ID: ${credential.id}, Status: ${credential.status}`);

ОТДЫХ

curl -X GET "https://generativelanguage.googleapis.com/v1beta/credentials/github-production" \
-H "x-goog-api-key: $GEMINI_API_KEY"

Ответ выглядит примерно следующим образом:

{
  "id": "github-production",
  "type": "bearer_token",
  "status": "active",
  "create_time": "2026-07-15T10:00:00.000000000Z",
  "update_time": "2026-08-01T14:30:00.000000000Z"
}

Запрос несуществующих учетных данных возвращает ошибку 404 :

{
  "error": {
    "message": "Result not found.; GetCredential call failed",
    "code": "not_found"
  }
}

Повернуть учетные данные

Замените секретный ключ, не затрагивая ни одно правило списка разрешенных адресов, определение инструмента или переменную среды, которая на него ссылается. Ротация вступит в силу при следующем разрешении прокси-сервера.

Запрос должен включать type , а также поля, которые вы хотите изменить. Поля, которые вы не укажете, сохранят свои текущие значения.

Повернуть токен носителя:

Python

credential = client.credentials.update(
    id="github-production",
    type="bearer_token",
    token="ghp_new_xxxxxxxxxxxxxxxxxxxx",
)

JavaScript

const credential = await client.credentials.update("github-production", {
    type: "bearer_token",
    token: "ghp_new_xxxxxxxxxxxxxxxxxxxx",
});

ОТДЫХ

curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/credentials/github-production" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "type": "bearer_token",
    "token": "ghp_new_xxxxxxxxxxxxxxxxxxxx"
}'

Смена токена обновления OAuth2:

Python

credential = client.credentials.update(
    id="jira-oauth",
    type="oauth2",
    refresh_token="rt_new_xxxxxxxxxxxxxxxxxxxx",
)

JavaScript

const credential = await client.credentials.update("jira-oauth", {
    type: "oauth2",
    refresh_token: "rt_new_xxxxxxxxxxxxxxxxxxxx",
});

ОТДЫХ

curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/credentials/jira-oauth" \
-H "Content-Type: application/json" \
-H "x-goog-api-key: $GEMINI_API_KEY" \
-d '{
    "type": "oauth2",
    "refresh_token": "rt_new_xxxxxxxxxxxxxxxxxxxx"
}'

В ответе отражено новое значение update_time :

{
  "id": "jira-oauth",
  "type": "oauth2",
  "status": "active",
  "create_time": "2026-07-15T10:05:00.000000000Z",
  "update_time": "2026-08-01T14:30:00.000000000Z"
}

type учетных данных фиксируется при создании. Чтобы изменить его, удалите учетные данные и создайте новые.

Удалить учетные данные

Удаляйте учетные данные и сохраненный секретный ключ, когда они больше не нужны.

Python

client.credentials.delete(id="github-production")

JavaScript

await client.credentials.delete("github-production");

ОТДЫХ

curl -X DELETE "https://generativelanguage.googleapis.com/v1beta/credentials/github-production" \
-H "x-goog-api-key: $GEMINI_API_KEY"

Успешное удаление возвращает пустой объект:

{}

Любое правило списка разрешенных, инструмент или переменная среды, все еще ссылающиеся на идентификатор, не смогут разрешиться, поэтому сначала обновите их.

Справочная информация по полю

Поля, общие для всех учетных данных:

Поле Тип Необходимый Описание
id нить Нет Уникальный идентификатор. Генерируется как UUID, если он опущен.
type нить Да Один из bearer_token , oauth2 , environment_variable .
status нить Только для чтения Текущий статус учетных данных.
create_time нить Только для чтения Метка времени создания RFC 3339.
update_time нить Только для чтения Метка времени последнего обновления в RFC 3339.

Поля для bearer_token :

Поле Тип Необходимый Описание
token нить Да Только для записи. Значение токена.
header_name нить Нет Заголовок для внедрения. По умолчанию используется Authorization .
prefix нить Нет Префикс значения. По умолчанию — Bearer . Установите значение "" для отсутствия префикса.

Поля для oauth2 :

Поле Тип Необходимый Описание
client_id нить Да Идентификатор клиента OAuth2.
client_secret нить Да Только для записи. Секретный ключ клиента OAuth2.
refresh_token нить Да Только для записи. Токен обновления используется для получения токенов доступа.
token_url нить Да Конечная точка для ввода токена поставщика.
scopes множество Нет Области действия OAuth для запроса.

Поля для environment_variable :

Поле Тип Необходимый Описание
value нить Да Только для записи. Секретное значение.
injection_location строка или массив Да Где заменить секретный ключ. В одном или нескольких элементах: header , query , body .
trusted_domains множество Нет Разрешены для подстановки доменных шаблонов.

Ошибки

При возникновении ошибок возвращается JSON-объект, содержащий message и code ошибки:

{
  "error": {
    "message": "Credential 'github-production' already exists.; CreateCredential call failed",
    "code": "aborted"
  }
}
HTTP-статус code Причина
400 invalid_request Отсутствует обязательное поле, неизвестное поле, неподдерживаемый type или не пройдена проверка OAuth2.
404 not_found С этим идентификатором учетные данные не требуются.
409 aborted Учетные данные с таким идентификатором уже существуют.

Неизвестные поля отклоняются, а не игнорируются, и в сообщении об ошибке указывается имя поля:

{
  "error": {
    "message": "Unknown parameter 'headerName'. Did you mean 'header_name'?",
    "code": "invalid_request"
  }
}

Что дальше?