Ghost CMS đăng nhập được máy này nhưng máy khác bị lỗi 403: Cách sửa lỗi staffDeviceVerification trên Docker và cPanel

Ghost CMS đăng nhập được trên máy hiện tại nhưng khi đăng nhập từ máy tính khác lại gặp lỗi 403, You are not authorised to make this request hoặc Failed to send email. Nguyên nhân thường liên quan đến tính năng xác minh thiết bị mới của Ghost và cấu hình email.

NHT
· 7 phút đọc
Ghost CMS đăng nhập được máy này nhưng máy khác bị lỗi 403: Cách sửa lỗi staffDeviceVerification trên Docker và cPanel

Ghost CMS đăng nhập được máy này nhưng máy khác không được là lỗi gì?

Một tình huống khá dễ gặp khi tự host Ghost CMS là bạn vẫn đăng nhập Ghost Admin bình thường trên máy tính đang sử dụng, nhưng khi mở Ghost trên một máy tính khác thì đăng nhập lại không thành công.

Một số lỗi thường xuất hiện trong Developer Console hoặc log của Ghost như:

Failed to load resource: the server responded with a status of 403
You are not authorised to make this request.

Hoặc:

POST /ghost/api/admin/session 500

và:

Failed to send email. Please check your site configuration and try again.

Trong trường hợp này, lỗi chưa chắc nằm ở tài khoản hoặc mật khẩu.

Từ Ghost 6.x, Ghost có cơ chế Device Verification dành cho tài khoản staff. Khi đăng nhập từ một thiết bị mới hoặc chưa được nhận diện, Ghost có thể yêu cầu mã xác minh được gửi tới email của tài khoản. Ghost cho biết tính năng xác minh thiết bị và email-based 2FA được thiết kế như một lớp bảo vệ bổ sung cho tài khoản staff.

Nếu hệ thống email của Ghost chưa được cấu hình hoặc đang gửi mail thất bại, quá trình tạo session đăng nhập có thể không hoàn tất. Khi đó giao diện Admin tiếp tục gọi các API như /ghost/api/admin/users/me/ nhưng Ghost trả về 403.


Dấu hiệu để xác định đúng nguyên nhân

Mở F12 → Console trên máy không đăng nhập được. Nếu bạn thấy các lỗi tương tự:

/ghost/api/admin/users/me/?include=roles
403
You are not authorised to make this request.

và đặc biệt:

/ghost/api/admin/session
500

thì hãy kiểm tra log Ghost.

Trong log, bạn có thể thấy:

Failed to send email. Please check your site configuration and try again.
Error Code: ESOCKET

hoặc:

Missing mail.from config

Đây là dấu hiệu cho thấy Ghost đang cố thực hiện bước xác minh đăng nhập nhưng hệ thống email chưa hoạt động đúng.


Cách 1: Sửa Ghost CMS chạy bằng Docker

Đây là cách phù hợp với những website Ghost được triển khai bằng Docker Compose hoặc Docker trên VPS.

Bước 1: Kiểm tra tên container Ghost

Chạy:

docker ps

Kết quả sẽ hiển thị danh sách container đang chạy, ví dụ:

CONTAINER ID   IMAGE           PORTS                      NAMES
xxxxxxxxxxxx   ghost:6-alpine  127.0.0.1:2369->2368/tcp  your-ghost-container

Hãy xác định tên container Ghost trong cột NAMES. Trong các lệnh bên dưới, thay <ghost-container> bằng tên container thực tế của bạn.


Bước 2: Backup file cấu hình

Trước khi chỉnh sửa, nên tạo một bản sao lưu:

docker exec <ghost-container> cp \
/var/lib/ghost/config.production.json \
/var/lib/ghost/config.production.json.bak

Việc backup giúp bạn dễ dàng khôi phục nếu cấu hình có vấn đề.


Bước 3: Tắt Device Verification

Nếu file cấu hình đã có:

"security": {
  "staffDeviceVerification": true
}

