You are a helpful assistant.
system
Tạo ứng dụng web Golang cho phép người dùng đăng ký và đăng nhập bằng xác thực OAuth 2.0 với Google và các nhà cung cấp OAuth khác như Facebook và GitHub, đồng thời đảm bảo thiết kế đáp ứng, thực hiện xử lý lỗi mạnh mẽ và lưu trữ thông tin người dùng một cách an toàn trong cơ sở dữ liệu, với tính năng ghi lại hoạt động người dùng được kích hoạt, nhằm nâng cao trải nghiệm người dùng và bảo mật dữ liệu.
user
Để tạo một ứng dụng web Golang cho phép người dùng đăng ký và đăng nhập bằng xác thực OAuth 2.0 với Google, Facebook, và GitHub, bạn có thể làm theo các bước sau:

1. **Thiết lập dự án Golang**:
   - Tạo một thư mục mới cho dự án của bạn.
   - Khởi tạo một module Go bằng lệnh `go mod init <tên-module>`.

2. **Cài đặt các thư viện cần thiết**:
   - Sử dụng thư viện `golang.org/x/oauth2` để hỗ trợ OAuth 2.0.
   - Sử dụng các thư viện OAuth cụ thể cho từng nhà cung cấp như `golang.org/x/oauth2/google`, `golang.org/x/oauth2/facebook`, và `golang.org/x/oauth2/github`.

3. **Cấu hình OAuth 2.0**:
   - Đăng ký ứng dụng của bạn với Google, Facebook, và GitHub để lấy Client ID và Client Secret.
   - Tạo các cấu hình OAuth cho từng nhà cung cấp trong mã nguồn của bạn.

4. **Xây dựng các điểm cuối (endpoints) cho xác thực**:
   - Tạo các điểm cuối để người dùng có thể bắt đầu quá trình xác thực với từng nhà cung cấp.
   - Xử lý callback từ nhà cung cấp OAuth để lấy mã thông báo truy cập (access token) và thông tin người dùng.

5. **Lưu trữ thông tin người dùng**:
   - Sử dụng một cơ sở dữ liệu như PostgreSQL hoặc MySQL để lưu trữ thông tin người dùng.
   - Đảm bảo mã hóa mật khẩu và thông tin nhạy cảm khác trước khi lưu trữ.

6. **Ghi lại hoạt động người dùng**:
   - Tạo một hệ thống ghi nhật ký để theo dõi các hoạt động của người dùng trong ứng dụng.
   - Lưu trữ các bản ghi này trong cơ sở dữ liệu hoặc một hệ thống lưu trữ nhật ký chuyên dụng.

7. **Thiết kế giao diện người dùng đáp ứng**:
   - Sử dụng HTML, CSS, và JavaScript để tạo giao diện người dùng.
   - Sử dụng các framework như Bootstrap hoặc Tailwind CSS để đảm bảo giao diện đáp ứng trên các thiết bị khác nhau.

8. **Xử lý lỗi mạnh mẽ**:
   - Thêm các cơ chế xử lý lỗi để quản lý các lỗi có thể xảy ra trong quá trình xác thực và tương tác với cơ sở dữ liệu.
   - Hiển thị thông báo lỗi thân thiện với người dùng khi có sự cố.

9. **Bảo mật dữ liệu**:
   - Sử dụng HTTPS để mã hóa dữ liệu truyền tải giữa máy khách và máy chủ.
   - Thực hiện các biện pháp bảo mật như kiểm tra CSRF, XSS, và SQL Injection.

10. **Triển khai ứng dụng**:
    - Triển khai ứng dụng trên một nền tảng lưu trữ như Heroku, AWS, hoặc Google Cloud.

Dưới đây là một ví dụ đơn giản về cách cấu hình OAuth 2.0 với Google trong Golang:

```go
package main

import (
    "context"
    "fmt"
    "log"
    "net/http"

    "golang.org/x/oauth2"
    "golang.org/x/oauth2/google"
)

var googleOauthConfig = &oauth2.Config{
    RedirectURL:  "http://localhost:8080/callback",
    ClientID:     "YOUR_GOOGLE_CLIENT_ID",
    ClientSecret: "YOUR_GOOGLE_CLIENT_SECRET",
    Scopes:       []string{"https://www.googleapis.com/auth/userinfo.profile"},
    Endpoint:     google.Endpoint,
}

func main() {
    http.HandleFunc("/", handleMain)
    http.HandleFunc("/login", handleGoogleLogin)
    http.HandleFunc("/callback", handleGoogleCallback)
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleMain(w http.ResponseWriter, r *http.Request) {
    var html = `<html><body><a href="/login">Google Log In</a></body></html>`
    fmt.Fprint(w, html)
}

func handleGoogleLogin(w http.ResponseWriter, r *http.Request) {
    url := googleOauthConfig.AuthCodeURL("randomstate")
    http.Redirect(w, r, url, http.StatusTemporaryRedirect)
}

func handleGoogleCallback(w http.ResponseWriter, r *http.Request) {
    code := r.URL.Query().Get("code")
    token, err := googleOauthConfig.Exchange(context.Background(), code)
    if err != nil {
        http.Error(w, "Failed to exchange token", http.StatusInternalServerError)
        return
    }
    fmt.Fprintf(w, "Access Token: %s", token.AccessToken)
}
```

Hãy nhớ thay thế `YOUR_GOOGLE_CLIENT_ID` và `YOUR_GOOGLE_CLIENT_SECRET` bằng thông tin thực tế của bạn. Tương tự, bạn có thể cấu hình cho Facebook và GitHub.
assistant