- Để giải quyết trải nghiệm chậm chạp của ứng dụng PureGym và quy trình vào cửa rườm rà, tác giả đã tự tối ưu hóa bằng Apple Wallet
- Mã QR hiện có là một cách vào cửa kém hiệu quả vì mỗi lần đều phải mở ứng dụng và tải thông tin, mất khoảng 47 giây
- Thông qua nhiều bước kỹ thuật như reverse engineering, sử dụng mitmproxy và framework PassKit, tác giả đã triển khai thẻ Wallet có thể tự động làm mới
- Trong quá trình này, tác giả xác nhận được cách PureGym vận hành nội bộ qua những gì lộ ra trên web, như lỗ hổng bảo mật của mã PIN, cấu trúc xác thực API và thông tin vị trí các chi nhánh
- Cuối cùng, tác giả tạo ra trải nghiệm người dùng vào cửa chỉ trong 3 giây, đồng thời làm rõ đây chỉ là thử nghiệm cá nhân và không phải dịch vụ chính thức
47 giây: khởi đầu của sự bất tiện
- Vào 11:15 sáng một ngày trong tuần, tác giả mất 47 giây để mở ứng dụng ở lối vào PureGym
- Tín hiệu yếu, phải kết nối Wi‑Fi rồi mở ứng dụng, bỏ qua đủ loại thông báo đẩy và ưu đãi đặc biệt thì mã QR mới hiện ra
- Phải chờ khá lâu để mã QR thực sự xuất hiện, khiến tác giả ngại ngùng vì những thành viên khác đang đứng nhìn
- Nếu lặp lại 6 lần mỗi tuần, đây là trải nghiệm lãng phí tổng cộng 282 giây mỗi tuần
- So với trải nghiệm gần như không ma sát như Amazon Fresh, UX vào cửa của PureGym bị tụt hậu rất xa
Bí ẩn của mã PIN đã tồn tại 8 năm
- Tác giả đã dùng cùng một mã PIN 8 chữ số suốt 8 năm
- Mã PIN này không hết hạn cũng không thay đổi
- Trong khi đó, mã QR trong ứng dụng lại được thay bằng giá trị mới mỗi phút
- Có một mâu thuẫn lớn giữa mức độ bảo mật thực tế và cách triển khai thực tế
- Cách dùng PIN được giữ nguyên quá lâu, trong khi chỉ riêng mã QR bị bảo vệ nghiêm ngặt, tạo nên một hiện tượng kiểu "trình diễn bảo mật"
Hiểu PureGym bằng mitmproxy
- Ban đầu, tác giả định đưa ảnh chụp màn hình mã QR vào Apple Wallet để dùng, nhưng lập tức không hoạt động
- Mã QR của PureGym được tạo động, hết hạn sau khoảng 1 tuần nhưng trong ứng dụng lại được làm mới mỗi phút
- Tìm kiếm các repo liên quan đến "PureGym" trên GitHub giúp tác giả phát hiện cấu trúc xác thực API
- Mã PIN 8 chữ số dùng để đăng nhập cũng chính là mật khẩu API
- Thông tin xác thực cơ bản được mã hóa bằng Base64 cũng có mức độ an toàn thấp
- Để phân tích lưu lượng của ứng dụng, tác giả chặn các yêu cầu bằng công cụ proxy như mitmproxy
- Cấu trúc JSON của mã QR gồm part1 (id cố định), part2 (timestamp), part3 (salt để làm mới)
- API còn hướng dẫn đầy đủ cả thời điểm làm mới lẫn điều kiện hết hạn
PassKit: tiềm năng của Apple Wallet
- Thẻ Apple Wallet không phải thẻ tĩnh mà là một cấu trúc kiểu mini app có thể tự làm mới, gửi thông báo đẩy và phản ứng theo vị trí
- Việc triển khai PassKit cần có đặc tả JSON, tài nguyên hình ảnh, chữ ký chứng chỉ và web service cho cập nhật thời gian thực
- Cần cấp Pass Type ID và chứng chỉ WWDR từ cổng nhà phát triển của Apple
- Việc ký và quản lý chứng chỉ khá phiền phức, nhưng nếu làm được thì trải nghiệm trên thiết bị thực rất mượt mà
Xây dựng backend bằng Swift
- Dù thông thường sẽ dùng Node.js, tác giả đã tự triển khai web service PassKit bằng Vapor dựa trên Swift
- Khi cần cập nhật thẻ, hệ thống cung cấp tự động qua silent push
- Nhờ đó có thể hiện thực hóa việc làm mới thẻ một cách tự nhiên mà người dùng không hề nhận ra
Tự động hóa vị trí toàn bộ PureGym trên toàn quốc
- Thẻ Apple Wallet có thể tự động hiển thị ở vị trí được chỉ định
- Trang web chính thức của PureGym không có tọa độ chi tiết, nhưng API lại cung cấp danh sách tọa độ các chi nhánh trên toàn quốc
- Tác giả phân tích toàn bộ tọa độ chi nhánh và chỉ định chi nhánh gần nhất cho từng thẻ
- Nhược điểm: nếu PureGym nằm trong trung tâm mua sắm, thẻ vẫn có thể hiện lên ngay cả khi chỉ đi mua sắm, gây một chút phiền toái
Đồng bộ với Apple Watch
- Thẻ Apple Wallet tự động đồng bộ sang Apple Watch mà không cần thao tác bổ sung
- Chỉ cần bấm hai lần trên cổ tay rồi quét, tổng thời gian đến lúc vào cửa rút xuống còn 3 giây
- Giảm được hơn 93% thời gian
Thay đổi nhìn qua con số
- Thời gian vào cửa bằng ứng dụng PureGym cũ: 47 giây
- Thời gian vào cửa bằng thẻ Apple Wallet: 3 giây
- Thời gian tiết kiệm trung bình mỗi tuần: 4,4 phút (3,8 giờ mỗi năm)
- Các thành viên xung quanh đã hỏi 23 lần rằng "có ứng dụng như vậy à", và tác giả đều giải thích rằng đây là giải pháp không chính thức
- Dù có người muốn dùng, tác giả không có kế hoạch phát hành vì vấn đề bản quyền/chính sách dịch vụ
Phần thưởng thêm: tích hợp Home Assistant
- Thông qua endpoint số người trong phòng tập của API PureGym, tác giả hiển thị mức độ đông đúc hiện tại của phòng gym trên dashboard IoT
- Có thể quyết định quay lại vào giờ vắng người hơn dựa trên dữ liệu, qua đó tăng hiệu quả và động lực tập luyện
Thực tế kỹ thuật và khía cạnh đạo đức
- Dù chỉ bắt đầu từ việc giải quyết một sự bất tiện cá nhân, đây lại là khu vực mà bên trong PureGym không cải thiện suốt nhiều năm
- Một prototype được tạo ra từ bên ngoài tổ chức đôi khi giải quyết vấn đề nhanh hơn cả roadmap chính thức
- Tuy vậy, về mặt chính thức thì điều này có thể vi phạm điều khoản sử dụng và PureGym có thể chặn bất cứ lúc nào
- Tác giả tuyệt đối không tự động hóa/chia sẻ cho người khác, chỉ dùng cho thử nghiệm cá nhân và tuân thủ các nguyên tắc như dùng cache để đảm bảo ổn định
Bước tiếp theo và lời kết
- Về sau có thể đề xuất các ý tưởng mở rộng như "thông báo đẩy xấu hổ"
- Giá trị thực tế có thể nhỏ, nhưng tác giả hài lòng vì đã tối ưu được 3,8 giờ mỗi năm cho những "thao tác không cần thiết"
- Nếu PureGym triển khai chính thức, nhiều người dùng hơn sẽ được hưởng sự tiện lợi này
- Đây được xem là một trường hợp tạo ra "trải nghiệm không chính thức nhưng hiệu quả"
Chưa có bình luận nào.