ข้ามไปยังเนื้อหา

เชื่อมต่อ Google Calendar

คู่มือนี้แสดงวิธีเชื่อมต่อ Google Calendar เข้ากับเวิร์กสเปซ โดยแยกตามเวิร์กสเปซ: มันซิงค์เหตุการณ์ของเวิร์กสเปซนั้นเข้ามาใน Control Center แบบอ่านอย่างเดียว ดูปฏิทินและการจัดตาราง สำหรับภาพรวมทั้งหมด

  1. เปิด ปฏิทิน ในแถบด้านข้าง
  2. คลิก เพิ่มบัญชีปฏิทิน ในแถบด้านข้างของปฏิทิน (ส่วนเดียวกันนี้อยู่ที่ การตั้งค่า → เวิร์กสเปซ → โปรไฟล์และตัวตน ใต้ Google Calendar)
  3. เลือกวิธีอนุญาต:
    • ใช้แอป Google ของ Control Center — ไม่ต้องตั้งค่าอะไร เป็นค่าเริ่มต้นเมื่อบิลด์ของคุณมาพร้อมกับแอปนี้
    • ใช้ไคลเอนต์ Google Cloud ของฉันเอง — วาง client id และ secret จากโปรเจกต์ของคุณเอง (ดู นำไคลเอนต์ Google ของคุณมาเอง)
  4. คลิก เชื่อมต่อ Google Calendar กล่องโต้ตอบจะแสดงรหัสสั้น ๆ และลิงก์ไปยังหน้าอุปกรณ์ของ Google
  5. เปิดหน้านั้นบนอุปกรณ์ใดก็ได้ ใส่รหัส แล้วอนุมัติการเข้าถึงที่ขอ กล่องโต้ตอบจะปิดเอง และเหตุการณ์ของคุณจะเริ่มซิงค์

เซิร์ฟเวอร์เป็นผู้ทำการแลกเปลี่ยนนี้ ไม่ใช่อุปกรณ์ของคุณ และเก็บรีเฟรชโทเค็นที่ได้ ไว้ — นั่นคือเหตุผลที่รหัสถูกอนุมัติบน “อุปกรณ์ใดก็ได้” แทนที่จะเป็นในแอปนี้ โดยเฉพาะ

บัญชีจะถูกเชื่อม เข้ากับเวิร์กสเปซที่ใช้งานอยู่เท่านั้น สลับเวิร์กสเปซแล้ว คุณจะเห็นปฏิทินของเวิร์กสเปซนั้นแทน

ขั้นตอนการเชื่อมต่อขอ calendar.readonly พร้อมอีเมลของคุณ — สโคปชุดเดียวกัน ทั้งสำหรับแอปในตัวและไคลเอนต์ที่คุณวางเข้ามา Control Center อ่านเหตุการณ์เท่านั้น ไม่ได้สร้าง แก้ไข ลบ หรือตอบรับคำเชิญบน Google

เซิร์ฟเวอร์ เป็นเจ้าของตารางเวลา: มันกวาดบัญชีที่เชื่อมไว้ของทุกเวิร์กสเปซ ทุกสองนาที และเขียนเหตุการณ์ลงฐานข้อมูลของเวิร์กสเปซ ไคลเอนต์ไม่เคยคุยกับ Google — พวกมันอ่านสิ่งที่เซิร์ฟเวอร์เขียนไว้

การกวาดเป็นแบบเพิ่มพูน รอบแรกของแต่ละปฏิทินจะดึงหน้าต่างแบบเลื่อน (ย้อนหลัง 60 วัน ล่วงหน้า 90 วัน) และบันทึกโทเค็นซิงค์ของ Google รอบถัด ๆ ไปจะส่งโทเค็นนั้น และได้รับเฉพาะสิ่งที่เปลี่ยนแปลง ซึ่งเป็นสิ่งที่ทำให้รอบการทำงานทุกสองนาทีมี ต้นทุนที่รับได้ หน้าต่างจะถูกยึดใหม่ด้วยการซิงค์เต็มทุก 24 ชั่วโมง และทุกครั้งที่ Google ทำให้โทเค็นใช้ไม่ได้

