Proxy ใน Angular: แก้ปัญหา CORS

Aug. 25, 2024 · boychawin

เรามาทำความเข้าใจและใช้งาน Proxy ใน Angular เพื่อแก้ไขปัญหา CORS

ในการพัฒนาแอปพลิเคชัน Angular โดยเฉพาะอย่างยิ่งเมื่อต้องเรียกใช้ API จากโดเมนอื่น ๆ เราจะพบเจอกับปัญหา CORS (Cross-Origin Resource Sharing) ซึ่งเป็นกลไกความปลอดภัยของเบราว์เซอร์ที่จำกัดการเข้าถึงทรัพยากรจากโดเมนอื่น ๆ เพื่อป้องกันการโจมตีแบบ Cross-Site Request Forgery (CSRF)

Proxy คืออะไร?

Proxy เป็นเหมือนตัวกลางที่ทำหน้าที่รับและส่งต่อคำขอ (request) ไปยังเซิร์ฟเวอร์เป้าหมาย โดยไม่ให้ client (คือ browser ของเรา) รู้ว่ากำลังเชื่อมต่อกับเซิร์ฟเวอร์อื่นอยู่ ทำให้เราสามารถหลีกเลี่ยงปัญหา CORS ได้

การตั้งค่า Proxy ใน Angular

Angular CLI มีฟีเจอร์ที่ช่วยให้เราสามารถตั้งค่า Proxy ได้ง่าย ๆ ผ่านไฟล์ proxy.conf.json และตัวเลือก --proxy-config ในคำสั่ง ng serve

ตัวอย่างไฟล์ proxy.conf.json:


{
  "/api": {
    "target": "https://your-api-endpoint.com",
    "secure": true,
    "changeOrigin": true
  }
}

  • /api: คือ path ที่เราจะใช้ในการเรียก API ใน Angular
  • target: https://your-api-endpoint.com: คือ URL ของ API ที่เราต้องการจะเชื่อมต่อ
  • secure: true: กำหนดให้การเชื่อมต่อกับ API ใช้ HTTPS
  • changeOrigin: true: กำหนดให้ header ของ request ที่ส่งไปยัง API ถูกเปลี่ยนแปลง เพื่อให้ API คิดว่า request นั้นมาจาก client โดยตรง

การตั้งค่า angular.json

// เพิ่ม  pvt ใน configurations:{...}
"pvt": {
  "fileReplacements": [
  {
    "replace": "src/environments/environment.ts",
    "with": "src/environments/environment.pvt.ts"
  }
    ]
  },
// เพิ่ม  pvt ใน serve :{...}
"pvt": {
  "buildTarget": "app:build:pvt"
}

การตั้งค่า environment

สร้างไฟล์ src/environments/environment.pvt.ts และ environment.ts เพื่อความสะดวกในการจัดการและปรับเปลี่ยนค่า

//environment.ts
export const environment: any = {
    name: 'develop',
    production: false,
    baseAPIURL: '/api',
}

//environment.pvt.ts
export const environment: any = {
    name: 'pvt',
    production: false,
    baseAPIURL: '/api',
}

ตัวอย่างการใช้งาน

ตัวอย่างโค้ด Angular:


import { HttpClient } from '@angular/common/http';

constructor(private http: HttpClient) {}

getData() {
  return this.http.get('/data');
}


ng serve --host 0.0.0.0 -c pvt --proxy-config proxy.conf.json

เมื่อเรารันคำสั่งนี้ Angular CLI จะเริ่มต้น Server และอ่านค่าจากไฟล์ proxy.conf.json เมื่อเราเรียก API ใน Angular โดยใช้ path /api Angular จะทำการส่งต่อ request นั้นไปยัง URL ที่กำหนดไว้ใน target

เหตุผลที่ควรใช้ Proxy

  • แก้ไขปัญหา CORS: ช่วยให้เราสามารถเรียกใช้ API จากโดเมนอื่น ๆ ได้
  • เพิ่มความปลอดภัย: สามารถใช้ Proxy เพื่อเพิ่มชั้นความปลอดภัยในการสื่อสารระหว่าง client และ server
  • จัดการ traffic: สามารถใช้ Proxy เพื่อจัดการ traffic และทำ caching ได้
  • ง่ายต่อการใช้งาน: Angular CLI ทำให้การตั้งค่า Proxy เป็นเรื่องง่าย

สรุป

การใช้ Proxy ใน Angular เป็นวิธีการที่ง่ายและมีประสิทธิภาพในการแก้ไขปัญหา CORS และช่วยให้เราสามารถพัฒนาแอปพลิเคชัน Angular ได้อย่างราบรื่นมากยิ่งขึ้น โดยเฉพาะอย่างยิ่งเมื่อต้องทำงานกับ API ที่อยู่บนโดเมนที่แตกต่างกัน