- เพื่อแก้ปัญหาการใช้งานที่ช้าและขั้นตอนการเข้าใช้งานที่ยุ่งยากของแอป PureGym ผู้เขียนจึงปรับแต่งให้เหมาะกับ Apple Wallet เป็นการส่วนตัว
- เดิมที QR code ต้องเปิดแอปและรอโหลดข้อมูลทุกครั้ง เป็นวิธีเข้าใช้งานที่ไม่มีประสิทธิภาพและใช้เวลาราว 47 วินาที
- ผู้เขียนสร้าง Wallet pass ที่ต่ออายุอัตโนมัติได้ ผ่านกระบวนการทางเทคนิคต่างๆ เช่น reverse engineering, การใช้ mitmproxy และเฟรมเวิร์ก PassKit
- ระหว่างทางยังพบการทำงานภายในของ PureGym ที่เปิดเผยอยู่บนเว็บ เช่น ช่องโหว่ด้านความปลอดภัยของรหัส PIN, โครงสร้างการยืนยันตัวตนของ API และข้อมูลตำแหน่งสาขา
- ท้ายที่สุดจึงสร้างประสบการณ์ผู้ใช้ที่ เข้าได้ภายใน 3 วินาที และย้ำชัดว่าเป็นเพียงการทดลองส่วนตัว ไม่ใช่บริการทางการ
47 วินาที: จุดเริ่มต้นของความไม่สะดวก
- เวลา 11:15 น. ของวันธรรมดา การเปิดแอปที่หน้าทางเข้า PureGym ใช้เวลาถึง 47 วินาที
- สัญญาณอ่อน ต้องเชื่อมต่อ Wi-Fi เปิดแอป และกดข้ามการแจ้งเตือนต่างๆ รวมถึงข้อเสนอส่วนลดพิเศษ กว่า QR code จะปรากฏ
- ต้องรอนานกว่าจะเห็น QR code จริงๆ และทำให้รู้สึกเกรงใจสมาชิกคนอื่นที่รออยู่
- หากเกิดขึ้นสัปดาห์ละ 6 ครั้ง จะเสียเวลาไป 282 วินาทีต่อสัปดาห์กับประสบการณ์ที่ไม่มีประสิทธิภาพ
- เมื่อเทียบกับประสบการณ์แบบแทบไม่ต้องหยิบอะไรขึ้นมาใช้ของ Amazon Fresh แล้ว UX การเข้าใช้งานของ PureGym ถือว่าล้าหลังมาก
ปริศนาของ PIN อายุ 8 ปี
- ผู้เขียนใช้ รหัส PIN 8 หลัก เดิมมานาน 8 ปี
- PIN นี้ไม่เคยหมดอายุและไม่เคยถูกเปลี่ยน
- ในทางกลับกัน QR code ในแอป จะถูกเปลี่ยนเป็นค่าใหม่ทุก 1 นาที
- จึงเกิดความขัดแย้งอย่างมากระหว่างระดับความปลอดภัยที่แท้จริงกับการนำไปใช้จริง
- วิธีแบบ PIN ถูกปล่อยให้ใช้ได้นานผิดปกติ แต่ QR code กลับถูกปกป้องอย่างเข้มงวด เป็นสภาวะของ "การแสดงความปลอดภัย"
ทำความเข้าใจ PureGym ด้วย mitmproxy
- ตอนแรกผู้เขียนพยายามนำภาพหน้าจอ QR code ไปใส่ใน Apple Wallet แต่ใช้งานไม่ได้ทันที
- QR code ของ PureGym ถูกสร้างแบบไดนามิก หมดอายุราว 1 สัปดาห์ แต่ในแอปจะรีเฟรชทุก 1 นาที
- จากการค้นหาเรโปที่เกี่ยวกับ "PureGym" บน GitHub ทำให้พบโครงสร้างการยืนยันตัวตนของ API
- PIN 8 หลักสำหรับล็อกอินถูกใช้เป็นรหัสผ่าน API เช่นกัน
- ข้อมูล basic auth ที่เข้ารหัสด้วย Base64 ก็มีความปลอดภัยต่ำ
- เพื่อวิเคราะห์ทราฟฟิกของแอป ผู้เขียนจึงดักจับคำขอด้วยเครื่องมือพร็อกซีอย่าง mitmproxy
- โครงสร้าง JSON ของ QR code ประกอบด้วย part1 (id คงที่), part2 (timestamp), part3 (salt สำหรับรีเฟรช)
- API ยังบอกทั้งจังหวะการรีเฟรชและเงื่อนไขการหมดอายุไว้อย่างครบถ้วน
PassKit: ศักยภาพของ Apple Wallet
- pass ของ Apple Wallet ไม่ใช่แค่การ์ดแบบคงที่ แต่เป็นโครงสร้างคล้ายมินิแอปที่รองรับการรีเฟรชเอง การแจ้งเตือนแบบพุช และการตอบสนองตามตำแหน่ง
- การทำ PassKit ต้องมีทั้งสเปก JSON, ทรัพยากรรูปภาพ, การลงลายมือชื่อด้วยใบรับรอง และเว็บเซอร์วิสสำหรับการอัปเดตแบบเรียลไทม์
- จำเป็นต้องออก Pass Type ID และใบรับรอง WWDR จากพอร์ทัลนักพัฒนาของ Apple
- แม้การลงลายมือชื่อและการจัดการใบรับรองจะยุ่งยาก แต่เมื่อทำสำเร็จแล้วจะมอบประสบการณ์ที่ลื่นไหลบนอุปกรณ์จริง
สร้างแบ็กเอนด์ด้วย Swift
- แม้โดยทั่วไปจะใช้ Node.js แต่ผู้เขียนเลือกพัฒนาเว็บเซอร์วิส PassKit ด้วย Vapor ที่ใช้ Swift
- เมื่อ pass ต้องอัปเดต ระบบจะส่ง silent push เพื่ออัปเดตให้อัตโนมัติ
- ทำให้เกิดการรีเฟรช pass อย่างเป็นธรรมชาติโดยที่ผู้ใช้แทบไม่สังเกตเห็น
ทำระบบตำแหน่งของ PureGym ทั่วประเทศแบบอัตโนมัติ
- pass ของ Apple Wallet สามารถแสดงขึ้นมาอัตโนมัติเมื่ออยู่ในตำแหน่งที่กำหนด
- แม้เว็บไซต์ทางการของ PureGym จะไม่มีพิกัดละเอียด แต่ API ให้รายการพิกัดของทุกสาขาทั่วประเทศมาได้
- ผู้เขียนจึงพาร์สพิกัดของทุกสาขาและกำหนดสาขาใกล้เคียงให้กับแต่ละ pass
- ข้อเสียคือถ้า PureGym อยู่ในศูนย์การค้า pass ก็อาจเด้งขึ้นมาแม้จะแค่มาช้อปปิ้ง เป็นความรำคาญเล็กน้อย
การเชื่อมต่อกับ Apple Watch
- pass ของ Apple Wallet ซิงก์ไปยัง Apple Watch โดยอัตโนมัติโดยไม่ต้องตั้งค่าเพิ่ม
- แค่กดสองครั้งที่ข้อมือแล้วสแกน ใช้เวลาเพียง 3 วินาที จนเข้ายิมได้
- ลดเวลาได้มากกว่า 93%
การเปลี่ยนแปลงในรูปตัวเลข
- เวลาเข้าใช้งานผ่านแอป PureGym เดิม: 47 วินาที
- เวลาเข้าใช้งานผ่าน Apple Wallet pass: 3 วินาที
- เวลาเฉลี่ยที่ประหยัดได้ต่อสัปดาห์: 4.4 นาที (3.8 ชั่วโมงต่อปี)
- สมาชิกข้างๆ ถามว่า "มีแอปแบบนี้ด้วยเหรอ" 23 ครั้ง และผู้เขียนก็อธิบายทุกครั้งว่าไม่เป็นทางการ
- แม้จะมีคนขอ แต่ไม่มีแผนเผยแพร่เนื่องจากข้อจำกัดด้านลิขสิทธิ์และนโยบายบริการ
โบนัส: เชื่อมต่อกับ Home Assistant
- ใช้ endpoint ของ API สำหรับ จำนวนคนภายในยิม เพื่อแสดงความหนาแน่นปัจจุบันของยิมบนแดชบอร์ด IoT
- ช่วยตัดสินใจได้ว่าจะกลับมาในช่วงเวลาที่คนน้อยกว่าโดยอิงจากข้อมูล เพิ่มทั้งประสิทธิภาพและแรงจูงใจในการออกกำลังกาย
ความจริงและจริยธรรมของงานวิศวกรรม
- แม้จะเริ่มจากการแก้ปัญหาความไม่สะดวกส่วนตัวล้วนๆ แต่ก็เป็นจุดที่ PureGym ไม่ได้ปรับปรุงมาหลายปี
- บางครั้งต้นแบบที่สร้างจากภายนอกองค์กรก็แก้ปัญหาได้เร็วกว่าที่อยู่ในโรดแมปทางการ
- อย่างไรก็ตาม ในทางการแล้วสิ่งนี้อาจขัดต่อข้อกำหนดการใช้งาน และ PureGym สามารถบล็อกได้ทุกเมื่อ
- ผู้เขียนไม่ทำระบบอัตโนมัติหรือแชร์ต่อโดยเด็ดขาด ใช้เพื่อการทดลองส่วนตัวเท่านั้น และยึดหลักอย่างการแคชเพื่อความเสถียร
ขั้นต่อไปและบทสรุป
- ต่อไปอาจมีการเสนอไอเดียขยายผล เช่น "การแจ้งเตือนความอับอาย"
- แม้ประโยชน์เชิงรูปธรรมจะไม่ใหญ่มาก แต่ผู้เขียนก็พอใจกับการปรับลด "ขั้นตอนที่ไม่จำเป็น" ได้ปีละ 3.8 ชั่วโมง
- หาก PureGym นำไปทำเป็นฟีเจอร์ทางการ ก็อาจช่วยอำนวยความสะดวกให้ผู้ใช้ได้มากขึ้น
- จึงเป็นกรณีตัวอย่างของการสร้าง "ประสบการณ์ที่ไม่เป็นทางการแต่ได้ผล"
ยังไม่มีความคิดเห็น