[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-websocket-chat-authentication-jwt-all--*":3,"academy-blog-translations-3i554b7yfku7sd0":95},{"data":4,"page":82,"perPage":82,"totalItems":82,"totalPages":82},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":90,"keywords":91,"locale":64,"published_at":92,"scheduled_at":13,"school_blog":86,"short_description":93,"status":84,"title":6,"updated":94,"updated_by":13,"slug":87,"views":89},"EP.36 การเพิ่มระบบ Authentication ให้กับ WebSocket Chat","sclblg987654321","school_blog_translations","\u003Ch2>ทำไมต้องเพิ่ม Authentication ให้กับ WebSocket Chat?\u003C\u002Fh2>\u003Cp>การใช้ WebSocket ในระบบแชทช่วยให้สามารถรับส่งข้อความแบบเรียลไทม์ได้ แต่หากไม่มีระบบ Authentication ผู้ใช้ทุกคนสามารถเข้าถึงแชทได้โดยไม่ต้องล็อกอิน ซึ่งอาจทำให้เกิดปัญหาด้านความปลอดภัย เช่น:\u003C\u002Fp>\u003Cul>\u003Cli>บุคคลที่ไม่ได้รับอนุญาตสามารถแอบดูหรือส่งข้อความได้\u003C\u002Fli>\u003Cli>ไม่สามารถจำกัดสิทธิ์การเข้าถึงของแต่ละผู้ใช้ได้\u003C\u002Fli>\u003Cli>ไม่มีการตรวจสอบตัวตนของผู้ส่งข้อความ\u003C\u002Fli>\u003C\u002Ful>\u003Cp>ดังนั้นการใช้ JWT (JSON Web Token) เพื่อทำ Authentication และควบคุมสิทธิ์การเข้าถึงของ WebSocket จึงเป็นแนวทางที่เหมาะสม\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>โครงสร้างของระบบ Authentication ใน WebSocket Chat\u003C\u002Fh3>\u003Col>\u003Cli>User Authentication - ผู้ใช้ล็อกอินและรับ JWT Token\u003C\u002Fli>\u003Cli>WebSocket Server - ตรวจสอบ Token ก่อนอนุญาตให้เชื่อมต่อ\u003C\u002Fli>\u003Cli>GraphQL API - ใช้ JWT เพื่อระบุผู้ใช้ในการส่งและรับข้อความ\u003C\u002Fli>\u003Cli>Database (PostgreSQL \u002F MongoDB) - เก็บข้อมูลบัญชีผู้ใช้และข้อความ\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>ติดตั้งไลบรารีที่จำเป็น\u003C\u002Fh3>\u003Cpre>\u003Ccode class=\"language-plaintext\">go get github.com\u002Fdgrijalva\u002Fjwt-go\ngo get github.com\u002Fgorilla\u002Fwebsocket\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3 data-pm-slice=\"1 1 []\">\u003Cspan>\u003Cstrong>สร้างระบบ User Authentication ด้วย JWT\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fh3>\u003Ch4>\u003Cspan>\u003Cstrong>1. การสร้าง JWT Token สำหรับผู้ใช้\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fh4>\u003Cp>\u003Cspan>ไฟล์ \u003C\u002Fspan>\u003Ccode>\u003Cspan>auth.go\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">package auth\n\nimport (\n    \"time\"\n    \"github.com\u002Fdgrijalva\u002Fjwt-go\"\n)\n\nvar jwtKey = []byte(\"supersecretkey\")\n\ntype Claims struct {\n    Username string `json:\"username\"`\n    jwt.StandardClaims\n}\n\nfunc GenerateToken(username string) (string, error) {\n    expirationTime := time.Now().Add(1 * time.Hour)\n    claims := &amp;Claims{\n        Username: username,\n        StandardClaims: jwt.StandardClaims{\n            ExpiresAt: expirationTime.Unix(),\n        },\n    }\n    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n    return token.SignedString(jwtKey)\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch4 data-pm-slice=\"1 1 []\">\u003Cspan>\u003Cstrong>2. การตรวจสอบ JWT Token ใน WebSocket Server\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fh4>\u003Cp>\u003Cspan>ไฟล์ \u003C\u002Fspan>\u003Ccode>\u003Cspan>websocket_server.go\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">package main\n\nimport (\n    \"fmt\"\n    \"github.com\u002Fdgrijalva\u002Fjwt-go\"\n    \"github.com\u002Fgorilla\u002Fwebsocket\"\n    \"net\u002Fhttp\"\n    \"strings\"\n)\n\nvar upgrader = websocket.Upgrader{\n    CheckOrigin: func(r *http.Request) bool { return true },\n}\n\nfunc authenticateToken(tokenString string) (*jwt.Token, error) {\n    return jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\n        return []byte(\"supersecretkey\"), nil\n    })\n}\n\nfunc handleWebSocket(w http.ResponseWriter, r *http.Request) {\n    authHeader := r.Header.Get(\"Authorization\")\n    tokenString := strings.TrimPrefix(authHeader, \"Bearer \")\n    token, err := authenticateToken(tokenString)\n    if err != nil || !token.Valid {\n        http.Error(w, \"Unauthorized\", http.StatusUnauthorized)\n        return\n    }\n    conn, _ := upgrader.Upgrade(w, r, nil)\n    defer conn.Close()\n    fmt.Println(\"Client connected with valid token\")\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fws\", handleWebSocket)\n    fmt.Println(\"WebSocket Server Running on Port 8080\")\n    http.ListenAndServe(\":8080\", nil)\n}\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3 data-pm-slice=\"1 1 []\">\u003Cspan>\u003Cstrong>การเชื่อมต่อ WebSocket Client พร้อม JWT Token\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fh3>\u003Cp>\u003Cspan>ไฟล์ \u003C\u002Fspan>\u003Ccode>\u003Cspan>client.js\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fp>\u003Cpre>\u003Ccode class=\"language-plaintext\">const token = \"your_jwt_token_here\";\nconst socket = new WebSocket(\"ws:\u002F\u002Flocalhost:8080\u002Fws\", [\"Authorization\", `Bearer ${token}`]);\n\nsocket.onopen = () =&gt; {\n    console.log(\"Connected to WebSocket server\");\n};\n\nsocket.onmessage = (event) =&gt; {\n    console.log(\"Message from server:\", event.data);\n};\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3 data-pm-slice=\"1 1 []\">\u003Cspan>\u003Cstrong>ท้าให้ลอง!\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fh3>\u003Cp>\u003Cspan>ลองเพิ่ม \u003Cstrong>Role-Based Access Control (RBAC)\u003C\u002Fstrong> เพื่อให้ผู้ใช้แต่ละประเภทสามารถทำสิ่งที่แตกต่างกัน เช่น \u003Cstrong>Admin สามารถลบข้อความได้ แต่ผู้ใช้ทั่วไปไม่สามารถลบได้\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fp>\u003Chr>\u003Ch3>\u003Cspan>\u003Cstrong>EP ถัดไป\u003C\u002Fstrong>\u003C\u002Fspan>\u003C\u002Fh3>\u003Cp>\u003Cspan>ใน \u003Cstrong>EP.37\u003C\u002Fstrong>, เราจะมาสร้าง \u003Cstrong>ระบบจัดการห้องแชท\u003C\u002Fstrong> เพื่อให้ผู้ใช้สามารถเข้าร่วมหรือสร้างห้องสนทนาได้ 🚀\u003C\u002Fspan>\u003C\u002Fp>","43_11zon_asvsg6e5j9.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002Fu97jq0za629x5et\u002F43_11zon_asvsg6e5j9.webp","2026-03-04 08:51:18.589Z","",{"keywords":15,"locale":58,"school_blog":68},[16,23,28,33,38,43,48,53],{"collectionId":17,"collectionName":18,"created":19,"created_by":13,"id":20,"name":21,"updated":22,"updated_by":13},"sclkey987654321","school_keywords","2026-03-04 08:51:16.632Z","gwruu2q4m5nfnka","User Authentication","2026-04-10 16:14:34.975Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:44:42.406Z","julxx94rca568ku","WebSocket Authentication","2026-04-10 16:12:48.917Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:51:16.224Z","72cusu8ff0jdht3","Secure WebSocket","2026-04-10 16:14:34.817Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:51:15.678Z","x176qvmm4bfx32y","Token-Based Authentication","2026-04-10 16:14:34.658Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:51:15.982Z","zea0opz6nut6xyt","Chat Security","2026-04-10 16:14:34.719Z",{"collectionId":17,"collectionName":18,"created":44,"created_by":13,"id":45,"name":46,"updated":47,"updated_by":13},"2026-03-04 08:20:14.253Z","ah6lvy4x8qe08l5","Golang","2026-04-10 16:07:26.172Z",{"collectionId":17,"collectionName":18,"created":49,"created_by":13,"id":50,"name":51,"updated":52,"updated_by":13},"2026-03-04 08:20:11.547Z","ey3puyme01a9bsw","Go","2026-04-10 16:07:25.893Z",{"collectionId":17,"collectionName":18,"created":54,"created_by":13,"id":55,"name":56,"updated":57,"updated_by":13},"2026-03-04 08:44:13.770Z","ij1u9pugpnctjvk","WebSocket Security","2026-04-10 16:12:41.774Z",{"code":59,"collectionId":60,"collectionName":61,"created":62,"flag":63,"id":64,"is_default":65,"label":66,"updated":67},"th","pbc_1989393366","locales","2026-01-22 10:59:55.832Z","twemoji:flag-thailand","s8wri3bt4vgg2ji",true,"Thai","2026-04-10 15:42:46.614Z",{"category":69,"collectionId":70,"collectionName":71,"created":13,"expand":72,"id":86,"slug":87,"updated":88,"views":89},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":73},{"blogIds":74,"collectionId":75,"collectionName":76,"created":77,"created_by":13,"id":69,"image":78,"image_alt":13,"image_path":79,"label":80,"name":81,"priority":82,"publish_at":83,"scheduled_at":13,"status":84,"updated":85,"updated_by":13},[],"sclcatblg987654321","school_category_blogs","2026-03-04 08:33:53.210Z","59ty92ns80w_15oc1implw.png","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclcatblg987654321\u002Fwqxt7ag2gn7xcmk\u002F59ty92ns80w_15oc1implw.png",{"en":81,"th":81},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","3i554b7yfku7sd0","websocket-chat-authentication-jwt","2026-05-06 17:21:11.990Z",260,"u97jq0za629x5et",[20,25,30,35,40,45,50,55],"2025-03-18 02:45:28.077Z","เรียนรู้วิธีเพิ่ม User Authentication ใน WebSocket Chat โดยใช้ JWT Token เพื่อควบคุมสิทธิ์การเข้าถึงของผู้ใช้ และเพิ่มความปลอดภัยให้กับระบบแชทของคุณ","2026-05-06 08:38:40.704Z",{"th":87,"en":87}]