Xác thực JSON Web Token (JWT) với Golang

Hướng dẫn cách sử dụng JSON Web Token (JWT) để xác thực người dùng trong ứng dụng Golang. Bài viết sẽ trình bày chi tiết cách tạo, ký và xác minh token JWT để bảo mật API.

Trong bài viết này, chúng ta sẽ tìm hiểu cách cài đặt và sử dụng JWT trong ứng dụng Golang. JWT là một tiêu chuẩn mở để truyền tải thông tin giữa các bên một cách an toàn. Chúng ta sẽ xây dựng một API đơn giản có khả năng xác thực người dùng bằng JWT.

Mã Golang:

package main

import (
	"fmt"
	"net/http"
	"github.com/dgrijalva/jwt-go"
	"time"
)

var mySigningKey = []byte("secret")

// Định nghĩa cấu trúc cho token
type Claims struct {
	Username string `json:"username"`
	jwt.StandardClaims
}

// Hàm tạo token
func CreateToken(username string) (string, error) {
	expirationTime := time.Now().Add(5 * time.Minute)
	claims := &Claims{
		Username: username,
		StandardClaims: jwt.StandardClaims{
			ExpiresAt: expirationTime.Unix(),
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	return token.SignedString(mySigningKey)
}

// Hàm xác thực token
func ValidateToken(w http.ResponseWriter, r *http.Request) {
	tokenString := r.Header.Get("Authorization")
	if tokenString == "" {
		http.Error(w, "Unauthorized", http.StatusUnauthorized)
		return
	}

	token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
		return mySigningKey, nil
	})

	if err != nil || !token.Valid {
		http.Error(w, "Unauthorized", http.StatusUnauthorized)
		return
	}

	fmt.Fprintf(w, "Token is valid!")
}

// Hàm xử lý yêu cầu đăng nhập
func Login(w http.ResponseWriter, r *http.Request) {
	username := r.URL.Query().Get("username")
	token, err := CreateToken(username)
	if err != nil {
		http.Error(w, "Unable to create token", http.StatusInternalServerError)
		return
	}

	w.Header().Set("Authorization", token)
	fmt.Fprintf(w, "Token: %s", token)
}

func main() {
	http.HandleFunc("/login", Login)
	http.HandleFunc("/validate", ValidateToken)
	fmt.Println("Server starting on :8080")
	http.ListenAndServe(":8080", nil)
}

Giải thích chi tiết từng dòng code:

  1. package main: Định nghĩa gói chính của ứng dụng.
  2. import: Nhập các gói cần thiết, bao gồm httpjwt-go.
  3. var mySigningKey = []byte("secret"): Khai báo khóa bí mật để ký token.
  4. type Claims struct {...}: Định nghĩa cấu trúc Claims để lưu thông tin trong token.
  5. func CreateToken(username string): Hàm tạo token JWT.
  6. expirationTime := time.Now().Add(5 * time.Minute): Thiết lập thời gian hết hạn cho token.
  7. token := jwt.NewWithClaims(...): Tạo một token mới với các Claims đã định nghĩa.
  8. return token.SignedString(mySigningKey): Ký token và trả về chuỗi token.
  9. func ValidateToken(...): Hàm xác thực token từ header.
  10. token, err := jwt.Parse(...): Phân tích token từ chuỗi và kiểm tra tính hợp lệ.
  11. if err != nil || !token.Valid {...}: Kiểm tra xem token có hợp lệ không.
  12. func Login(...): Hàm xử lý yêu cầu đăng nhập, tạo và trả về token cho người dùng.
  13. func main(): Hàm chính, thiết lập các route cho server và khởi động server.

Yêu cầu hệ thống:

  • Golang version: 1.15 trở lên.
  • Thư viện jwt-go: có thể cài đặt bằng lệnh go get github.com/dgrijalva/jwt-go.

Cách cài đặt các thư viện để chạy được đoạn mã Golang trên:

Chạy lệnh sau trong terminal để cài đặt thư viện jwt-go:

go get github.com/dgrijalva/jwt-go

Lời khuyên:

  • Sử dụng khóa bí mật mạnh và bảo mật để ký token.
  • Thời gian hết hạn của token nên được thiết lập hợp lý để đảm bảo bảo mật nhưng cũng không làm gián đoạn trải nghiệm người dùng.


Các Hướng Dẫn Cùng Chủ Đề Đang Xem

Các chức năng thường dùng khi sử dụng Selenium Chrome trong Golang

Bài viết này tổng hợp các chức năng thường dùng khi làm việc với Selenium Chrome trong Golang, bao gồm cách cài đặt, tạo phiên làm việc, điều hướng trang web, và tương tác với các phần tử trên trang.
Cách POST data tới API bằng Golang

Bài viết này hướng dẫn cách gửi dữ liệu tới API bằng phương thức POST trong Golang, giúp bạn hiểu rõ hơn về cách tương tác với các dịch vụ web.
Cách chia chuỗi trong Golang bằng hàm SplitAfterN

Hướng dẫn cách sử dụng hàm `SplitAfterN` trong Golang để chia chuỗi dựa trên ký tự phân tách và giới hạn số phần tử được chia. Hàm này hữu ích khi cần chia chuỗi nhưng vẫn giữ nguyên ký tự phân tách.
Tạo ứng dụng chat đơn giản sử dụng Socket.IO trong Golang

Hướng dẫn chi tiết từng bước để xây dựng ứng dụng chat đơn giản sử dụng Socket.IO trong Golang, giúp bạn hiểu cách thức hoạt động của giao tiếp thời gian thực trong các ứng dụng web.
Hướng dẫn đọc nội dung file Excel bằng Golang

Hướng dẫn chi tiết cách đọc nội dung từ file Excel (.xlsx, .xls) bằng Golang, sử dụng thư viện excelize với các bước cài đặt và ví dụ minh họa cụ thể.
Cách INSERT dữ liệu vào database MySQL bằng Golang

Hướng dẫn cách sử dụng Prepared Statements trong Golang để thực hiện thao tác INSERT dữ liệu vào database MySQL với nhiều tham số.
Cách DELETE dữ liệu từ database MySQL bằng Golang

Hướng dẫn cách kết nối và xóa dữ liệu từ một bảng trong database MySQL bằng ngôn ngữ lập trình Golang.
Cách tách chuỗi trong Golang bằng hàm SplitAfter

Hướng dẫn cách sử dụng hàm `SplitAfter` trong Golang để tách chuỗi dựa trên một ký tự hoặc một chuỗi con nhất định. Bài viết này sẽ giải thích chi tiết cách hàm này hoạt động và ví dụ cụ thể.
Slices trong Golang: Cách sử dụng và ví dụ

Bài viết này hướng dẫn cách sử dụng `slices` trong Golang, bao gồm cách khai báo, truy cập, và thao tác với slices - một tính năng linh hoạt giúp quản lý mảng hiệu quả hơn trong Go.
Cách chia chuỗi trong Golang bằng hàm Split

Bài viết hướng dẫn cách sử dụng hàm `Split` trong Go (Golang) để chia nhỏ một chuỗi dựa trên dấu phân cách. Đây là một thao tác phổ biến khi xử lý chuỗi trong lập trình Go.

Đã thêm vào giỏ hàng