---
read_when:
    - คุณต้องการย้ายคีย์ API ออกจาก openclaw.json และเก็บไว้ใน 1Password
    - คุณเรียกใช้ Gateway แบบไม่มีส่วนติดต่อผู้ใช้และต้องใช้การยืนยันตัวตนด้วยบัญชีบริการสำหรับ op
    - คุณต้องการให้เอเจนต์อ่านหรือแทรกข้อมูลลับด้วย op CLI
summary: แก้ไขข้อมูลลับของ Gateway ด้วย 1Password CLI และอนุญาตให้เอเจนต์ใช้ Skills 1password ที่รวมมาให้
title: 1Password
x-i18n:
    generated_at: "2026-07-16T19:04:21Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: dbe92009cd4409ae8e7235f5462f059783d5ca863557f1a7b12cacd47ee718c9
    source_path: gateway/1password.md
    workflow: 16
---

OpenClaw ทำงานร่วมกับ **1Password** ได้สองวิธีที่แยกจากกัน:

- **ข้อมูลลับในการกำหนดค่า:** ฟิลด์ [SecretRef](/th/gateway/secrets) ใดๆ ใน `openclaw.json` สามารถแก้ค่าแบบรันไทม์ผ่าน CLI `op` ได้ จึงไม่ต้องเก็บคีย์ API ไว้ในไฟล์การกำหนดค่า
- **เวิร์กโฟลว์ของเอเจนต์:** Skills `1password` ที่รวมมาให้จะสอนเอเจนต์ให้ลงชื่อเข้าใช้ และอ่านหรือแทรกข้อมูลลับด้วย `op` สำหรับงานของตนเอง

## ข้อกำหนด

