1. Ý tưởng ban đầu
Bắt nguồn từ nhu cầu: một website WordPress đã có sẵn cộng đồng người dùng, nay muốn mở rộng diễn đàn bằng XenForo nhưng không muốn bắt người dùng tạo tài khoản mới. Giải pháp lý tưởng là Single Sign-On (SSO): người dùng chỉ cần login ở WordPress thì có thể vào XenForo luôn.2. Lựa chọn hướng đi
Ban đầu có hai lựa chọn:- Dùng Connected Account Provider của XenForo (kiểu OAuth).
- Hoặc can thiệp trực tiếp vào controller login của XenForo để tự viết luồng xác thực.
3. Plugin WordPress
Bước đầu tiên là viết một plugin nhỏ cho WordPress, cung cấp REST API:- /wp-json/xenforo-auth/v1/login → kiểm tra username/password trong WP, trả về JSON chứa thông tin user và một auth_token bí mật.
- /wp-json/xenforo-auth/v1/userinfo → trả thông tin user nếu token hợp lệ.
4. Add-on XenForo
Trên XenForo, mình extend controller XF\Pub\Controller\Login để custom:- Nếu có tham số login từ WordPress gửi sang → validate bằng token, lấy thông tin user.
- Nếu gọi trực tiếp form login của XenForo → gửi username/password qua API WordPress để xác thực.
5. Đồng bộ user
Khi nhận được thông tin user từ WP, add-on phải quyết định xử lý trong XenForo:- Chưa có user → tạo mới user trong XF.
- Đã có user → cập nhật mật khẩu, ép user_state = valid.
- Trùng username/email nhưng không khớp → báo lỗi (tránh ghi đè nhầm).
- User là admin/mod → chặn login qua SSO (bảo mật).
6. Các vấn đề gặp phải
Trong quá trình phát triển, có nhiều lỗi:- Abstract method: khi extend provider chưa implement đầy đủ method bắt buộc.
- Sai typehint: dùng class ConnectedAccountProvider thay vì entity XF\Entity\ConnectedAccountProvider.
- Error JSON: khi WP chưa trả về dữ liệu chuẩn, XenForo log “Invalid JSON từ WP”.
- user_state không lưu: ban đầu tưởng service PasswordChange sẽ tự save state, nhưng thực tế phải gọi $user->save() riêng.
7. Bảo mật
Điểm mấu chốt của giải pháp này là token bí mật.- XenForo khi gửi request qua WP luôn đính kèm xf_token.
- WordPress so sánh với token trong Settings, nếu sai thì từ chối.
- Token này phải trùng nhau và chỉ admin hai bên biết.
8. Kết quả
Khi hoàn tất, người dùng có trải nghiệm:- Login trên WordPress → tự động vào được XenForo.
- Nếu login từ XenForo → thông tin xác thực gửi sang WP, xác nhận, rồi trả về cho XF.
- User WP và XF đồng bộ, không bị tạo tài khoản trùng.
9. Bài học rút ra
- Tích hợp SSO giữa hai nền tảng khác nhau không hề đơn giản, phải xử lý rất nhiều edge case.
- Cần quan tâm đến bảo mật (token, chặn admin).
- Luôn log chi tiết khi call API để dễ debug.
- Việc gói gọn logic xử lý user trong một hàm riêng giúp code dễ bảo trì hơn.
Tóm lại addon đã hoàn thành, bạn nào cần, liên hệ mình nha.
Bài viết liên quan
Được quan tâm
Bài viết mới