Fix Lỗi CORS Khi Làm Việc Với Service Layer API thuộc SAP B1

Làm việc với SAP Business One (SAP B1) thông qua Service Layer API có thể gặp phải lỗi CORS (Cross-Origin Resource Sharing), đặc biệt khi bạn cần gọi API từ một ứng dụng front-end trên một miền khác. Để giải quyết vấn đề này, sử dụng một gateway service được xây dựng với express-http-proxy trong Node.js là một giải pháp hiệu quả.

Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng express-http-proxy để thiết lập một gateway, giải quyết lỗi CORS khi làm việc với Service Layer API của SAP B1.

Tại Sao Gặp Lỗi CORS Với SAP B1?

Service Layer API của SAP B1 không được thiết kế sẵn để hỗ trợ CORS. Điều này dẫn đến việc trình duyệt chặn các yêu cầu từ một miền khác mà không có header Access-Control-Allow-Origin. Ví dụ, khi front-end chạy trên http://localhost:3000 gửi yêu cầu tới https://sap-server:50000, bạn có thể nhận được lỗi sau:

Access to XMLHttpRequest at 'https://sap-server:50000/b1s/v1/Login' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

Giải Quyết Lỗi Bằng express-http-proxy

Thay vì gọi trực tiếp API của SAP B1 từ front-end, chúng ta sẽ tạo một gateway service trung gian. Gateway này sẽ:

  1. Chấp nhận yêu cầu từ front-end.
  2. Chuyển tiếp yêu cầu đến SAP B1 Service Layer.
  3. Nhận phản hồi từ SAP B1 và trả lại cho front-end.

Điều này không chỉ giải quyết lỗi CORS mà còn bảo mật hơn khi bạn giấu thông tin endpoint SAP B1 khỏi client.

Cách Thiết Lập Gateway Service

1. Cài Đặt Các Gói Cần Thiết

Trước tiên, cài đặt Node.js và các gói sau:

yarn add express express-http-proxy cors body-parser

2. Tạo File Gateway

Tạo file index.js và thêm nội dung sau:

const express = require("express");
const httpProxy = require("express-http-proxy");
const cors = require("cors");
const bodyParser = require("body-parser");
const https = require("https");

const app = express();
const SERVICE_LAYER_HOST = "192.168.1.10";
const SERVICE_LAYER_PORT = "50000";
const PORT = 3000;
const SAP_SERVICE_URL = `https://${SERVICE_LAYER_HOST}:${SERVICE_LAYER_PORT}/b1s/v1`;
const agent = new https.Agent({
  rejectUnauthorized: false,
});

app.use(cors());
app.use(bodyParser.json()); 

app.use(
  "/b1s/v1",
  httpProxy(SAP_SERVICE_URL, {
    proxyReqPathResolver: (req) => {
      return req.originalUrl;
    },
    proxyReqOptDecorator: (proxyReqOpts) => {
      proxyReqOpts.agent = agent;
      return proxyReqOpts;
    },
  })
);

app.listen(PORT, () => {
  console.log(`Gateway service layer running at http://localhost:${PORT}`);
});

Link source code tham khảo: https://github.com/anhocva214/blog-code-example/tree/main/sapb1-service-layer-gateway

3. Sử Dụng Gateway Từ Front-end

Gửi Yêu Cầu Tới Gateway

Trong ứng dụng front-end (ví dụ React hoặc Angular), thay vì gọi trực tiếp API SAP B1, bạn gửi yêu cầu tới Gateway:

import axios from 'axios';

const gatewayUrl = 'http://localhost:4000/sap';

// Gọi API Login qua Gateway
async function sapLogin() {
  try {
    const response = await axios.post(`${gatewayUrl}/Login`, {
      CompanyDB: 'SBODEMO',
      UserName: 'manager',
      Password: 'manager',
    });
    console.log('Login Success:', response.data);
  } catch (error) {
    console.error('Login Error:', error.response?.data || error.message);
  }
}

sapLogin();

4. Cải Tiến Gateway

Hạn Chế Domain Truy Cập

Để tăng bảo mật, bạn có thể cấu hình middleware CORS chỉ cho phép một số domain nhất định:

app.use(
  cors({
    origin: ['https://your-frontend-domain.com'], // Chỉ cho phép các domain được chỉ định
  })
);

Sử Dụng HTTPS

Nếu bạn triển khai gateway trên môi trường production, hãy sử dụng HTTPS để đảm bảo an toàn dữ liệu.

Kết Luận

Sử dụng express-http-proxy để tạo một gateway service không chỉ giúp giải quyết lỗi CORS mà còn tạo ra một tầng trung gian linh hoạt, dễ quản lý và bảo mật hơn khi làm việc với Service Layer API của SAP B1. Hy vọng bài viết này sẽ giúp bạn triển khai thành công.

Previous Article

Tìm Hiểu Về Lỗi CORS: Nguyên Nhân Và Cách Khắc Phục

Next Article

Deploy theo cách đơn giản: Phần 1. Giới thiệu về Linux Server, VPS và nhà cung cấp VPS

Write a Comment

Leave a Comment

Your email address will not be published. Required fields are marked *

Nhận thông báo mới

Để lại email để nhận thông báo về bài viết mới
Thông báo chất lượng, không spam ✨