1️⃣ Cloudflare hoặc Proxy Loại Bỏ refresh_token
Cloudflare và một số proxy có thể tự động loại bỏ các tiêu đề không chuẩn như refresh_token
.
🔹 Cách khắc phục: Đổi tên tiêu đề thành x-refresh-token
và cập nhật cả client & server.
Client Side (Apollo Link)
const authLink = setContext((_, { headers }) => { const token = localStorage.getItem('token'); const refreshToken = localStorage.getItem('refreshToken'); return { headers: { ...headers, authorization: token ? `Bearer ${token}` : "", "x-refresh-token": refreshToken ? `Bearer ${refreshToken}` : "" // Đổi tên key } }; });
Server Side (Context Extraction)
context: ({ headers }) => { console.log("Headers received:", headers); const authorization = headers.authorization || headers["Authorization"]; const refreshToken = headers["x-refresh-token"]; // Đổi tên key console.log("Authorization:", authorization); console.log("Refresh Token:", refreshToken); return { token: authorization?.replace("Bearer ", ""), refreshToken }; }
2️⃣ Chính Sách CORS Chặn refresh_token
Nếu máy chủ có hạn chế CORS, nó có thể không cho phép gửi tiêu đề refresh_token
.
🔹 Cách khắc phục: Cho phép refresh_token
trong middleware CORS.
Express Server
app.use(cors({ origin: "https://admin.smavi.men", allowedHeaders: ["Authorization", "x-refresh-token", "Content-Type"], credentials: true }));
GraphQL Middleware (Apollo Server)
const server = new ApolloServer({ schema, context: ({ req }) => { console.log("Headers received:", req.headers); return { token: req.headers.authorization?.replace("Bearer ", ""), refreshToken: req.headers["x-refresh-token"] }; }, cors: { origin: "https://admin.smavi.men", allowedHeaders: ["Authorization", "x-refresh-token", "Content-Type"], credentials: true } });
3️⃣ Trình Duyệt Tự Động Chặn Tiêu Đề
Một số trình duyệt (Chrome, Firefox) có thể tự động chặn tiêu đề tùy chỉnh nếu chúng không được CORS cho phép.
🔹 Cách khắc phục:
- Mở DevTools → Network → Nhấp vào request
- Kiểm tra xem
refresh_token
có xuất hiện trong request headers không.
4️⃣ Cloudflare Security Rules (WAF)
Cloudflare có thể tự động xóa refresh_token
như một biện pháp bảo mật.
🔹 Cách khắc phục:
- Đăng nhập vào Cloudflare Dashboard.
- Chuyển đến Security → WAF.
- Kiểm tra Firewall Rules → Xem có quy tắc nào loại bỏ
refresh_token
không. - Nếu có, hãy vô hiệu hóa hoặc chỉnh sửa quy tắc đó.
5️⃣ NGINX/Proxy Loại Bỏ Tiêu Đề
Nếu bạn sử dụng NGINX, HAProxy hoặc một proxy khác, chúng có thể loại bỏ tiêu đề.
🔹 Cách khắc phục: Cấu hình lại NGINX để cho phép refresh_token
.
Cấu hình NGINX
server { location /graphql { proxy_pass http://your_backend_server; proxy_set_header Authorization $http_authorization; proxy_set_header X-Refresh-Token $http_x_refresh_token; } }
✅ Các Bước Cuối Cùng:
✔ Đổi refresh_token
thành x-refresh-token
trên cả client và server. ✔ Cho phép x-refresh-token
trong cài đặt CORS. ✔ Kiểm tra DevTools (Network Tab) để xác nhận tiêu đề đã được gửi. ✔ Kiểm tra Cloudflare & Proxy để đảm bảo tiêu đề không bị loại bỏ.