- ติดตั้ง [1Password CLI](https://developer.1password.com/docs/cli/get-started/) (`op`) บนโฮสต์ Gateway (`brew install 1password-cli` บน macOS)
- โหมดการยืนยันตัวตนสำหรับ `op`:
  - **บัญชีบริการ** (แนะนำสำหรับ Gateway แบบไม่มีส่วนติดต่อผู้ใช้): ส่งออก `OP_SERVICE_ACCOUNT_TOKEN` ในสภาพแวดล้อมของบริการ Gateway โดยไม่ต้องใช้แอปเดสก์ท็อปและไม่ต้องลงชื่อเข้าใช้แบบโต้ตอบ
  - **การผสานการทำงานกับแอปเดสก์ท็อป**: แอป 1Password ทำงานบนเครื่องเดียวกันโดยเปิดใช้การผสานการทำงานกับ CLI การเรียกใช้ครั้งแรกอาจเรียกใช้ Touch ID หรือการยืนยันตัวตนของระบบ
  - **การลงชื่อเข้าใช้แบบสแตนด์อโลน**: `op signin` จะแสดงพร้อมท์ในแต่ละเซสชัน เอเจนต์สามารถใช้งานผ่าน Skills ได้ แต่ไม่เหมาะสำหรับการแก้ค่าข้อมูลลับในการกำหนดค่าบน Gateway แบบไม่มีส่วนติดต่อผู้ใช้

## แก้ค่าข้อมูลลับในการกำหนดค่าด้วย op

ประกาศผู้ให้บริการข้อมูลลับแบบ exec ซึ่งเรียกใช้ `op read` ด้วยการอ้างอิง `op://vault/item/field` แล้วกำหนดให้ฟิลด์ใดๆ ที่รองรับ SecretRef ชี้ไปยังผู้ให้บริการดังกล่าว:

```json5
{
  secrets: {
    providers: {
      onepassword_openai: {
        source: "exec",
        command: "/opt/homebrew/bin/op",
        allowSymlinkCommand: true, // จำเป็นสำหรับไบนารีที่ Homebrew ติดตั้งเป็นลิงก์สัญลักษณ์
        trustedDirs: ["/opt/homebrew"],
        args: ["read", "op://Personal/OpenClaw QA API Key/password"],
        passEnv: ["HOME"],
        jsonOnly: false,
      },
    },
  },
  models: {
    providers: {
      openai: {
        baseUrl: "https://api.openai.com/v1",
        models: [{ id: "gpt-5", name: "gpt-5" }],
        apiKey: { source: "exec", provider: "onepassword_openai", id: "value" },
      },
    },
  },
}
```

องค์ประกอบต่างๆ ทำงานร่วมกันดังนี้:

- `command` ต้องเป็นพาธแบบสัมบูรณ์ โดย `trustedDirs` จะระบุว่าไดเรกทอรีของพาธนั้นเชื่อถือได้ และจำเป็นต้องใช้ `allowSymlinkCommand` เนื่องจาก Homebrew ติดตั้ง `op` เป็นลิงก์สัญลักษณ์
- `args` ส่งต่อการอ้างอิง `op://vault/item/field` ตามต้นฉบับทุกประการ OpenClaw ไม่ได้แยกวิเคราะห์สคีมา `op://` ด้วยตนเอง แต่ไบนารี `op` จะเป็นผู้แก้ค่าดังกล่าว
- `passEnv` ส่งต่อตัวแปรที่ระบุจากสภาพแวดล้อม Gateway การผสานการทำงานกับแอปเดสก์ท็อปต้องใช้ `HOME` ส่วนบัญชีบริการต้องมี `OP_SERVICE_ACCOUNT_TOKEN` อยู่ในสภาพแวดล้อมของบริการ Gateway ด้วย (เพิ่มลงใน `passEnv` หรือตั้งค่าผ่าน `env` เฉพาะเมื่อยอมรับได้ว่าโทเค็นจะสามารถอ่านได้จากไฟล์การกำหนดค่า)
- สำหรับเอาต์พุตค่าเดียว ให้คง `id: "value"` ไว้ หากใช้ `jsonOnly: true` และเพย์โหลด JSON ให้ระบุฟิลด์ด้วย ID ตัวชี้ JSON แทน
- การใช้รายการผู้ให้บริการหนึ่งรายการต่อข้อมูลลับหนึ่งรายการช่วยให้ตรวจสอบการอ้างอิงได้ ควรตั้งชื่อผู้ให้บริการตามองค์ประกอบที่ใช้งาน (`onepassword_openai`, `onepassword_telegram`)

ดู [ข้อมูลลับของ Gateway](/th/gateway/secrets) สำหรับลำดับการแก้ค่า การแคช และความหมายของความล้มเหลว และดู [พื้นผิวข้อมูลรับรอง SecretRef](/th/reference/secretref-credential-surface) สำหรับฟิลด์ทั้งหมดที่ยอมรับ SecretRef

## การตั้งค่าบัญชีบริการสำหรับ Gateway แบบไม่มีส่วนติดต่อผู้ใช้

1. สร้างบัญชีบริการในบัญชี 1Password และให้สิทธิ์อ่านเฉพาะรายการในห้องนิรภัยที่ Gateway ต้องใช้
2. มอบ `OP_SERVICE_ACCOUNT_TOKEN` ให้แก่บริการ Gateway (plist ของ launchd, ยูนิต systemd หรือ env ของคอนเทนเนอร์)
3. เพิ่ม `"OP_SERVICE_ACCOUNT_TOKEN"` ลงในรายการ `passEnv` ของผู้ให้บริการ
4. ตรวจสอบจากสภาพแวดล้อมของโฮสต์ Gateway: `op whoami` ควรแสดงบัญชีบริการโดยไม่แสดงพร้อมท์

การอ่านด้วยบัญชีบริการกำหนดให้ระบุชื่อห้องนิรภัยอย่างชัดเจนในการอ้างอิง `op://` จำกัดขอบเขตของบัญชีให้แคบที่สุด เนื่องจากบัญชีนี้เป็นข้อมูลรับรองแบบ bearer

## Skills 1password สำหรับเอเจนต์

OpenClaw รวม Skills `1password` ซึ่งช่วยให้เอเจนต์ใช้งาน `op` ได้อย่างเชี่ยวชาญ โดยจะตรวจหาโหมดการยืนยันตัวตนที่พร้อมใช้งาน (บัญชีบริการ การผสานการทำงานกับแอปเดสก์ท็อป หรือการลงชื่อเข้าใช้แบบสแตนด์อโลน) ตรวจสอบสิทธิ์เข้าถึงด้วย `op whoami` ก่อนอ่านข้อมูลใดๆ และเลือกใช้ `op run` / `op inject` แทนการเขียนค่าข้อมูลลับลงดิสก์ Skills นี้ต้องใช้ไบนารี `op` และมีตัวเลือกติดตั้งผ่าน Homebrew เมื่อไม่พบไบนารีดังกล่าว

เอเจนต์ใช้ Skills นี้สำหรับเวิร์กโฟลว์ของตนเอง เช่น อ่านโทเค็นสำหรับการปรับใช้ระหว่างงาน หรือแทรกตัวแปรสภาพแวดล้อมลงในคำสั่ง กระบวนการนี้แยกจากการแก้ค่าข้อมูลลับในการกำหนดค่าโดยอิสระ Gateway จะแก้ค่า SecretRef โดยไม่ต้องใช้ Skills ใดๆ

## หมายเหตุด้านความปลอดภัย

- ค่าข้อมูลลับที่แก้ผ่านผู้ให้บริการแบบ exec จะคงอยู่ในหน่วยความจำของ Gateway ส่วนสแนปช็อตการกำหนดค่าและการตอบกลับ `config.get` จะปกปิดฟิลด์ SecretRef
- ห้ามใส่ค่าข้อมูลลับใน `openclaw.json` บันทึก หรือแชตโดยเด็ดขาด ให้เก็บชื่อรายการไว้ในการกำหนดค่าและเก็บค่าไว้ใน 1Password
- บันทึกการตรวจสอบของ 1Password จะแสดงการอ่านทุกครั้งของบัญชีบริการ ทำให้การหมุนเวียนคีย์และการตรวจสอบเหตุการณ์เป็นไปได้ในทางปฏิบัติ

## การแก้ไขปัญหา

- `command not found` หรือข้อผิดพลาดในการสร้างโปรเซส: ใช้พาธแบบสัมบูรณ์ของ `op` และเพิ่มไดเรกทอรีของพาธนั้นลงใน `trustedDirs`
- `op` แก้ค่าได้ แต่การอ่านล้มเหลวโดยมีข้อผิดพลาดเกี่ยวกับลิงก์สัญลักษณ์: ตั้งค่า `allowSymlinkCommand: true` สำหรับการติดตั้งผ่าน Homebrew
- `account is not signed in`: สำหรับบัญชีบริการ ให้ยืนยันว่า `OP_SERVICE_ACCOUNT_TOKEN` ถูกส่งถึงบริการ Gateway และมีอยู่ในรายการ `passEnv`; สำหรับการผสานการทำงานกับเดสก์ท็อป ให้ยืนยันว่าแอปกำลังทำงานและปลดล็อกอยู่
- การอ่านครั้งแรกช้า: เพิ่ม `timeoutMs` ในผู้ให้บริการ เนื่องจากการเริ่มทำงานแบบ cold start ของ `op` อาจเกินระยะหมดเวลาที่เข้มงวดบนโฮสต์ที่มีภาระงานสูง