รีเฟรชโทเค็นอยู่ในฝั่งเซิร์ฟเวอร์ ใน secrets.json ภายใต้ไดเรกทอรีข้อมูลของ เซิร์ฟเวอร์ เขียนแบบเจ้าของเท่านั้น (0600) — ไม่ได้อยู่ในคีย์เชนของ ระบบปฏิบัติการ และไม่อยู่บนอุปกรณ์ไคลเอนต์เลย

เวิร์กสเปซหนึ่งเชื่อมบัญชี Google ได้หลายบัญชี (เช่น บัญชีที่ทำงานและบัญชี ส่วนตัว) ทำขั้นตอนการเชื่อมต่อซ้ำสำหรับแต่ละบัญชี เหตุการณ์ของทั้งหมดจะรวมเข้าใน มุมมองเดือน / สัปดาห์ / วาระเดียวกัน แต่ละบัญชีซิงค์และรีเฟรชอย่างอิสระ และ ยกเลิกการเชื่อมต่อแยกกันได้

หาก Google ทำให้โทเค็นของบัญชีใช้ไม่ได้อย่างถาวร (เซสชันถูกเพิกถอนหรือหมดอายุ ไปนานแล้ว) การซิงค์จะหยุด และ Control Center จะแสดงแบนเนอร์ เชื่อมต่ออีกครั้ง บนปฏิทิน พร้อมการแจ้งเตือนบนเดสก์ท็อป คลิก เชื่อมต่ออีกครั้ง แล้วอนุมัติรหัส ใหม่ แบนเนอร์จะหายไปเมื่อการซิงค์ครั้งถัดไปสำเร็จ

จากแถบด้านข้างของปฏิทิน (หรือ การตั้งค่า → เวิร์กสเปซ → โปรไฟล์และตัวตน) คลิก ยกเลิกการเชื่อมต่อ ที่บัญชีนั้น การทำเช่นนี้จะลบเหตุการณ์ที่ซิงค์ไว้และ ล้างโทเค็นที่จัดเก็บไว้บนเซิร์ฟเวอร์

เชื่อมต่อจากเซิร์ฟเวอร์แบบไม่มีส่วนติดต่อ

หัวข้อที่มีชื่อว่า “เชื่อมต่อจากเซิร์ฟเวอร์แบบไม่มีส่วนติดต่อ”

เซิร์ฟเวอร์ที่ไม่มีการเชื่อมต่อ GUI เชื่อมบัญชีเดียวกันได้จากเทอร์มินัลของตัวเอง:

หน้าต่างเทอร์มินัล
GOOGLE_OAUTH_CLIENT_ID=<id> GOOGLE_OAUTH_CLIENT_SECRET=<secret> \
cc_server calendar connect --data-dir <dir> --workspace <workspace-id>

มันจะแสดงรหัสและ URL รอการอนุมัติ แล้วจัดเก็บโทเค็นและซิงค์ในรอบกวาดถัดไป

บิลด์จากซอร์สไม่แนบไคลเอนต์ Google มาให้ จึงต้องระบุ id และ secret — ตั้ง GOOGLE_OAUTH_CLIENT_ID และ GOOGLE_OAUTH_CLIENT_SECRET ไม่มีแฟล็ก --google-client-id (แฟล็กที่ไม่รู้จักจะถูกมองข้าม) หากไม่มีตัวแปรสภาพแวดล้อม คู่นี้ คำสั่งจะออกด้วยข้อผิดพลาดว่าขาดไคลเอนต์

นำไคลเอนต์ Google ของคุณมาเอง (ฟอร์กและการโฮสต์เอง)

หัวข้อที่มีชื่อว่า “นำไคลเอนต์ Google ของคุณมาเอง (ฟอร์กและการโฮสต์เอง)”

