[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"academy-blogs-th-1-1-all-golang-jwt-authentication-websocket-all--*":3,"academy-blog-translations-36e8e7cg321kxbo":79},{"data":4,"page":67,"perPage":67,"totalItems":67,"totalPages":67},[5],{"alt":6,"collectionId":7,"collectionName":8,"content":9,"cover_image":10,"cover_image_path":11,"created":12,"created_by":13,"expand":14,"id":73,"keywords":74,"locale":49,"published_at":75,"scheduled_at":13,"school_blog":71,"short_description":76,"slug":77,"status":69,"title":6,"updated":78,"updated_by":13,"views":72},"EP.66 การใช้ Golang ร่วมกับ JSON Web Tokens (JWT) เพื่อจัดการกับระบบการยืนยันตัวตน (Authentication)","sclblg987654321","school_blog_translations","\u003Cp>ใน EP.66 นี้เราจะมาดูวิธีการใช้ JSON Web Tokens (JWT) ใน Golang เพื่อจัดการกับระบบการยืนยันตัวตน (Authentication) สำหรับ WebSocket Chat โดยการใช้ JWT จะช่วยให้สามารถสร้างระบบการยืนยันตัวตนที่ปลอดภัยและสามารถจัดการสิทธิ์การเข้าถึงของผู้ใช้ได้อย่างมีประสิทธิภาพ\u003C\u002Fp>\u003Cp>การใช้ JWT ทำให้การตรวจสอบตัวตนของผู้ใช้ในระบบ WebSocket Chat สามารถทำได้ง่ายและปลอดภัย โดยไม่ต้องมีการเก็บข้อมูลเซสชันของผู้ใช้ในฐานข้อมูล ซึ่งช่วยลดปัญหาความเสี่ยงจากการโจมตีประเภทต่างๆ เช่น Session Hijacking หรือ Cross-Site Request Forgery (CSRF)\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ทำไมต้องใช้ JWT สำหรับการยืนยันตัวตนใน WebSocket Chat?\u003C\u002Fh2>\u003Ch3>การใช้ JWT สำหรับการยืนยันตัวตนมีข้อดีหลายประการ เช่น:\u003C\u002Fh3>\u003Cul>\u003Cli>ปลอดภัย: โดยไม่ต้องเก็บข้อมูลเซสชันในเซิร์ฟเวอร์และสามารถยืนยันตัวตนได้โดยไม่ต้องเชื่อมโยงกับฐานข้อมูล\u003C\u002Fli>\u003Cli>ง่ายต่อการใช้งาน: JWT ใช้งานง่ายและสามารถใช้ในการตรวจสอบตัวตนของผู้ใช้ในระบบที่มีความต้องการการทำงานแบบเรียลไทม์\u003C\u002Fli>\u003Cli>สามารถใช้งานได้หลายบริการ: JWT สามารถใช้งานได้ในหลายๆ บริการที่มี API เช่น การยืนยันตัวตนระหว่าง WebSocket และ API อื่นๆ\u003C\u002Fli>\u003C\u002Ful>\u003Ch3>ข้อดีของการใช้ JWT ใน WebSocket Chat:\u003C\u002Fh3>\u003Cul>\u003Cli>การตรวจสอบตัวตนที่ปลอดภัย: สามารถยืนยันตัวตนได้อย่างปลอดภัยโดยไม่ต้องเก็บข้อมูลเซสชัน\u003C\u002Fli>\u003Cli>การจัดการสิทธิ์ผู้ใช้ได้ง่าย: สามารถกำหนดสิทธิ์การเข้าถึงห้องแชทและฟีเจอร์ต่างๆ ตามที่ผู้ใช้ได้รับสิทธิ์\u003C\u002Fli>\u003Cli>ลดการโจมตีจากการแอบอ้าง: ไม่มีข้อมูลเซสชันให้โจมตี ทำให้ JWT ปลอดภัยกว่า\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>โครงสร้างของระบบการยืนยันตัวตนด้วย JWT ใน WebSocket Chat\u003C\u002Fh2>\u003Cp>การใช้ JWT ใน WebSocket Chat จะต้องมีการสร้าง Token สำหรับผู้ใช้ที่ล็อกอินเข้าสู่ระบบ จากนั้น Token นี้จะถูกใช้ในการยืนยันตัวตนของผู้ใช้ในแต่ละการเชื่อมต่อ\u003C\u002Fp>\u003Ch3>ส่วนประกอบหลักของระบบ JWT ใน WebSocket Chat:\u003C\u002Fh3>\u003Col>\u003Cli>การสร้าง Token เมื่อผู้ใช้ล็อกอิน:\u003Cbr>เมื่อผู้ใช้ล็อกอินเข้าสู่ระบบ ระบบจะสร้าง JWT Token และส่งกลับให้ผู้ใช้\u003C\u002Fli>\u003Cli>การตรวจสอบ Token:\u003Cbr>เมื่อผู้ใช้เชื่อมต่อ WebSocket Server ระบบจะตรวจสอบ JWT Token เพื่อยืนยันตัวตนของผู้ใช้\u003C\u002Fli>\u003Cli>การจัดการสิทธิ์การเข้าถึง:\u003Cbr>หลังจากยืนยันตัวตนแล้ว ระบบจะใช้ JWT Token เพื่อตรวจสอบสิทธิ์ของผู้ใช้ในการเข้าถึงฟีเจอร์ต่างๆ ของห้องแชท\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การเพิ่มฟีเจอร์การยืนยันตัวตนด้วย JWT ใน WebSocket Server\u003C\u002Fh2>\u003Ch3>ขั้นตอนที่ต้องทำ:\u003C\u002Fh3>\u003Col>\u003Cli>สร้าง JWT Token เมื่อผู้ใช้ล็อกอิน:\u003Cul>\u003Cli>เราจะใช้ JWT ในการสร้าง Token เมื่อผู้ใช้ทำการล็อกอินเข้าสู่ระบบ\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fli>\u003Cli>ตรวจสอบ JWT Token เมื่อผู้ใช้เชื่อมต่อ WebSocket:\u003Cul>\u003Cli>เมื่อผู้ใช้เชื่อมต่อเข้ามาใน WebSocket Server ระบบจะตรวจสอบ JWT Token ที่ส่งมาพร้อมกับคำขอเชื่อมต่อ\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fli>\u003Cli>จัดการสิทธิ์การเข้าถึง:\u003Cul>\u003Cli>ระบบจะตรวจสอบข้อมูลจาก JWT Token เช่น ชื่อผู้ใช้และบทบาท เพื่อกำหนดสิทธิ์ต่างๆ ในการเข้าถึงห้องแชท\u003C\u002Fli>\u003C\u002Ful>\u003C\u002Fli>\u003C\u002Fol>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>ตัวอย่างโค้ดการใช้ JWT ใน WebSocket Server\u003C\u002Fh2>\u003Col>\u003Cli>\u003Ch3>การสร้าง JWT Token เมื่อผู้ใช้ล็อกอิน\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"fmt\"\n    \"github.com\u002Fdgrijalva\u002Fjwt-go\"\n    \"time\"\n)\n\nvar mySigningKey = []byte(\"secret\")\n\nfunc GenerateJWT(userID string) (string, error) {\n    claims := jwt.MapClaims{\n        \"user_id\": userID,\n        \"exp\":     time.Now().Add(time.Hour * 72).Unix(),\n    }\n\n    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)\n    tokenString, err := token.SignedString(mySigningKey)\n    if err != nil {\n        return \"\", err\n    }\n\n    return tokenString, nil\n}\n\nfunc main() {\n    token, err := GenerateJWT(\"user123\")\n    if err != nil {\n        fmt.Println(\"Error generating JWT:\", err)\n        return\n    }\n    fmt.Println(\"Generated Token:\", token)\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Col start=\"2\">\u003Cli>\u003Ch3>การตรวจสอบ JWT Token ใน WebSocket Server\u003C\u002Fh3>\u003C\u002Fli>\u003C\u002Fol>\u003Cpre>\u003Ccode class=\"language-plaintext language-go\">package main\n\nimport (\n    \"fmt\"\n    \"github.com\u002Fdgrijalva\u002Fjwt-go\"\n    \"log\"\n    \"net\u002Fhttp\"\n    \"github.com\u002Fgorilla\u002Fwebsocket\"\n)\n\nvar mySigningKey = []byte(\"secret\")\n\nfunc validateJWT(tokenString string) (*jwt.Token, error) {\n    token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) {\n        if _, ok := token.Method.(*jwt.SigningMethodHMAC); !ok {\n            return nil, fmt.Errorf(\"Unexpected signing method: %v\", token.Header[\"alg\"])\n        }\n        return mySigningKey, nil\n    })\n    if err != nil {\n        return nil, err\n    }\n    return token, nil\n}\n\nfunc handleConnection(w http.ResponseWriter, r *http.Request) {\n    tokenString := r.URL.Query().Get(\"token\") \u002F\u002F Get token from URL query string\n    token, err := validateJWT(tokenString)\n    if err != nil || !token.Valid {\n        http.Error(w, \"Invalid token\", http.StatusUnauthorized)\n        return\n    }\n\n    conn, err := websocket.Upgrade(w, r, nil)\n    if err != nil {\n        log.Println(\"Error upgrading connection:\", err)\n        return\n    }\n\n    defer conn.Close()\n    fmt.Println(\"User authenticated and connected\")\n}\n\nfunc main() {\n    http.HandleFunc(\"\u002Fws\", handleConnection)\n    log.Fatal(http.ListenAndServe(\":8080\", nil))\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>ในโค้ดนี้, เราสร้าง JWT Token เมื่อผู้ใช้ล็อกอินและตรวจสอบ JWT Token ใน WebSocket Server เพื่อตรวจสอบความถูกต้องของผู้ใช้\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch2>การทดสอบระบบการยืนยันตัวตนด้วย JWT\u003C\u002Fh2>\u003Cp>การทดสอบระบบการยืนยันตัวตนที่ใช้ JWT ควรทดสอบดังนี้:\u003C\u002Fp>\u003Cul>\u003Cli>ทดสอบการสร้างและส่ง JWT Token: ทดสอบว่า JWT ถูกสร้างขึ้นและส่งไปให้ผู้ใช้เมื่อทำการล็อกอิน\u003C\u002Fli>\u003Cli>ทดสอบการตรวจสอบ Token: ทดสอบว่าเมื่อผู้ใช้เชื่อมต่อ WebSocket ระบบสามารถตรวจสอบ JWT ได้ถูกต้อง\u003C\u002Fli>\u003Cli>ทดสอบการจัดการสิทธิ์การเข้าถึง: ทดสอบว่า JWT Token สามารถใช้ในการกำหนดสิทธิ์การเข้าถึงห้องแชทได้ตามบทบาทของผู้ใช้\u003C\u002Fli>\u003C\u002Ful>\u003Cp>&nbsp;\u003C\u002Fp>\u003Chr>\u003Cp>&nbsp;\u003C\u002Fp>\u003Ch3>ท้าให้ลอง!\u003C\u002Fh3>\u003Cp>ลองเพิ่ม \u003Cstrong>ฟีเจอร์การรีเฟรช JWT Token\u003C\u002Fstrong> เมื่อ Token ใกล้หมดอายุ เพื่อให้ผู้ใช้ไม่ต้องล็อกอินใหม่ทุกครั้งเมื่อ Token หมดอายุ\u003C\u002Fp>\u003Cp>&nbsp;\u003C\u002Fp>\u003Cp>\u003Cstrong>EP ถัดไป:\u003C\u002Fstrong>\u003Cbr>ใน \u003Cstrong>EP.67\u003C\u002Fstrong> เราจะมาดู \u003Cstrong>การสร้างระบบบันทึกการใช้งาน (Audit Log) ใน WebSocket Server\u003C\u002Fstrong> เพื่อให้สามารถตรวจสอบการกระทำต่างๆ ภายใน WebSocket Server ได้\u003C\u002Fp>","103_11zon_i57wahmqet.webp","https:\u002F\u002Ftwsme-r2.tumwebsme.com\u002Fsclblg987654321\u002F5p8k7lxxm75o9vs\u002F103_11zon_i57wahmqet.webp","2026-03-04 08:48:16.101Z","",{"keywords":15,"locale":43,"school_blog":53},[16,23,28,33,38],{"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:44:42.406Z","julxx94rca568ku","WebSocket Authentication","2026-04-10 16:12:48.917Z",{"collectionId":17,"collectionName":18,"created":24,"created_by":13,"id":25,"name":26,"updated":27,"updated_by":13},"2026-03-04 08:48:14.773Z","rvtg1ba2zbmb32s","การจัดการผู้ใช้ด้วย JWT","2026-04-10 16:13:43.201Z",{"collectionId":17,"collectionName":18,"created":29,"created_by":13,"id":30,"name":31,"updated":32,"updated_by":13},"2026-03-04 08:48:15.037Z","sl8wru9sz7m3so7","การสร้าง JWT Token","2026-04-10 16:13:43.298Z",{"collectionId":17,"collectionName":18,"created":34,"created_by":13,"id":35,"name":36,"updated":37,"updated_by":13},"2026-03-04 08:48:15.405Z","7fgg8b58kbl6ytw","การใช้ JWT ใน Golang","2026-04-10 16:13:43.390Z",{"collectionId":17,"collectionName":18,"created":39,"created_by":13,"id":40,"name":41,"updated":42,"updated_by":13},"2026-03-04 08:48:15.762Z","b4d6q368ip2h0yk","การยืนยันตัวตน WebSocket","2026-04-10 16:13:43.502Z",{"code":44,"collectionId":45,"collectionName":46,"created":47,"flag":48,"id":49,"is_default":50,"label":51,"updated":52},"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":54,"collectionId":55,"collectionName":56,"expand":57,"id":71,"views":72},"wqxt7ag2gn7xcmk","pbc_2105096300","school_blogs",{"category":58},{"blogIds":59,"collectionId":60,"collectionName":61,"created":62,"created_by":13,"id":54,"image":63,"image_alt":13,"image_path":64,"label":65,"name":66,"priority":67,"publish_at":68,"scheduled_at":13,"status":69,"updated":70,"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":66,"th":66},"Golang The Series",1,"2026-03-16 04:39:38.440Z","published","2026-04-25 02:32:15.470Z","36e8e7cg321kxbo",241,"5p8k7lxxm75o9vs",[20,25,30,35,40],"2025-07-14 02:26:48.849Z","เรียนรู้วิธีการใช้ JSON Web Tokens (JWT) ใน Golang เพื่อสร้างระบบการยืนยันตัวตน (Authentication) ที่ปลอดภัยและมีประสิทธิภาพใน WebSocket Chat.","golang-jwt-authentication-websocket","2026-04-22 07:10:09.654Z",{"th":77}]