hãy đổi thành:

"security": {
  "staffDeviceVerification": false
}

Không có trình soạn thảo vi thì làm sao?

Một số image Ghost Alpine không có sẵn các công cụ chỉnh sửa quen thuộc như vi.

Bạn có thể sửa trực tiếp bằng sed:

docker exec <ghost-container> sed -i \
's/"staffDeviceVerification": true/"staffDeviceVerification": false/' \
/var/lib/ghost/config.production.json

Sau đó kiểm tra:

docker exec <ghost-container> grep -A2 staffDeviceVerification \
/var/lib/ghost/config.production.json

Nếu kết quả là:

"staffDeviceVerification": false

thì cấu hình đã được thay đổi.


Bước 4: Restart container Ghost

Chạy:

docker restart <ghost-container>

Chờ container khởi động xong rồi mở lại:

https://domain-cua-ban/ghost/

Sau đó thử đăng nhập trên máy tính trước đó không đăng nhập được.


Nếu file chưa có security

Bạn có thể thêm:

"security": {
  "staffDeviceVerification": false
}

Ví dụ:

{
  "url": "https://example.com",

  "server": {
    "port": 2368,
    "host": "::"
  },

  "mail": {
    "transport": "Direct"
  },

  "security": {
    "staffDeviceVerification": false
  }
}

Sau khi lưu cấu hình:

docker restart <ghost-container>

Cách 2: Sửa Ghost CMS trên cPanel

Nếu Ghost được triển khai trên hosting cPanel thông qua Node.js App, bạn có thể sửa trực tiếp file cấu hình bằng File Manager.

Bước 1: Mở File Manager

Đăng nhập:

cPanel
→ File Manager

Tìm tới thư mục chứa Ghost.

Tìm file:

config.production.json

Bước 2: Mở file config.production.json

Nhấn chuột phải vào file và chọn Edit.

Tìm đoạn:

"security": {
  "staffDeviceVerification": true
}

đổi thành:

"security": {
  "staffDeviceVerification": false
}

Sau đó nhấn Save Changes.


Nếu file chưa có staffDeviceVerification

Bạn có thể thêm:

"security": {
  "staffDeviceVerification": false
}

Ví dụ:

{
  "url": "https://example.com",

  "server": {
    "port": 2368,
    "host": "::"
  },

  "security": {
    "staffDeviceVerification": false
  }
}

Nếu file đã có object security, không tạo thêm một object security thứ hai. Chỉ cần thêm thuộc tính:

"staffDeviceVerification": false

vào object hiện có.


Bước 3: Restart Node.js App

Sau khi lưu config.production.json, quay lại cPanel:

cPanel
→ Setup Node.js App

Tìm ứng dụng Ghost đang chạy.

Nhấn:

Restart

hoặc Restart App tùy giao diện cPanel.

Sau khi ứng dụng khởi động lại, mở lại:

https://domain-cua-ban/ghost/

và thử đăng nhập trên máy tính khác.


Vì sao sửa staffDeviceVerification lại giải quyết được lỗi?

Ghost có cơ chế xác minh thiết bị đối với staff user. Khi phát hiện đăng nhập từ thiết bị mới, Ghost có thể yêu cầu mã xác minh gửi tới email của tài khoản.

Nếu hệ thống email của Ghost không hoạt động, bước tạo session có thể thất bại.

Khi đó bạn có thể thấy chuỗi lỗi:

POST /ghost/api/admin/session
        ↓
Failed to send email
        ↓
Session không được tạo
        ↓
GET /ghost/api/admin/users/me/
        ↓
403 Authorization failed

Đây là lý do một máy đã từng đăng nhập có thể vẫn sử dụng Ghost bình thường, trong khi một máy khác lại không thể đăng nhập.


Có nên tắt staffDeviceVerification không?

Có thể tắt, đặc biệt khi bạn đang self-host Ghost và chưa cấu hình email xác minh.

