Thông tin đăng nhập trong các tác nhân được quản lý

Thông tin đăng nhập là các khoá bí mật do máy chủ quản lý, cho phép các tác nhân của bạn truy cập vào các dịch vụ của bên thứ ba mà không cần khoá bí mật truy cập vào môi trường của tác nhân. Bạn lưu trữ thông tin đăng nhập một lần, tham chiếu thông tin đó theo mã nhận dạng và proxy truyền dữ liệu sẽ phân giải và chèn thông tin đó tại thời điểm yêu cầu.

Giá trị bí mật chỉ ghi. Sau khi được lưu trữ, các mã thông báo này sẽ không bao giờ được trả về bởi bất kỳ điểm cuối nào, vì vậy, một tác nhân bị xâm nhập không thể đọc lại các mã thông báo mà tác nhân đó đang sử dụng.

Nơi chính mà bạn sử dụng thông tin đăng nhập là danh sách cho phép mạng trên environment.network. Trước tiên, hãy lưu trữ khoá bí mật:

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}`);

REST

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"
}'

Sau đó, hãy đính kèm khoá này vào miền mà khoá xác thực:

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: "*" },
            ],
        },
    },
});

REST

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": "*" }
            ]
        }
    }
}'

Giờ đây, tác nhân sẽ đưa ra các yêu cầu đã xác thực đối với api.github.com và mã thông báo sẽ không bao giờ tồn tại trong hộp cát.

Loại thông tin xác thực

Mỗi thông tin đăng nhập đều có một type để xác định những trường mà thông tin đăng nhập đó chấp nhận và cách proxy áp dụng thông tin đăng nhập đó.

Loại Trường hợp sử dụng Hành vi
bearer_token Mã truy cập cá nhân, mã thông báo bot, khoá API tĩnh Proxy chèn mã thông báo dưới dạng tiêu đề của yêu cầu. Không có logic làm mới.
oauth2 Ứng dụng OAuth và quy trình do người dùng uỷ quyền Proxy sẽ trao đổi mã làm mới để lấy mã truy cập và làm mới các mã này khi chúng hết hạn.
environment_variable Các SDK ứng dụng đọc các khoá bí mật từ môi trường quy trình Môi trường của nhân viên hỗ trợ sẽ nhận được một phần giữ chỗ. Proxy thay thế khoá bí mật thực trong các yêu cầu đi ra.

Sử dụng thông tin đăng nhập trong danh sách cho phép mạng

Thêm credential vào một quy tắc trong danh sách cho phép và proxy sẽ xác thực mọi yêu cầu gửi đi đến miền đó. Đây là cách được đề xuất để cấp cho một tác nhân quyền truy cập vào một API riêng tư, kho lưu trữ riêng tư hoặc vùng lưu trữ riêng tư.

Bạn có thể kết hợp các quy tắc đã xác thực và chưa xác thực trong cùng một danh sách cho phép:

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" },
            ],
        },
    },
});

REST

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" }
            ]
        }
    }
}'

Vì proxy phân giải thông tin đăng nhập theo từng yêu cầu, nên thông tin đăng nhập oauth2 sẽ làm mới mã truy cập một cách minh bạch. Tương tác diễn ra trong thời gian dài sẽ không bị gián đoạn khi mã truy cập hết hạn.

Kết hợp credentialtransform

Các quy tắc trong danh sách cho phép cũng chấp nhận một đối tượng transform nội tuyến đặt trực tiếp các tiêu đề trên quy tắc. Cả hai cơ chế này đều được áp dụng bởi proxy truyền dữ liệu ra bên ngoài trên đường truyền, vì vậy trong cả hai trường hợp, giá trị tiêu đề không bao giờ tồn tại bên trong hộp cát. Cả hai trường đều có thể xuất hiện trên cùng một quy tắc.

Cấu hình quy tắc Hành vi
Chỉ credential Proxy sẽ phân giải thông tin đăng nhập và chèn tiêu đề của thông tin đăng nhập đó vào mọi yêu cầu gửi đến miền.
Chỉ transform Chèn tiêu đề tĩnh. Các tiêu đề bạn viết sẽ được gửi nguyên trạng.
Cả hai Thông tin đăng nhập được áp dụng trước, sau đó transform hợp nhất ở trên cùng. Tiêu đề transform rõ ràng sẽ thắng nếu cả hai đều đặt cùng một khoá.
Cả hai đều không Miền được cho phép và không có tiêu đề nào được chèn.

Bạn nên sử dụng thông tin đăng nhập khi muốn lưu trữ một bí mật một lần và tham chiếu bí mật đó từ mọi môi trường, tác nhân và điều kiện kích hoạt trong dự án của mình, cũng như khi bạn muốn hệ thống xử lý việc làm mới và xoay vòng mã truy cập cho bạn. transform nội tuyến sẽ phù hợp khi giá trị thuộc về một lệnh gọi duy nhất, ví dụ: mã thông báo mà bạn tự tạo ngay trước khi tạo lượt tương tác.

Việc kết hợp cả hai là điều thường thấy. Thông tin đăng nhập mang theo tiêu đề xác thực và transform sẽ thêm mọi thứ khác mà dịch vụ nguồn mong đợi vào cùng một yêu cầu:

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

Để di chuyển một khoá bí mật ra khỏi transform cùng dòng và vào một thông tin đăng nhập, hãy lưu trữ khoá bí mật đó bằng POST /credentials, thay thế tiêu đề uỷ quyền trong transform bằng "credential": "<id>" và giữ nguyên phần còn lại của đối tượng transform.

Sử dụng thông tin đăng nhập với máy chủ MCP

Máy chủ MCP từ xa có cùng trường credential. Đặt trên một công cụ mcp_server và proxy sẽ chèn tiêu đề uỷ quyền vào mọi yêu cầu gửi đến máy chủ đó:

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",
    }],
});

REST

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"
        }
    ]
}'

credentialheaders tuân theo cùng quy tắc ưu tiên như danh sách cho phép. Thông tin xác thực được áp dụng trước và headers hợp nhất ở trên cùng, vì vậy, tiêu đề rõ ràng sẽ thắng nếu cả hai đặt cùng một khoá:

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

Để di chuyển một khoá bí mật ra khỏi headers nội tuyến và vào một thông tin xác thực, hãy lưu trữ khoá bí mật đó bằng POST /credentials và thay thế mục nhập uỷ quyền trong headers bằng credential. Giữ nguyên các tiêu đề khác.

Sử dụng thông tin đăng nhập làm biến môi trường

Một số thư viện ứng dụng đọc các khoá bí mật từ môi trường xử lý thay vì chấp nhận các khoá đó dưới dạng tiêu đề yêu cầu. Các ứng dụng chế độ ổ cắm và ứng dụng thăm dò ý kiến trong thời gian dài là trường hợp phổ biến.

Liên kết thông tin đăng nhập environment_variable với tên biến trong 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" },
        },
    },
});

REST

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 chấp nhận các chuỗi ký tự và thông tin tham chiếu về thông tin đăng nhập song song. Một chuỗi ký tự được chèn vào vùng chứa dưới dạng một biến văn bản thuần tuý thông thường.

Giá trị tham chiếu thông tin đăng nhập không phải là. Biến này nhận được phần giữ chỗ __GEMINI_CRED_<credential-id>__ và chỉ khi có các yêu cầu đi đến một miền trong trusted_domains của thông tin đăng nhập thì proxy mới thay thế bằng khoá bí mật thực. Yêu cầu đến bất kỳ miền nào khác đều bị từ chối, vì vậy, khoá bí mật sẽ không bao giờ rời khỏi phạm vi và phần giữ chỗ sẽ không được gửi thay thế.

Đặt trusted_domains cho mọi thông tin đăng nhập environment_variable. Đây là chế độ kiểm soát phạm vi sử dụng bí mật.

Tạo thông tin đăng nhập

Mọi yêu cầu tạo đều cần có một type, cộng với bất kỳ trường nào mà loại đó yêu cầu.

Khi gọi REST trực tiếp, tất cả tên trường đều sử dụng snake_case. Việc gửi một trường camelCase sẽ trả về 400.

Mã thông báo truy cập

Thông tin đăng nhập bằng mã thông báo chỉ cần 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",
});

REST

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"
}'

Phản hồi chỉ trả về siêu dữ liệu, không bao giờ trả về mã thông báo:

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

Theo mặc định, proxy sẽ gửi Authorization: Bearer <token>. Ghi đè header_nameprefix để nhắm đến một dịch vụ mong đợi một điều gì đó khác:

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: "",
});

REST

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": ""
}'

Cấu hình này tạo ra tiêu đề x-goog-api-key: key_xxxxxxxxxxxx.

Bảng sau đây cho thấy cách kết hợp header_nameprefix:

Cấu hình Tiêu đề được chèn
{"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

Thông tin đăng nhập OAuth2 yêu cầu client_id, client_secret, refresh_tokentoken_url. Trường scopes là không bắt buộc:

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"],
});

REST

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"]
}'

Việc tạo thông tin đăng nhập OAuth2 sẽ thực hiện một hoạt động trao đổi mã thông báo trực tiếp với token_url để xác nhận rằng cấu hình hoạt động. Thông tin đăng nhập chỉ được lưu trữ nếu trình cung cấp trả về một phản hồi mã thông báo thành công có chứa access_token. Cả phản hồi JSON và phản hồi form-urlencoded đều được chấp nhận.

Điều này có nghĩa là bạn cần có một mã làm mới hợp lệ và chưa hết hạn tại thời điểm tạo. Nếu nhà cung cấp từ chối trao đổi, thì lỗi sẽ được trả về cho bạn:

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

Sau khi được lưu trữ, proxy sẽ làm mới mã truy cập khi chúng hết hạn. Nếu nhà cung cấp xoay vòng mã làm mới và trả về một mã mới trong quá trình làm mới, thì mã mới sẽ tự động thay thế mã đã lưu trữ.

Biến môi trường

Thông tin đăng nhập environment_variable yêu cầu valueinjection_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",
});

REST

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"
}'

Trường injection_location cho biết proxy nên thay thế bí mật ở đâu trong yêu cầu đi. Thành phần này chấp nhận header, query hoặc body, dưới dạng một chuỗi duy nhất hoặc dưới dạng một mảng khi một dịch vụ cần nhiều hơn một:

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

Việc thay thế chỉ diễn ra ở những vị trí mà bạn liệt kê. Yêu cầu mang giá trị giữ chỗ ở bất kỳ nơi nào khác sẽ bị từ chối thay vì được gửi đi.

Để liên kết thông tin đăng nhập với tên biến, hãy xem phần Sử dụng thông tin đăng nhập làm biến môi trường.

Mã nhận dạng được tạo

Trường id là không bắt buộc. Bỏ qua mã này và dịch vụ sẽ tạo một mã 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"
}

Cung cấp mã nhận dạng của riêng bạn khi bạn muốn có một thông tin tham chiếu ổn định, dễ đọc để sử dụng trong các lượt tương tác. Vì mã nhận dạng xuất hiện trong đường dẫn tài nguyên, hãy ưu tiên các ký tự chữ và số viết thường có dấu gạch nối hoặc dấu gạch dưới.

Liệt kê thông tin đăng nhập

Liệt kê thông tin xác thực thuộc dự án của bạn. Sử dụng các tham số phân trang để kiểm soát kích thước lô phản hồi.

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}`);
}

