Thực hiện CORS (Chia sẻ nguồn chéo) trong Go

Khái niệm chia sẻ nguồn chéo

Hai URL được coi là cùng nguồn nếu chúng có cùng giao thức, cổng (nếu có) và tên miền. Ví dụ, https://example.com/page1https://example.com/page2 thuộc cùng một nguồn.

CORS là gì?

CORS (Cross-Origin Resource Sharing) là cơ chế cho phép tài nguyên trên trang web được truy cập từ các miền khác nhau. Cơ chế này giúp trình duyệt xác thực an toàn trước khi thực hiện yêu cầu chéo miền. Với CORS, các yêu cầu AJAX hoặc phương thức HTTP như POST, PUT sẽ được kiểm tra bằng cách gửi yêu cầu OPTIONS trước để xác định xem server có cho phép hay không.

Cách triển khai trong Go

Dưới đây là ví dụ sử dụng package gin-gonic để tạo middleware xử lý CORS:
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    router := gin.Default()

    // Middleware xử lý CORS
    handleCORS := func(ctx *gin.Context) {
        // Cho phép tất cả miền
        ctx.Writer.Header().Set("Access-Control-Allow-Origin", "*")
        // Các phương thức được phép
        ctx.Writer.Header().Set("Access-Control-Allow-Methods", "GET, POST, PATCH, DELETE")
        // Các header được phép
        ctx.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization")
        // Cho phép gửi cookie
        ctx.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
        // Tiếp tục xử lý request
        ctx.Next()
    }

    // Áp dụng middleware cho toàn bộ route
    router.Use(handleCORS)

    // Route demo
    router.GET("/test", func(ctx *gin.Context) {
        ctx.String(http.StatusOK, "CORS đã được cấu hình")
    })

    router.Run(":8080")
}

Kết quả kiểm tra

Khi truy cập endpoint /test, bạn sẽ thấy các header sau trong response:
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type, Accept, Authorization
Access-Control-Allow-Methods: GET, POST, PATCH, DELETE
Access-Control-Allow-Origin: *
Content-Type: text/plain; charset=utf-8
Date: Mon, 16 Oct 2023 08:00:00 GMT
Content-Length: 20

CORS đã được cấu hình

Thử nghiệm với curl

Sử dụng lệnh sau để kiểm tra:
curl -i http://localhost:8080/test
Nếu thấy các header CORS trong output, nghĩa là cấu hình đã thành công.

Thẻ: Go CORS Gin HTTP-Headers

Đăng vào ngày 18 tháng 5 lúc 20:52