บิลด์รุ่นทางการแนบไคลเอนต์ Google มาให้ คนส่วนใหญ่จึงไม่ต้องแตะเรื่องนี้เลย นำของคุณมาเองหากคุณบิลด์จากซอร์ส รันเซิร์ฟเวอร์ของคุณเอง หรือต้องการให้หน้า ยินยอมระบุชื่อโปรเจกต์ของคุณเอง

  1. ใน Google Cloud Console เปิดใช้ Google Calendar API และตั้งค่า OAuth consent screen โดยเพิ่มสโคป calendar.readonly, openid และ email ระหว่างที่แอปยังไม่ผ่านการตรวจสอบ ให้เพิ่มตัวคุณเองเป็น test user การเพิ่ม calendar.events บนหน้ายินยอมไม่ได้เปิดใช้ RSVP — Control Center ไม่เคยขอสโคปนั้น
  2. สร้าง OAuth client ID ชนิดแอปพลิเคชัน TVs and limited input devices แล้วคัดลอกทั้ง client id และ client secret
  3. ใส่ข้อมูลเหล่านี้แบบต่อการเชื่อมต่อแต่ละครั้ง (เลือก ใช้ไคลเอนต์ Google Cloud ของฉันเอง ในกล่องโต้ตอบ) หรือทั้งเซิร์ฟเวอร์ด้วย GOOGLE_OAUTH_CLIENT_ID และ GOOGLE_OAUTH_CLIENT_SECRET

คู่ที่ตั้งระดับเซิร์ฟเวอร์จะแทนที่คู่ในตัวทุกที่ รวมถึงเบื้องหลังตัวเลือก “ใช้แอป Google ของ Control Center” — ดังนั้นบนเซิร์ฟเวอร์ของคุณเอง ตัวเลือกนั้น ก็คือแอปของคุณ

client secret ไม่เคยออกจากเซิร์ฟเวอร์: ไม่มีคำตอบ RPC ใดพามันออกไป และบัญชี ที่เชื่อมผ่านไคลเอนต์ของเซิร์ฟเวอร์เองจะเก็บเพียงเครื่องหมายแทนสำเนาของคู่ข้อมูล การหมุนเวียนมันจึงเป็นแค่การรีสตาร์ตด้วยค่าใหม่

อาการ สาเหตุที่เป็นไปได้
กล่องโต้ตอบไม่มีตัวเลือกในตัว บิลด์นี้ไม่แนบไคลเอนต์ Google มาให้ (บิลด์จากซอร์ส) หรือเซิร์ฟเวอร์เริ่มทำงานโดยมีเพียงครึ่งเดียวของคู่ข้อมูล ต้องมีทั้ง id และ secret
invalid_scope เมื่อเริ่มขั้นตอน โปรเจกต์ Cloud นั้นไม่ได้อนุญาตให้ใช้ Calendar กับไคลเอนต์แบบ device-code ให้ใช้โปรเจกต์ไคลเอนต์แบบ loopback หรือแบบเว็บแทน
invalid_client จาก Google ไคลเอนต์ไม่ใช่ไคลเอนต์ชนิด TVs and limited input devices หรือ id กับ secret มาจากไคลเอนต์คนละตัว
อนุมัติสำเร็จแต่การซิงค์ว่างเปล่า บัญชีของคุณไม่ใช่ test user บนหน้ายินยอม หรือ calendar.readonly ไม่ได้ถูกให้สิทธิ์
รหัสหมดอายุก่อนที่คุณจะอนุมัติ รหัสอุปกรณ์มีอายุสั้น เริ่มการเชื่อมต่อใหม่เพื่อขอรหัสใหม่
“อัปเดตคำตอบไม่ได้” เมื่อตอบรับ (RSVP) เป็นเรื่องปกติ: ขั้นตอนการเชื่อมต่อไม่เคยขอ calendar.events
การซิงค์หยุดพร้อมคำเตือนเรื่องการรีเฟรชในบันทึกของเซิร์ฟเวอร์ บัญชีถูกเชื่อมด้วยไคลเอนต์ที่ไม่ได้ตั้งค่าไว้อีกต่อไป เชื่อมต่อบัญชีอีกครั้ง หรือกู้คืน client id และ secret นั้น