Gorilla Session - Giải pháp xác thực người dùng qua Cookie hiệu quả

Để giải quyết vấn đề tạo cookie không mong muốn và xử lý phiên người dùng hiệu quả hơn khi sử dụng các route phức tạp với Gorilla Mux, bạn có thể chuyển sang sử dụng Gorilla Sessions thay vì tự quản lý cookie thủ công. Gorilla Sessions cung cấp một cách tiện lợi và an toàn hơn để quản lý phiên làm việc.

Dưới đây là cách bạn có thể chuyển đổi việc quản lý session với Gorilla Sessions:

Cài đặt Gorilla Sessions: Bạn cần cài đặt gói gorilla/sessions nếu chưa có:

go get github.com/gorilla/sessions

Cấu hình Store cho session: Thay vì tự tạo và quản lý cookie, bạn sẽ sử dụng một store để lưu trữ session. Bạn có thể chọn sử dụng cookie store hoặc file store, nhưng để đơn giản, dưới đây là ví dụ với cookie store:

var store = sessions.NewCookieStore([]byte("your-secret-key"))

Sửa đổi các hàm xác thực: Chuyển đổi các hàm hiện tại để sử dụng session của Gorilla. Dưới đây là ví dụ cách sửa đổi:

GetUser:

func GetUser(w http.ResponseWriter, req *http.Request) models.User {
    session, _ := store.Get(req, "session")
    
    // Check if user is already in session
    if un, ok := session.Values["username"].(string); ok {
        var u models.User
        u = config.DbUsers[un]
        return u
    }
    
    return models.User{} // Return an empty user if not logged in
}

AlreadyLoggedIn:

func AlreadyLoggedIn(w http.ResponseWriter, req *http.Request) bool {
    session, _ := store.Get(req, "session")

    // Check if the session contains a valid username
    if un, ok := session.Values["username"].(string); ok {
        _, userExists := config.DbUsers[un]
        if userExists {
            // Refresh session activity
            session.Values["last_activity"] = time.Now()
            session.Save(req, w)
            return true
        }
    }
    return false
}

Tự động lưu và làm mới session: Mỗi lần bạn cập nhật thông tin hoặc thực hiện hành động với session, bạn cần gọi session.Save(req, w) để lưu session và gửi lại cookie cho client:

session.Save(req, w)

Bằng cách sử dụng Gorilla Sessions, việc quản lý cookie và session sẽ trở nên an toàn và tiện lợi hơn mà không cần lo lắng về việc tự động tạo cookie ngoài ý muốn khi dùng các route phức tạp.