1. บทนำ
Agent ที่มีข้อมูลเข้าสู่ระบบของตัวเองพร้อมสิทธิ์แบบกว้างจะเห็นข้อมูลของทุกคน ในโค้ดแล็บนี้ คุณจะได้สร้างเอเจนต์ที่เรียกใช้ API ของบุคคลที่สามด้วยข้อมูลเข้าสู่ระบบของผู้ใช้ที่ลงชื่อเข้าใช้เอง เพื่อให้เอเจนต์เห็นเฉพาะสิ่งที่ผู้ใช้เห็นเท่านั้น
คุณจะสร้างโดยใช้ Google Agent Development Kit (ADK) และ Gemini Enterprise
โดยเฉพาะอย่างยิ่ง คุณจะได้เรียนรู้วิธีออกแบบสถาปัตยกรรมแบบ 2 ตัวตนในกรณีต่อไปนี้
- เอเจนต์ดำเนินการในนามของตนเอง (ข้อมูลประจำตัวของเอเจนต์): เอเจนต์จะเรียกใช้ Auth Manager, จัดเก็บข้อมูลการวัดและส่งข้อมูล และเรียกใช้ Google Cloud APIs โดยใช้ข้อมูลประจำตัวของเอเจนต์ที่ได้รับการสนับสนุนจาก SPIFFE
- เอเจนต์ดำเนินการในนามของผู้ใช้ (ข้อมูลประจำตัวที่มอบสิทธิ์โดยผู้ใช้): หากต้องการเข้าถึงแหล่งข้อมูลภายนอก เช่น GitHub เอเจนต์จะทริกเกอร์โฟลว์ความยินยอม OAuth แบบ 3 ขา (3LO) เพื่อค้นหาเครื่องมืออย่างปลอดภัยโดยใช้ข้อมูลเข้าสู่ระบบของผู้ใช้

