06/05/2026 08:38น.

EP.36 การเพิ่มระบบ Authentication ให้กับ WebSocket Chat
#User Authentication
#WebSocket Authentication
#Secure WebSocket
#Token-Based Authentication
#Chat Security
#Golang
#Go
#WebSocket Security
ทำไมต้องเพิ่ม Authentication ให้กับ WebSocket Chat?
การใช้ WebSocket ในระบบแชทช่วยให้สามารถรับส่งข้อความแบบเรียลไทม์ได้ แต่หากไม่มีระบบ Authentication ผู้ใช้ทุกคนสามารถเข้าถึงแชทได้โดยไม่ต้องล็อกอิน ซึ่งอาจทำให้เกิดปัญหาด้านความปลอดภัย เช่น:
- บุคคลที่ไม่ได้รับอนุญาตสามารถแอบดูหรือส่งข้อความได้
- ไม่สามารถจำกัดสิทธิ์การเข้าถึงของแต่ละผู้ใช้ได้
- ไม่มีการตรวจสอบตัวตนของผู้ส่งข้อความ
ดังนั้นการใช้ JWT (JSON Web Token) เพื่อทำ Authentication และควบคุมสิทธิ์การเข้าถึงของ WebSocket จึงเป็นแนวทางที่เหมาะสม
โครงสร้างของระบบ Authentication ใน WebSocket Chat
- User Authentication - ผู้ใช้ล็อกอินและรับ JWT Token
- WebSocket Server - ตรวจสอบ Token ก่อนอนุญาตให้เชื่อมต่อ
- GraphQL API - ใช้ JWT เพื่อระบุผู้ใช้ในการส่งและรับข้อความ
- Database (PostgreSQL / MongoDB) - เก็บข้อมูลบัญชีผู้ใช้และข้อความ
ติดตั้งไลบรารีที่จำเป็น
go get github.com/dgrijalva/jwt-go
go get github.com/gorilla/websocket
สร้างระบบ User Authentication ด้วย JWT
1. การสร้าง JWT Token สำหรับผู้ใช้
ไฟล์ auth.go
package auth
import (
"time"
"github.com/dgrijalva/jwt-go"
)
var jwtKey = []byte("supersecretkey")
type Claims struct {
Username string `json:"username"`
jwt.StandardClaims
}
func GenerateToken(username string) (string, error) {
expirationTime := time.Now().Add(1 * time.Hour)
claims := &Claims{
Username: username,
StandardClaims: jwt.StandardClaims{
ExpiresAt: expirationTime.Unix(),
},
}
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
return token.SignedString(jwtKey)
}2. การตรวจสอบ JWT Token ใน WebSocket Server
ไฟล์ websocket_server.go
package main
import (
"fmt"
"github.com/dgrijalva/jwt-go"
"github.com/gorilla/websocket"
"net/http"
"strings"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
func authenticateToken(tokenString string) (*jwt.Token, error) {
return jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {
return []byte("supersecretkey"), nil
})
}
func handleWebSocket(w http.ResponseWriter, r *http.Request) {
authHeader := r.Header.Get("Authorization")
tokenString := strings.TrimPrefix(authHeader, "Bearer ")
token, err := authenticateToken(tokenString)
if err != nil || !token.Valid {
http.Error(w, "Unauthorized", http.StatusUnauthorized)
return
}
conn, _ := upgrader.Upgrade(w, r, nil)
defer conn.Close()
fmt.Println("Client connected with valid token")
}
func main() {
http.HandleFunc("/ws", handleWebSocket)
fmt.Println("WebSocket Server Running on Port 8080")
http.ListenAndServe(":8080", nil)
}
การเชื่อมต่อ WebSocket Client พร้อม JWT Token
ไฟล์ client.js
const token = "your_jwt_token_here";
const socket = new WebSocket("ws://localhost:8080/ws", ["Authorization", `Bearer ${token}`]);
socket.onopen = () => {
console.log("Connected to WebSocket server");
};
socket.onmessage = (event) => {
console.log("Message from server:", event.data);
};
ท้าให้ลอง!
ลองเพิ่ม Role-Based Access Control (RBAC) เพื่อให้ผู้ใช้แต่ละประเภทสามารถทำสิ่งที่แตกต่างกัน เช่น Admin สามารถลบข้อความได้ แต่ผู้ใช้ทั่วไปไม่สามารถลบได้
EP ถัดไป
ใน EP.37, เราจะมาสร้าง ระบบจัดการห้องแชท เพื่อให้ผู้ใช้สามารถเข้าร่วมหรือสร้างห้องสนทนาได้ 🚀