Tutorial 2x Hành trình tạo add-on đăng nhập XenForo bằng WordPress

Blue

Founder
Thành viên BQT

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.

dang-nhap-xenforo-bang-wordpress.png

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.
Sau một thời gian thử nghiệm, cách thứ hai đơn giản và chủ động hơn, vì chỉ cần kiểm soát bên WordPress và custom code trong XenForo.

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ệ.
Plugin có trang Settings để cấu hình XenForo URLAPI Token (chuỗi bí mật dùng chung giữa WP và XF).

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.
Ở đây sử dụng cURL thuần để gọi REST API của WordPress, tránh phụ thuộc thư viện ngoài.

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).
Đoạn code xử lý được gói gọn trong hàm syncUser(), vừa tạo mới vừa update khi cần.

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.
Mỗi bước đều phải debug log, kiểm tra DB và chỉnh lại.

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.
Nhờ đó tránh bị giả mạo request.

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.
Add-on gọn nhẹ, không phụ thuộc plugin bên ngoài.

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.
Đây là toàn bộ hành trình từ ý tưởng đến hoàn thiện đăng nhập XenForo bằng WordPress. Dù chưa phải là một giải pháp OAuth/OpenID chuẩn, nhưng đủ nhẹ và hiệu quả cho nhu cầu đồng bộ login giữa WordPress và XenForo.

Tóm lại addon đã hoàn thành, bạn nào cần, liên hệ mình nha.
 
Back
Top