โดยคุณจะได้เรียนรู้วิธีต่อไปนี้
- สร้าง Agent ADK ที่เชื่อมต่อกับเซิร์ฟเวอร์ Model Context Protocol (MCP) ของ GitHub
- อัปเดตเครื่องมือของตัวแทนจาก PAT (โทเค็นเพื่อการเข้าถึงส่วนบุคคล) แบบคงที่ของ GitHub เป็นโฟลว์ OAuth แบบ 3 ทาง (3LO) โดยใช้ Google Cloud Auth Manager
- ทำให้ Agent ใช้งานได้อย่างปลอดภัยใน Agent Runtime และจัดสรร Agent Identity
- กำหนดค่าบทบาท IAM เพื่อให้สิทธิ์เข้าถึงข้อมูลประจำตัวของเอเจนต์ไปยังที่เก็บโทเค็นในนามของผู้ใช้
- ทำความเข้าใจโฟลว์ 3LO แบบครบวงจรสำหรับ Auth Manager ใน Google Cloud
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น โปรดตรวจสอบว่าคุณมีสิ่งต่อไปนี้
- โปรเจ็กต์ Google Cloud ที่เปิดใช้การเรียกเก็บเงิน
- Google Cloud SDK (
gcloudCLI) ติดตั้งและตรวจสอบสิทธิ์ในโปรเจ็กต์ในเครื่องของคุณ ต้องใช้เวอร์ชัน 586.0.0 ขึ้นไป — เรียกใช้gcloud components update - ติดตั้ง Python 3.10 ถึง 3.13 ในเครื่อง
- ติดตั้ง
uvเครื่องมือจัดการแพ็กเกจ (pip install uv) - บัญชี GitHub เพื่อลงทะเบียนแอปพลิเคชัน OAuth และสร้างโทเค็น หากไม่มีบัญชี GitHub คุณสามารถใช้เซิร์ฟเวอร์ MCP ของบุคคลที่สามที่รองรับ OAuth 2.0 แบบ 3 ขาแทนได้
2. การตั้งค่าโปรเจ็กต์
1. ตรวจสอบสิทธิ์ไปยัง Google Cloud
ตรวจสอบสิทธิ์ไปยัง Google Cloud จากบรรทัดคำสั่งในเครื่องเพื่อให้แน่ใจว่าสภาพแวดล้อมของคุณมีสิทธิ์ที่จำเป็นในการติดตั้งใช้งาน Agent Runtime จัดสรรข้อมูลประจำตัวของ Agent และกำหนดค่า Auth Manager ในระหว่างแล็บนี้
เรียกใช้คำสั่งต่อไปนี้เพื่อเข้าสู่ระบบบัญชี Google Cloud เพื่อกำหนดค่าข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน (ADC)
gcloud auth login
gcloud auth application-default login
2. เปิดใช้บริการ Google Cloud ที่จำเป็น
เปิดใช้ API ที่จำเป็นในโปรเจ็กต์ Google Cloud เพื่อเรียกใช้ Lab นี้ เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัล
gcloud services enable \
agentidentity.googleapis.com \
agentregistry.googleapis.com \
aiplatform.googleapis.com \
apphub.googleapis.com
คำสั่งนี้อาจใช้เวลา 1 นาทีในการดำเนินการ เมื่อเสร็จแล้ว ระบบจะกลับไปที่ Command Prompt เพื่อยืนยันว่า API ใช้งานได้
3. ติดตั้ง CLI ของ Agent และตั้งค่าโปรเจ็กต์
agents-cli เป็นเครื่องมือบรรทัดคำสั่งที่ใช้ในการจัดโครงสร้าง จัดการ ทดสอบ และติดตั้งใช้งาน Agent ของ ADK ใน Gemini Enterprise ติดตั้งในเครื่อง
uvx google-agents-cli setup
ตรวจสอบการติดตั้ง
agents-cli --help
คุณควรเห็นเมนูความช่วยเหลือของ CLI ที่แสดงคำสั่งที่ใช้ได้ (เช่น deploy, run และ status)
สร้างโครงร่างเริ่มต้นของโปรเจ็กต์ คุณจะเริ่มต้นด้วยต้นแบบในเครื่องและปรับปรุงในภายหลังเพื่อการติดตั้งใช้งาน Agent Runtime โดยทำดังนี้
agents-cli create secure-agent-demo --prototype --yes
ซึ่งจะสร้างไดเรกทอรี secure-agent-demo ที่มีโค้ดเอเจนต์พื้นฐาน การอ้างอิง และไฟล์ทดสอบ
4. เพิ่มส่วนเสริม ADK ที่จำเป็น
pyproject.toml ที่สร้างขึ้นgoogle-adk[gcp,otel-gcp]ไม่มีส่วนเสริม 2 รายการที่ Agent นี้ต้องการ ได้แก่ mcp สำหรับชุดเครื่องมือ GitHub และ agent-identity สำหรับ Auth Manager ในภายหลังในห้องทดลอง เปิด secure-agent-demo/pyproject.toml แล้วเปลี่ยนบรรทัด google-adk เป็น
"google-adk[agent-identity,gcp,mcp,otel-gcp]>=2.5.0,<3.0.0",
จากนั้นให้ติดตั้งโดยทำดังนี้
cd secure-agent-demo
agents-cli install
3. สร้างและทดสอบ Agent
1. สร้างเอเจนต์
ในโปรเจ็กต์ ให้แทนที่โค้ดในไฟล์ agent.py ด้วยโค้ดต่อไปนี้
# app/agent.py
from google.adk.agents import Agent
from google.adk.apps import App
from google.adk.models import Gemini
from google.genai import types
from app.tools import github_toolset
import os
import google.auth
_, project_id = google.auth.default()
os.environ["GOOGLE_CLOUD_PROJECT"] = project_id
os.environ["GOOGLE_CLOUD_LOCATION"] = "global"
os.environ["GOOGLE_GENAI_USE_VERTEXAI"] = "True"
INSTRUCTION = """You are the DevOps Assistant. You help developers list and triage their GitHub issues and pull requests.
Your capabilities: You have a GitHub MCP toolset that you can use to perform actions that the user requests.
Rules:
- NEVER write, update, or delete. You are only allowed read access.
- Act on behalf of the signed-in user.
- If a tool returns an authentication or authorization error, guide the user to sign in.
- NEVER fabricate information. Only report real issues returned by tools.
"""
root_agent = Agent(
name="root_agent",
model=Gemini(
model="gemini-3.8-flash",
retry_options=types.HttpRetryOptions(attempts=3),
),
instruction=INSTRUCTION,
tools=[github_toolset()],
)
app = App(
root_agent=root_agent,
name="app",
)
ไฟล์นี้กำหนดองค์ประกอบสำคัญ 3 อย่างของเอเจนต์ ได้แก่
- คำสั่งของระบบ (
INSTRUCTION): กำหนดลักษณะตัวตน ขอบเขตผู้ช่วยในการจัดลำดับความสำคัญของ GitHub และบังคับใช้กฎความปลอดภัยที่เข้มงวด (เช่น สิทธิ์เข้าถึงแบบอ่านอย่างเดียว และแนะนำให้ผู้ใช้ตรวจสอบสิทธิ์หากเกิดข้อผิดพลาด) - การกำหนดค่าเอเจนต์ (
root_agent): สร้างอินสแตนซ์ ADKAgentโดยใช้โมเดลgemini-3.8-flashกำหนดค่าตรรกะการลองใหม่ของ HTTP และติดตั้งชุดเครื่องมือ GitHub ให้กับเอเจนต์ - App Wrapper (
app): ห่อหุ้มเอเจนต์รูทไว้ในคอนเทนเนอร์ ADKAppเพื่อให้สามารถนำไปใช้กับ Agent Runtime ได้
2. เพิ่มเครื่องมือ MCP ของ GitHub
เอเจนต์เชื่อมต่อกับ GitHub ผ่าน Model Context Protocol (MCP) สร้างไฟล์ใหม่ชื่อ tools.py ในโฟลเดอร์ app/ เพื่อลงทะเบียนพารามิเตอร์การเชื่อมต่อเกตเวย์ MCP คัดลอกและวางโค้ดต่อไปนี้
# app/tools.py
from __future__ import annotations
import os
from google.adk.tools.mcp_tool import McpToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams
GITHUB_MCP_URL = "https://api.githubcopilot.com/mcp/"
GITHUB_TOKEN = os.environ.get("GITHUB_TOKEN", "")
def github_toolset() -> McpToolset:
"""Returns the McpToolset connecting to the public GitHub Copilot MCP gateway."""
return McpToolset(
connection_params=StreamableHTTPConnectionParams(
url=GITHUB_MCP_URL,
headers={
"Authorization": f"Bearer {GITHUB_TOKEN}",
"X-MCP-Toolsets": "all",
"X-MCP-Readonly": "true",
},
)
)
ฟังก์ชันนี้จะสร้างเครื่องมือที่เรียกเซิร์ฟเวอร์ MCP ของ GitHub ดังนี้
- ชุดเครื่องมือ MCP (
McpToolset): ค้นพบและลงทะเบียนความสามารถของ GitHub แบบไดนามิกเป็นเครื่องมือเอเจนต์ที่เรียกใช้ได้ - พารามิเตอร์การเชื่อมต่อ (
StreamableHTTPConnectionParams): ชี้ชุดเครื่องมือไปยังเกตเวย์ MCP สาธารณะของ GitHub - ส่วนหัวการให้สิทธิ์: แทรก
GITHUB_TOKENเป็นโทเค็น Bearer และบังคับใช้โหมดอ่านอย่างเดียว (X-MCP-Readonly: true) ที่เลเยอร์การขนส่งโดยตรง
3. ทดสอบในเครื่องด้วย PAT (โทเค็นการเข้าถึงส่วนบุคคล) ของ GitHub
วิธีเรียกใช้เอเจนต์ในเครื่องด้วยข้อมูลเข้าสู่ระบบแบบคงที่
- สร้างโทเค็นเพื่อการเข้าถึงส่วนบุคคลของ GitHub ให้สิทธิ์อ่านแก่ที่เก็บของคุณ มิฉะนั้นเอเจนต์จะเห็นได้เฉพาะข้อมูลสาธารณะและพรอมต์ด้านล่างจะไม่แสดงผลใดๆ
- ตั้งค่าในสภาพแวดล้อมของคุณ
export GITHUB_TOKEN="your_github_pat_here" - ไปที่โฟลเดอร์
secure-agent-demoวิ่งcd secure-agent-demo agents-cli playground - เปิดอินเทอร์เฟซ Playground แล้วเลือกโฟลเดอร์ "app" จากเมนูแบบเลื่อนลง ในแชทบ็อกซ์ ให้พิมพ์
"Fetch my contributions across my private repositories over the last 6 months"แล้วตรวจสอบว่าเอเจนต์เรียกใช้เครื่องมือ GitHub และส่งคืนข้อมูลจากที่เก็บส่วนตัว
4. กำหนดค่า Auth Manager
แม้ว่าการฮาร์ดโค้ดข้อมูลเข้าสู่ระบบแบบคงที่ (เช่น PAT) จะสะดวกสำหรับการสร้างต้นแบบ แต่ก็ทำให้แอปพลิเคชันเวอร์ชันที่ใช้งานจริงเสี่ยงต่อการรั่วไหลของข้อมูลเข้าสู่ระบบ เวลาหยุดทำงานในการรีเฟรชโทเค็นด้วยตนเอง และการขาดการควบคุมการเข้าถึงแบบ Cloud-Native
Google Cloud มี Agent Identity Auth Manager เพื่อแก้ปัญหานี้ Agent Identity Auth Manager คือห้องเก็บข้อมูลเข้าสู่ระบบที่ออกแบบมาเพื่อช่วยปกป้องข้อมูลเข้าสู่ระบบ ซึ่งช่วยให้ตัวแทนตรวจสอบสิทธิ์ได้โดยใช้คีย์ API หรือรหัสไคลเอ็นต์และรหัสลับ OAuth หรือในนามของผู้ใช้ผ่านการมอบสิทธิ์ OAuth โดยใช้โทเค็นการเข้าถึงของผู้ใช้ปลายทาง
ใน Auth Manager คุณจะกำหนดค่าผู้ให้บริการการตรวจสอบสิทธิ์ที่กำหนดประเภทการตรวจสอบสิทธิ์และข้อมูลเข้าสู่ระบบสำหรับแอปพลิเคชันของบุคคลที่สามที่เฉพาะเจาะจง ผู้ให้บริการการตรวจสอบสิทธิ์เป็นระดับภูมิภาค และภูมิภาคต้องตรงกับภูมิภาคที่คุณติดตั้งใช้งาน Agent เวิร์กโฟลว์ Auth Manager แบบครบวงจรทํางานดังนี้