Tuy nhiên cần lưu ý rằng Device Verification là một tính năng bảo mật, không phải tùy chọn thừa. Ghost giới thiệu tính năng này để tăng mức bảo vệ cho staff user khi đăng nhập từ thiết bị mới.

Nếu website của bạn là website production và có nhiều tài khoản quản trị, giải pháp tốt hơn là:

Cấu hình email/SMTP cho Ghost để mã xác minh có thể được gửi thành công, thay vì tắt hoàn toàn cơ chế xác minh thiết bị.

Ghost cũng khuyến nghị self-hosted instance phải cấu hình email đúng để các email liên quan tới staff user hoạt động bình thường.


Cách kiểm tra sau khi sửa

Sau khi restart Ghost, hãy kiểm tra theo thứ tự:

1. Mở Ghost Admin

https://domain-cua-ban/ghost/

2. Đăng nhập từ máy khác

Nhập email và mật khẩu như bình thường.

3. Kiểm tra Developer Console

Nếu lỗi đã được xử lý, các request như:

/ghost/api/admin/users/me/

sẽ không còn trả về:

403

4. Kiểm tra log Docker

Với Docker:

docker logs --tail 100 <ghost-container>

Không nên còn lỗi:

Failed to send email

hoặc:

ESOCKET

Một lưu ý quan trọng với Docker

Nếu bạn sửa trực tiếp:

/var/lib/ghost/config.production.json

bên trong container, thay đổi có thể không phải là nơi cấu hình lâu dài nếu Docker Compose của bạn quản lý cấu hình từ file hoặc biến môi trường bên ngoài.

Vì vậy, sau khi xác nhận lỗi đã được sửa, bạn nên kiểm tra docker-compose.yml và volume của Ghost để biết cấu hình thực sự đang được quản lý ở đâu.

Đặc biệt khi nâng cấp hoặc recreate container, việc sửa trực tiếp bên trong container có thể không được giữ nguyên.


Giải pháp lâu dài: cấu hình email cho Ghost

Tắt:

"staffDeviceVerification": false

là cách xử lý nhanh lỗi đăng nhập trên thiết bị mới.

Nhưng với website production, bạn nên cấu hình email cho Ghost để:

  • xác minh thiết bị mới;
  • email xác thực staff;
  • reset mật khẩu;
  • lời mời thành viên trong team;
  • các email hệ thống khác

có thể hoạt động bình thường.

Khi email được cấu hình đúng, bạn có thể bật lại:

"staffDeviceVerification": true

để tăng bảo mật cho Ghost Admin.


Tóm tắt cách sửa nhanh

Ghost chạy Docker

Trước tiên, kiểm tra tên container:

docker ps

Sau đó thay <ghost-container> bằng tên container Ghost thực tế:

docker exec <ghost-container> sed -i \
's/"staffDeviceVerification": true/"staffDeviceVerification": false/' \
/var/lib/ghost/config.production.json

docker restart <ghost-container>

Ghost chạy trên cPanel + Node.js App

Mở:

File Manager
→ config.production.json

Sửa:

"staffDeviceVerification": true

thành:

"staffDeviceVerification": false

Nếu chưa có thì thêm:

"security": {
  "staffDeviceVerification": false
}

Sau đó:

Save
→ cPanel
→ Setup Node.js App
→ Restart

và thử đăng nhập lại.


Kết luận

Nếu Ghost CMS đăng nhập được trên máy này nhưng không đăng nhập được trên máy khác, đặc biệt khi Console xuất hiện 403/ghost/api/admin/session trả 500, hãy kiểm tra Device Verification và cấu hình email trước.

Với trường hợp Ghost không gửi được email xác minh, tạm thời đặt:

"staffDeviceVerification": false

sau đó restart Ghost là cách xử lý nhanh và thực tế.

Tuy nhiên, với website production, nên ưu tiên cấu hình email/SMTP đúng và bật lại Device Verification để giữ lớp bảo vệ cho tài khoản quản trị.