REST

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

Phản hồi chỉ chứa siêu dữ liệu:

{
  "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="
}

Truyền next_page_token trở lại dưới dạng page_token để tìm nạp trang tiếp theo. Trường này sẽ bị bỏ qua khi không có kết quả nào khác.

Tham số Loại Mô tả
page_size số nguyên Số lượng thông tin xác thực tối đa trên mỗi trang.
page_token chuỗi Mã thông báo từ next_page_token của một phản hồi trước đó.

Lấy thông tin đăng nhập

Truy xuất siêu dữ liệu cho một thông tin xác thực cụ thể theo mã nhận dạng của thông tin đó.

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}`);

REST

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

Phản hồi sẽ có dạng như sau:

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

Yêu cầu một thông tin đăng nhập không tồn tại sẽ trả về 404:

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

Thay đổi thông tin xác thực

Thay thế một khoá bí mật mà không ảnh hưởng đến bất kỳ quy tắc danh sách cho phép, định nghĩa công cụ hoặc biến môi trường nào tham chiếu đến khoá bí mật đó. Hướng xoay sẽ có hiệu lực vào lần phân giải proxy tiếp theo.

Yêu cầu phải có type, cộng với các trường bạn muốn thay đổi. Các trường mà bạn bỏ qua sẽ giữ nguyên giá trị hiện tại.

Xoay vòng mã thông báo của người mang:

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",
});

REST

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"
}'

Xoay vòng mã làm mới 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",
});

REST

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"
}'

Phản hồi này phản ánh update_time mới:

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

type của thông tin đăng nhập được cố định khi tạo. Để thay đổi, hãy xoá thông tin đăng nhập đó rồi tạo một thông tin đăng nhập mới.

Xoá thông tin đăng nhập

Xoá thông tin đăng nhập và bí mật đã lưu trữ của thông tin đăng nhập đó khi không cần thiết nữa.

Python

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

JavaScript

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

REST

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

Thao tác xoá thành công sẽ trả về một đối tượng trống:

{}

Mọi quy tắc, công cụ hoặc biến môi trường trong danh sách cho phép vẫn tham chiếu đến mã nhận dạng này sẽ không phân giải được, vì vậy, trước tiên hãy cập nhật những quy tắc, công cụ hoặc biến môi trường đó.

Tài liệu tham khảo về trường

Các trường chung cho mọi thông tin đăng nhập:

Trường Loại Bắt buộc Mô tả
id chuỗi Không Giá trị nhận dạng riêng biệt. Được tạo dưới dạng UUID khi bị bỏ qua.
type chuỗi Một trong các giá trị bearer_token, oauth2, environment_variable.
status chuỗi Chỉ đọc Trạng thái hiện tại của thông tin đăng nhập.
create_time chuỗi Chỉ đọc Dấu thời gian tạo RFC 3339.
update_time chuỗi Chỉ đọc Dấu thời gian RFC 3339 của lần cập nhật gần đây nhất.

Các trường cho bearer_token:

Trường Loại Bắt buộc Mô tả
token chuỗi Chỉ ghi. Giá trị mã thông báo.
header_name chuỗi Không Tiêu đề cần chèn. Giá trị mặc định là Authorization.
prefix chuỗi Không Tiền tố giá trị. Giá trị mặc định là Bearer. Đặt thành "" nếu không có.

Các trường cho oauth2:

Trường Loại Bắt buộc Mô tả
client_id chuỗi Mã ứng dụng OAuth2.
client_secret chuỗi Chỉ ghi. Khoá bí mật của ứng dụng OAuth2.
refresh_token chuỗi Chỉ ghi. Mã làm mới dùng để lấy mã truy cập.
token_url chuỗi Điểm cuối mã thông báo của nhà cung cấp.
scopes mảng Không Các phạm vi OAuth cần yêu cầu.

Các trường cho environment_variable:

Trường Loại Bắt buộc Mô tả
value chuỗi Chỉ ghi. Giá trị bí mật.
injection_location chuỗi hoặc mảng Vị trí thay thế khoá bí mật. Một hoặc nhiều trong số header, query, body.
trusted_domains mảng Không Các mẫu miền được phép thay thế.

Lỗi

Lỗi trả về một đối tượng JSON có messagecode:

{
  "error": {
    "message": "Credential 'github-production' already exists.; CreateCredential call failed",
    "code": "aborted"
  }
}
Trạng thái HTTP code Nguyên nhân
400 invalid_request Thiếu trường bắt buộc, trường không xác định, type không được hỗ trợ hoặc xác thực OAuth2 không thành công.
404 not_found Không có thông tin xác thực nào có mã nhận dạng đó.
409 aborted Đã có một thông tin đăng nhập sử dụng mã nhận dạng đó.

Các trường không xác định sẽ bị từ chối thay vì bị bỏ qua và lỗi sẽ đặt tên cho trường:

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

Bước tiếp theo