การดู : 260

06/05/2026 08:38น.

EP.36 การเพิ่มระบบ Authentication ให้กับ WebSocket Chat

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

  1. User Authentication - ผู้ใช้ล็อกอินและรับ JWT Token
  2. WebSocket Server - ตรวจสอบ Token ก่อนอนุญาตให้เชื่อมต่อ
  3. GraphQL API - ใช้ JWT เพื่อระบุผู้ใช้ในการส่งและรับข้อความ
  4. 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, เราจะมาสร้าง ระบบจัดการห้องแชท เพื่อให้ผู้ใช้สามารถเข้าร่วมหรือสร้างห้องสนทนาได้ 🚀