- การสกัดกั้นความยินยอมแบบไดนามิก: เมื่อเอเจนต์พยายามเรียกใช้เครื่องมือในนามของผู้ใช้ ADK จะตรวจสอบ Auth Manager เพื่อหาข้อมูลเข้าสู่ระบบที่ถูกต้องที่มีอยู่ หากไม่มี Auth Manager จะแสดง URL การให้สิทธิ์เพื่อเริ่มขั้นตอนความยินยอมแบบ OAuth 3 ขา (3LO)
- ที่เก็บห้องนิรภัยที่ปลอดภัย: เมื่อผู้ใช้ปลายทางให้สิทธิ์แอปพลิเคชันแล้ว Auth Manager จะสกัดกั้นการเรียกกลับของ OAuth โดยอัตโนมัติ และจัดเก็บโทเค็นการเข้าถึงและการรีเฟรชของผู้ใช้ที่ได้ในห้องนิรภัยสำหรับข้อมูลเข้าสู่ระบบที่ปลอดภัยซึ่ง Google จัดการ
- วงจรโทเค็นอัตโนมัติ: Auth Manager จะจัดการการหมดอายุและการหมุนเวียนโทเค็นอย่างเต็มรูปแบบในเบื้องหลัง จึงไม่จำเป็นต้องมีตรรกะการรีเฟรชโทเค็นด้วยตนเองหรือช่วงหยุดทำงาน
- การดำเนินการเครื่องมือแบบไม่มีรหัสลับ: สำหรับการดำเนินการในภายหลัง เอเจนต์ (ตรวจสอบสิทธิ์ผ่านข้อมูลประจำตัวของ SPIFFE Agent) จะขอโทเค็นเพื่อการเข้าถึงที่ได้รับมอบหมายของผู้ใช้จาก Auth Manager แบบไดนามิกในขณะรันไทม์ ซึ่งจะทำให้ทั้งโค้ดไคลเอ็นต์และโค้ดเอเจนต์ไม่มีรหัสลับโดยสมบูรณ์
ขั้นตอนที่ ก: กำหนดค่า GitHub เป็นผู้ให้บริการการตรวจสอบสิทธิ์
เรียกใช้gcloudคำสั่งต่อไปนี้เพื่อสร้างผู้ให้บริการการตรวจสอบสิทธิ์ GitHub ในโปรเจ็กต์ที่อยู่ในระบบคลาวด์ Google คุณจะระบุรหัสไคลเอ็นต์และรหัสลับในภายหลังได้ GitHub จะไม่สร้างรหัสเหล่านี้จนกว่าจะทราบ URL เรียกกลับของผู้ให้บริการรายนี้
gcloud agent-identity auth-providers create github-oauth-provider \
--project="${PROJECT_ID}" \
--location="us-central1" \
--three-legged-oauth-authorization-url="https://github.com/login/oauth/authorize" \
--three-legged-oauth-token-url="https://github.com/login/oauth/access_token"
อธิบายผู้ให้บริการเพื่อดึง URL เปลี่ยนเส้นทาง OAuth ที่สร้างขึ้น
gcloud agent-identity auth-providers describe github-oauth-provider \
--project="${PROJECT_ID}" \
--location="us-central1"
ฟิลด์คือ redirectUrl ซึ่งซ้อนอยู่ภายใต้ authProviderTypeParams.threeLeggedOauth หากต้องการอ่านโดยตรง ให้ทำดังนี้
gcloud agent-identity auth-providers describe github-oauth-provider \
--project="${PROJECT_ID}" --location="us-central1" \
--format="value(authProviderTypeParams.threeLeggedOauth.redirectUrl)"
ดูเหมือนว่า https://agentidentitycredentials.googleapis.com/v1/projects/YOUR_PROJECT_ID/locations/us-central1/authProviders/github-oauth-provider/oauthcallback
ขั้นตอนที่ ข: ลงทะเบียนแอป OAuth ใน GitHub
- ไปที่หน้าการตั้งค่าสำหรับนักพัฒนาซอฟต์แวร์ของ GitHub แล้วคลิกลงทะเบียนแอป OAuth ใหม่
- สำหรับ URL ของหน้าแรก ให้ป้อน URL ของแอปพลิเคชันฟรอนท์เอนด์ (เช่น
http://localhost:8501สำหรับการสร้างต้นแบบในเครื่อง) คุณสามารถเปลี่ยนเป็น URL ที่ใช้งานจริงในภายหลังได้ - ตั้งค่า URI การเปลี่ยนเส้นทางเป็น
redirectUrlที่ดึงข้อมูลมาในขั้นตอนก่อนหน้า - คลิกลงทะเบียนแอปพลิเคชัน จากนั้นคลิกสร้างรหัสลับไคลเอ็นต์ใหม่ แล้วบันทึกทั้งรหัสไคลเอ็นต์และรหัสลับไคลเอ็นต์
ขั้นตอนที่ ค: เพิ่มข้อมูลเข้าสู่ระบบ GitHub ลงในผู้ให้บริการการตรวจสอบสิทธิ์
แทนที่รหัสโปรเจ็กต์ รหัสไคลเอ็นต์ และรหัสลับไคลเอ็นต์ แล้วเรียกใช้คำสั่งนี้
gcloud agent-identity auth-providers update github-oauth-provider \
--project="YOUR_PROJECT_ID" \
--location="us-central1" \
--three-legged-oauth-client-id="YOUR_GITHUB_CLIENT_ID" \
--three-legged-oauth-client-secret="YOUR_GITHUB_CLIENT_SECRET"
คำสั่งจะส่งกลับไปยังผู้ให้บริการพร้อมกับ clientId ที่มองเห็นได้ แต่จะไม่ส่งกลับความลับ
👉 เมื่อทำขั้นตอนนี้เสร็จแล้ว Google Cloud Auth Manager จะได้รับการกำหนดค่าอย่างเต็มรูปแบบด้วยข้อมูลเข้าสู่ระบบของแอปพลิเคชัน GitHub OAuth ซึ่งจะตั้งค่า Google Cloud ให้ทำหน้าที่เป็นที่เก็บข้อมูลที่ปลอดภัยซึ่งจัดการวงจรความยินยอมและโทเค็น
5. เปลี่ยนโทเค็น PAT เป็น Auth Manager
เมื่อกำหนดค่า Auth Manager เสร็จสมบูรณ์แล้ว ขั้นตอนถัดไปคือการอัปเดตโค้ดเครื่องมือของตัวแทน แทนที่ app/tools.py ด้วยโค้ดต่อไปนี้
👉 แทนที่รหัสโปรเจ็กต์และสถานที่ตั้งในตัวแปร OAUTH_PROVIDER_NAME ด้านล่าง
# app/tools.py
from __future__ import annotations
import os
from google.adk.auth.credential_manager import CredentialManager
from google.adk.integrations.agent_identity import GcpAuthProvider, GcpAuthProviderScheme
from google.adk.tools.mcp_tool import McpToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StreamableHTTPConnectionParams
# 1. Register the GCP Auth Provider in the global Credential Manager
CredentialManager.register_auth_provider(GcpAuthProvider())
# 2. Replace YOUR_PROJECT_ID with your project ID.
OAUTH_PROVIDER_NAME = "projects/YOUR_PROJECT_ID/locations/us-central1/authProviders/github-oauth-provider"
# 3. The frontend callback URL where the user is redirected after authorizing GitHub. Resolved from the environment variable.
OAUTH_CONTINUE_URI = os.environ.get(
"OAUTH_CONTINUE_URI",
"http://localhost:8501/validateUserId"
)
def github_toolset() -> McpToolset:
"""Returns the McpToolset using 3LO credentials retrieved via GCP Auth Manager."""
auth_scheme = GcpAuthProviderScheme(
name=OAUTH_PROVIDER_NAME,
# Required to read private repositories. Auth Manager currently supports a
# single scope for GitHub.
scopes=["repo"],
continue_uri=OAUTH_CONTINUE_URI,
)
return McpToolset(
connection_params=StreamableHTTPConnectionParams(
url="https://api.githubcopilot.com/mcp/",
headers={
"X-MCP-Toolsets": "all",
"X-MCP-Readonly": "true",
},
),
auth_scheme=auth_scheme,
)
ทำความเข้าใจโค้ดเครื่องมือ
การเปลี่ยนแปลงที่สำคัญคือ auth_scheme การแนบโทเค็นกับชุดเครื่องมือหมายความว่าเมื่อใดก็ตามที่ตัวแทนเรียกใช้ GitHub ทาง ADK จะขอโทเค็นของผู้ใช้จาก Auth Manager ก่อน และหากยังไม่มีโทเค็น ระบบจะแจ้งให้ผู้ใช้ลงชื่อเข้าใช้แทนที่จะล้มเหลว GITHUB_TOKEN ที่ฮาร์ดโค้ดจะหายไปโดยสิ้นเชิง
6. ทำให้ Agent ใช้งานได้กับ Agent Runtime
ตอนนี้เราได้อัปเดตเครื่องมือ MCP ของ GitHub ให้ใช้ Auth Manager แทนแล้ว ขั้นตอนถัดไปคือการติดตั้งใช้งานเอเจนต์ในAgent Runtime การติดตั้งใช้งานโดยเปิดใช้ข้อมูลระบุตัวตนของ Agent จะจัดสรร SPIFFE ID ที่ไม่ซ้ำกันสำหรับ Agent
มาเริ่มด้วยการเริ่มต้นการกำหนดค่าการติดตั้งใช้งานสำหรับโปรเจ็กต์กัน เรียกใช้ในเทอร์มินัล
agents-cli scaffold enhance . --deployment-target agent_runtime --prototype --yes
คำสั่งนี้จะตรวจสอบโครงสร้างโปรเจ็กต์ของคุณเพื่อดูความเข้ากันได้ของ ADK เตรียมการกำหนดค่าการแพ็กเกจคอนเทนเนอร์พื้นฐาน และสร้างไฟล์ agents-cli-manifest.yaml ในรูทของโปรเจ็กต์ที่กำหนดค่าการติดตั้งใช้งานเริ่มต้นไว้ล่วงหน้า
👉 เปิดagents-cli-manifest.yamlไฟล์ที่สร้างขึ้นใหม่ แล้วยืนยันหรืออัปเดตฟิลด์ region เป็น us-central1 เพื่อให้แน่ใจว่าได้ติดตั้งใช้งานตัวแทนในภูมิภาคเดียวกับผู้ให้บริการตรวจสอบสิทธิ์
region: "us-central1"
ติดตั้งใช้งาน Agent ด้วยข้อมูลระบุตัวตนของ Agent
ทําให้ใช้งานได้ด้วย adk deploy agent_engine ซึ่งจะจัดสรร Agent Identity ของตัวเองให้กับเอเจนต์ ซึ่งเป็นข้อมูลประจำตัวแบบเข้ารหัสที่ SPIFFE สนับสนุนและเป็นของ Deployment นี้ โดยเอเจนต์จะใช้เพื่อตรวจสอบสิทธิ์กับ Auth Manager และบริการอื่นๆ ของ Google Cloud
👉 แทนที่ YOUR_PROJECT_ID ก่อนเรียกใช้คำสั่งต่อไปนี้
# Request a SPIFFE-backed Agent Identity for this deployment
echo '{ "identity_type": "AGENT_IDENTITY" }' > app/.agent_engine_config.json
# Generate the dependency list the build will install
uv export --no-emit-workspace --no-hashes --format requirements.txt \
--output-file app/requirements.txt
uv run adk deploy agent_engine app \
--project="YOUR_PROJECT_ID" \
--region="us-central1"
การติดตั้งใช้งานจะใช้เวลา 2-3 นาทีในการสร้างและอัปโหลดคอนเทนเนอร์ เมื่อเสร็จแล้ว CLI จะพิมพ์ชื่อทรัพยากรที่ติดตั้งใช้งาน จดค่า reasoningEngines/ENGINE_ID ไว้ เนื่องจากคุณจะต้องใช้ค่านี้เพื่อให้สิทธิ์ตัวแทนและชี้ไคลเอ็นต์ UI ไปยังค่าดังกล่าว
ให้สิทธิ์ข้อมูลระบุตัวตนของ Agent
เมื่อเอเจนต์ทำงานในระบบคลาวด์แล้ว เอเจนต์จะต้องมีสิทธิ์เข้าถึงข้อมูลเข้าสู่ระบบที่จัดเก็บไว้ใน Auth Manager โดยค่าเริ่มต้น ข้อมูลประจำตัว SPIFFE ของ Agent จะไม่มีสิทธิ์เข้าถึงทรัพยากรระบบคลาวด์ภายนอก
เรียกใช้gcloudคำสั่งต่อไปนี้เพื่อมอบบทบาท roles/agentidentity.user ให้กับข้อมูลประจำตัวของเอเจนต์ในทรัพยากรผู้ให้บริการการตรวจสอบสิทธิ์ ซึ่งจะให้สิทธิ์ที่แน่นอนแก่เอเจนต์ในการขอโทเค็นผู้ใช้จากห้องนิรภัย และไม่มีสิทธิ์ที่กว้างกว่านั้น
👉 แทนที่ YOUR_PROJECT_ID, YOUR_ORG_ID, YOUR_PROJECT_NUMBER และ YOUR_ENGINE_ID (รหัสเครื่องมืออยู่ในเอาต์พุตการติดตั้งใช้งานด้านบน)
หากต้องการรับ YOUR_ORG_ID ให้เรียกใช้คำสั่งด้านล่าง
gcloud projects get-ancestors $(gcloud config get-value project) \
--filter="type=organization" \
--format="value(id)"
gcloud agent-identity auth-providers add-iam-policy-binding github-oauth-provider \
--project="YOUR_PROJECT_ID" \
--location="us-central1" \
--role="roles/agentidentity.user" \
--member="principal://agents.global.org-YOUR_ORG_ID.system.id.goog/resources/aiplatform/projects/YOUR_PROJECT_NUMBER/locations/us-central1/reasoningEngines/YOUR_ENGINE_ID"
ตอนนี้ให้บทบาทเดียวกันในผู้ให้บริการแก่บัญชีของคุณเอง ไคลเอ็นต์ UI ที่คุณเรียกใช้ในขั้นตอนถัดไปจะเรียกใช้ API การสรุปข้อมูลเข้าสู่ระบบด้วยข้อมูลรับรองเริ่มต้นของแอปพลิเคชัน ดังนั้นหากไม่มีข้อมูลนี้ ขั้นตอนความยินยอมจะล้มเหลวโดยมีข้อผิดพลาด 403 ใน agentidentity.authProviders.retrieveCredentials:
gcloud agent-identity auth-providers add-iam-policy-binding github-oauth-provider \
--project="YOUR_PROJECT_ID" \
--location="us-central1" \
--role="roles/agentidentity.user" \
--member="user:YOUR_EMAIL_ADDRESS"
7. ทำความเข้าใจขั้นตอนความยินยอมของบุคคลที่สาม
เมื่อทำให้ Agent ใช้งานได้ใน Agent Runtime ด้วยข้อมูลประจำตัวของ Agent ที่ปลอดภัยแล้ว ขั้นตอนถัดไปคือการจัดเตรียมอินเทอร์เฟซส่วนหน้าแบบกำหนดเองเพื่อให้ผู้ใช้แชทกับ Agent ได้ ที่สำคัญกว่านั้นคือ Google Cloud Auth Manager ต้องมี Callback Handler ของแอปพลิเคชันไคลเอ็นต์เพื่อดำเนินการลูปการตรวจสอบสิทธิ์ให้เสร็จสมบูรณ์
แม้ว่า Google Cloud Auth Manager จะจัดการข้อมูลเข้าสู่ระบบของผู้ใช้ภายในห้องนิรภัยอย่างปลอดภัย แต่ก็ไม่สามารถทำการแลกเปลี่ยนโทเค็น OAuth ให้เสร็จสมบูรณ์ได้ด้วยตัวเอง การแฮนด์เชค 3LO อาศัยแอปพลิเคชันไคลเอ็นต์เพื่อเชื่อมช่องว่าง
- เมื่อผู้ใช้ให้สิทธิ์แอป GitHub แล้ว GitHub จะเปลี่ยนเส้นทางผู้ใช้กลับไปยัง
redirectUrlของผู้ให้บริการตรวจสอบสิทธิ์ข้อมูลประจำตัวของ Agent - จากนั้น Auth Manager จะเปลี่ยนเส้นทางป๊อปอัปของเบราว์เซอร์ของผู้ใช้กลับไปยัง URL ของ Callback ฝั่งไคลเอ็นต์ (
continue_uri) - แอปพลิเคชันไคลเอ็นต์มีหน้าที่สกัดกั้นการเปลี่ยนเส้นทางนี้ อ่าน Nonce จากคุกกี้ของเบราว์เซอร์ และเรียกใช้
credentials:finalizeปลายทางของ Google Cloud เพื่อทำการแฮนด์เชคให้เสร็จสมบูรณ์ - เมื่อไคลเอ็นต์สรุปการแลกเปลี่ยนแล้ว Google Cloud จะบันทึกโทเค็นอย่างปลอดภัยในห้องนิรภัยของผู้ให้บริการตรวจสอบสิทธิ์ ซึ่งจะช่วยให้ตัวแทนเรียกใช้เครื่องมือ GitHub ได้
หากไม่มีไคลเอ็นต์ที่กำหนดเองนี้ซึ่งโฮสต์ปลายทางการเรียกกลับ การแฮนด์เชคจะไม่สมบูรณ์ และห้องนิรภัยจะจัดเก็บข้อมูลเข้าสู่ระบบไม่ได้
ขั้นตอน OAuth 3LO แบบอินเทอร์แอกทีฟครอบคลุมหลายเลเยอร์ วงจรการดำเนินการทั้งหมดของคำขอเครื่องมือมีดังนี้ เราจะอธิบายเรื่องนี้ในคำอธิบายด้านล่างและในขั้นตอนถัดไป
👉 คลิกรูปภาพเพื่อขยาย
ความรับผิดชอบหลักของลูกค้าในการจับมือ
- ส่งต่อการท้าทายเรื่องความยินยอม (ขั้นตอนที่ 5-6): เอเจนต์จะส่ง
adk_request_credentialที่มี URL ความยินยอมและ Nonce แบบใช้ครั้งเดียว ไคลเอ็นต์จะเปิดป๊อปอัปและจัดเก็บ Nonce เป็นคุกกี้ - โฮสต์การเรียกกลับการเปลี่ยนเส้นทาง (ขั้นตอนที่ 10-11):
/validateUserIdซึ่ง Auth Manager จะส่งป๊อปอัปหลังจากได้รับความยินยอม - สร้างโทเค็นให้เสร็จสมบูรณ์ (ขั้นตอนที่ 12-14): รวมสถานะการตรวจสอบจากการเปลี่ยนเส้นทางกับ Nonce ที่แคชไว้ แล้วเรียกใช้
credentials:finalizeซึ่งจะจัดเก็บโทเค็นไว้ใน Vault
การสร้างไคลเอ็นต์ของคุณเอง
คุณไม่จำเป็นต้องเขียนไคลเอ็นต์นี้สำหรับแล็บ เนื่องจากขั้นตอนถัดไปจะเรียกใช้ไคลเอ็นต์ที่สร้างไว้ล่วงหน้า เมื่อคุณจะนำไปใช้ในแอปพลิเคชันของคุณเอง คุณสามารถใช้ข้อมูลอ้างอิง 2 รายการต่อไปนี้
- อัปเดตแอปพลิเคชันฝั่งไคลเอ็นต์ในเอกสารประกอบของ Auth Manager ซึ่งครอบคลุมการจัดการการท้าทายความยินยอมและการเรียกใช้
credentials:finalize - ไคลเอ็นต์ตัวอย่างที่เรียกใช้ได้ในที่เก็บ adk-python อ่าน
main.pyที่นั่นเพื่อดูการใช้งานที่สมบูรณ์และใช้งานได้จริงของความรับผิดชอบทั้ง 3 ประการข้างต้น
8. เรียกใช้ไคลเอ็นต์ UI ในเครื่อง
ดังที่เราได้ติดตามในแผนภาพลำดับโฟลว์ความยินยอม 3LO Auth Manager ต้องเปลี่ยนเส้นทางป๊อปอัปของเบราว์เซอร์กลับไปยังปลายทางการเรียกกลับฝั่งไคลเอ็นต์ ไคลเอ็นต์ตัวอย่างโฮสต์ปลายทางนั้นที่ /validateUserId มาเรียกใช้ในเครื่องกัน
คัดลอกไฟล์ไคลเอ็นต์ไปยัง Local
ไปที่โฟลเดอร์ gcp_auth/client ในที่เก็บ GitHub ของ adk-python โฟลเดอร์นี้มีชิ้นงานที่จำเป็นต่อการสร้างคอนเทนเนอร์ไคลเอ็นต์แชท
👉 คัดลอกไฟล์ทั้งหมดใน gcp_auth/client ไปยังสภาพแวดล้อมในเครื่อง
main.py: สคริปต์แอปพลิเคชัน FastAPI ที่มีโค้ดเรียกกลับการสรุปโทเค็น (/validateUserId) ที่เราพูดถึงในส่วนก่อนหน้าstatic/: มีหน้า HTML
หรือจะทำการชำระเงินแบบกระจัดกระจายของโฟลเดอร์ก็ได้
git clone --filter=blob:none --no-checkout https://github.com/google/adk-python.git
cd adk-python
git sparse-checkout init --cone
git sparse-checkout set contributing/samples/integrations/gcp_auth/client
git checkout
เรียกใช้ไคลเอ็นต์
- ไปที่โฟลเดอร์
clientที่คุณเพิ่งคัดลอกcd adk-python/contributing/samples/integrations/gcp_auth/client - สร้างสภาพแวดล้อมเสมือนและติดตั้งการอ้างอิงของไคลเอ็นต์ โฟลเดอร์จะส่ง
requirements.txtและไม่มีpyproject.tomlดังนั้นuv run uvicorn ...เพียงอย่างเดียวจึงล้มเหลวด้วยFailed to spawn: uvicornuv venv --python 3.13 .venv source .venv/bin/activate uv pip install --python .venv/bin/python -r requirements.txt - ชี้ไคลเอ็นต์ไปยังเอเจนต์ที่คุณติดตั้งใช้งาน แล้วเริ่มในพอร์ต
8501โดยทำดังนี้export GOOGLE_CLOUD_PROJECT=YOUR_PROJECT_ID export GOOGLE_CLOUD_LOCATION=us-central1 export AGENT_ID=YOUR_ENGINE_ID .venv/bin/uvicorn main:app --port 8501 - ตรวจสอบว่าเซิร์ฟเวอร์เริ่มต้นเรียบร้อยแล้วและกำลังรอรับการเชื่อมต่อที่
http://localhost:8501
9. ทดสอบโฟลว์ OAuth
ตอนนี้เมื่อได้ติดตั้งใช้งานบริการทั้งหมด กำหนดค่าการเชื่อมโยง IAM และตั้งค่าตัวแปรสภาพแวดล้อมแล้ว คุณก็พร้อมที่จะทดสอบโฟลว์การให้สิทธิ์ที่ผู้ใช้มอบหมายแบบครบวงจรที่ปลอดภัยแล้ว
ขั้นตอน ก: เริ่มการดำเนินการเครื่องมือ
- เปิดแท็บเบราว์เซอร์แล้วไปที่ URL ของไคลเอ็นต์:
http://localhost:8501 - ในแผงด้านซ้าย ให้ตั้งค่าประเภทเอเจนต์เป็น
Remote Agent Engine - พิมพ์โปรเจ็กต์ Google Cloud และสถานที่ตั้ง คลิก
Load Remote Agentsซึ่งควรโหลด Agent ทั้งหมดที่ติดตั้งใช้งานในโปรเจ็กต์ของคุณ - เลือกเอเจนต์ที่เหมาะสมจากเมนูแบบเลื่อนลง แล้วบันทึกการตั้งค่า
- พิมพ์ข้อความต่อไปนี้ในกล่องแชท
แล้วกด EnterFetch my contributions across my private repositories over the last 6 months - สังเกต UI ของแชท: เนื่องจากเอเจนต์ยังไม่มีข้อมูลเข้าสู่ระบบสำหรับเซสชันของผู้ใช้ จึงได้รับคำถามในการตรวจสอบสิทธิ์และแสดงการ์ด "ต้องมีการตรวจสอบสิทธิ์" ในเธรดการสนทนา
ขั้นตอนที่ 2: ทำตามความยินยอม OAuth แบบ 3 ขา
- หน้าต่างป๊อปอัปของเบราว์เซอร์แยกต่างหากจะเปิดขึ้น ซึ่งจะเปลี่ยนเส้นทางคุณผ่าน Auth Manager ของ Google Cloud ไปยังหน้าการให้สิทธิ์ OAuth ของ GitHub
- ตรวจสอบสิทธิ์ที่ขอ แล้วคลิกให้สิทธิ์
- GitHub จะเปลี่ยนเส้นทางกลับไปยัง Google Cloud ซึ่งจะเปลี่ยนเส้นทางป๊อปอัปไปยัง
localhostURL เรียกกลับ/validateUserIdของคุณ - บริการเรียกกลับจะประมวลผลและดำเนินการจับมือกับข้อมูลเข้าสู่ระบบให้เสร็จสมบูรณ์
ขั้นตอนที่ ค: กลับมาเป็นสมาชิก
- เมื่อหน้าต่างป๊อปอัปปิดลง แท็บแชทหลักจะตรวจหาการปิดโดยอัตโนมัติ
- ส่วนหน้าจะส่งเพย์โหลดการดำเนินการต่อกลับไปยังตัวแทน
- Agent จะดึงโทเค็นที่แลกเปลี่ยนใหม่จาก Google Cloud Auth Manager อย่างปลอดภัย เรียกใช้เครื่องมือ GitHub MCP ในนามของคุณ และสตรีมข้อมูลจากที่เก็บส่วนตัวกลับไปยังหน้าต่างแชทโดยตรง ซึ่งเป็นข้อมูลที่ Agent ไม่สามารถเข้าถึงได้ด้วยตนเอง
ขั้นตอนที่ ง: ตรวจสอบบันทึกของระบบคลาวด์
วิธียืนยันว่าระบบประมวลผลการแลกเปลี่ยนโทเค็นและการสรุปอย่างปลอดภัย
- ไปที่ Logs Explorer ในคอนโซล Google Cloud
- ค้นหาบันทึกเซิร์ฟเวอร์ที่ยืนยันการแยกค่า Nonce และการตรวจสอบที่สำเร็จ
INFO:secure-agent-client:Caching consent nonce for session_id: session-xxxxxxx INFO:secure-agent-client:Successfully finalized auth provider credentials. - ตรวจสอบบันทึกรันไทม์ของ Agent: หรือจะดูบันทึกการดำเนินการใน Agent Platform Console โดยตรงก็ได้
- ไปที่คอนโซล Agent Runtime
- คลิกเอเจนต์ที่ใช้งานแล้วจากรายการ
- สลับไปที่แท็บ Playground ซึ่งจะแสดงบันทึกของตัวแทนแบบเรียลไทม์ในบานหน้าต่างด้านล่าง โดยจะแสดงลูปการให้เหตุผลของตัวแทน รายละเอียดการดำเนินการเครื่องมือ และวงจรการดึงข้อมูลโทเค็นแบบเรียลไทม์
10. ล้าง
หากไม่ต้องการให้มีการเรียกเก็บเงินอย่างต่อเนื่องใน Google Cloud ให้ล้างข้อมูลทรัพยากรที่ติดตั้งใช้งานโดยทำดังนี้
# Follow the instructions here to delete the deployed Agent Runtime resource
# https://docs.cloud.google.com/gemini-enterprise-agent-platform/scale/runtime/manage-deployed-agents#console_3
# Delete the auth provider
gcloud agent-identity auth-providers delete github-oauth-provider \
--project=YOUR_PROJECT_ID --location=us-central1
# Note: deleted providers sit in soft-delete for 30 days, and the name is not
# reusable until roughly a day after that. Pick a fresh name if you repeat this lab.
# Optionally, you could also delete your Google Cloud Project
gcloud projects delete YOUR_PROJECT_ID
# Optionally, delete the GitHub PAT Token and the OAuth app:
# https://github.com/settings/personal-access-tokens
ล้างไฟล์ในเครื่อง
หากต้องการล้างข้อมูลสภาพแวดล้อมในเครื่องให้หมด คุณสามารถทำดังนี้
- หยุดเซิร์ฟเวอร์ uvicorn ในเครื่องโดยกด Ctrl+C ในเทอร์มินัลที่เซิร์ฟเวอร์กำลังทำงานอยู่
- นำไดเรกทอรีโปรเจ็กต์ที่สร้างขึ้นระหว่างแล็บนี้ออก
# cd to the correct folder
rm -rf secure-agent-demo client adk-python
11. ยินดีด้วย
คุณสร้างและรักษาความปลอดภัยของเอเจนต์ที่ดำเนินการในนามของผู้ใช้ที่ลงชื่อเข้าใช้เรียบร้อยแล้ว
สิ่งที่คุณได้เรียนรู้
- ข้อมูลประจำตัวของระบบตัวแทน: วิธีที่ตัวแทนดำเนินการภายใต้ข้อมูลประจำตัวของบัญชีของตนเองเพื่อเชื่อมต่อกับโครงสร้างพื้นฐานของ GCP อย่างปลอดภัย จัดการบันทึกการวัดและส่งข้อมูลทางไกล และเรียกใช้ API การสรุปข้อมูลเข้าสู่ระบบ
- ข้อมูลประจำตัวที่ได้รับมอบหมายจากผู้ใช้: วิธีที่เอเจนต์ขอสิทธิ์เพื่อดำเนินการในนามของผู้ใช้บนแพลตฟอร์มภายนอก (เช่น GitHub) โดยการเรียกใช้ขั้นตอนความยินยอม OAuth แบบ 3 ทาง (3LO)
- การผสานรวมเครื่องมือที่ปลอดภัย: วิธีเชื่อมต่อ Agent ADK กับเซิร์ฟเวอร์ Model Context Protocol (MCP) โดยใช้ Google Cloud Auth Manager เพื่อดึงโทเค็นของผู้ใช้แบบไดนามิกแทนการใช้ข้อมูลลับที่ฮาร์ดโค้ด
- การกำหนดค่านโยบาย IAM: วิธีตั้งค่าการเชื่อมโยงสิทธิ์แบบละเอียดเพื่อให้สิทธิ์ทั้งข้อมูลประจำตัวของ Agent Runtime และบัญชีของคุณเองในผู้ให้บริการการตรวจสอบสิทธิ์
อ่านเพิ่มเติม
- Agent Identity Auth Manager เพื่อทำความเข้าใจการกำหนดค่าโฟลว์การตรวจสอบสิทธิ์และขอบเขต
- ภาพรวม Agent Runtime
- เอกสารประกอบ ADK
- Model Context Protocol
