ทดลองการใช้งาน Go Fiber กับ middleware ตัวหนึ่งชื่อว่า session
main.go
func main() { store := session.New() engine := html.New("./views", ".html") engine.Reload(true) engine.Debug(true) engine.Layout("embed") engine.Delims("{{", "}}") app := fiber.New(fiber.Config{ Views: engine, }) app.Get("/", func(c *fiber.Ctx) error { sess, err := store.Get(c) if err != nil { log.Println(err) } log.Println(sess) name := sess.Get("name") isLogin := name != nil UnauthorizedMessage := "You are not login" AuthorizedMessage := fmt.Sprintf("Welcome %v", name) return c.Render("index", fiber.Map{ "AuthorizedMessage": AuthorizedMessage, "UnauthorizedMessage": UnauthorizedMessage, "IsLogin": isLogin, }) }) app.Get("/login", func(c *fiber.Ctx) error { sess, err := store.Get(c) if err != nil { panic(err) } sess.Set("name", c.Query("name", "unknown user")) if err := sess.Save(); err != nil { panic(err) } return c.Redirect("/") }) app.Get("/logout", func(c *fiber.Ctx) error { sess, err := store.Get(c) if err != nil { panic(err) } sess.Delete("name") // Destry session if err := sess.Destroy(); err != nil { panic(err) } return c.Redirect("/") }) log.Fatal(app.Listen(":3000")) }
views/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> {{if .IsLogin}} {{.AuthorizedMessage}} {{else}} {{.UnauthorizedMessage}} <form action="/login"> <label for="fname">Your name</label><br> <input type="text" id="name" name="name"><br> <input type="submit" value="Login"> </form> {{end}} </body> </html>
ดูจาก log ที่เกิดจากการ request เข้ามา
ทุกครั้งที่ยังไม่ได้ save session รหัสจะเปลี่ยนไปเรื่อย 21:9:12 app | 2021/02/17 21:09:12 &{5924577f-195a-4342-90c5-33d08322d3ac true 0xc00013cb00 0xc000202150 0xc000262960} 21:9:19 app | 2021/02/17 21:09:19 &{20b172d6-7836-46e7-9b84-cbd22cea7e28 true 0xc00013cb00 0xc000202150 0xc000262b60} 21:16:58 app | 2021/02/17 21:16:58 &{4f1bf90a-ca51-4b20-a69f-3263cf41aa17 false 0xc00009e000 0xc000202150 0xc0000e1120} แต่หลังจากมีการ login ได้มีการ save session แล้ว ตัว session นั้น รหัสจะไม่เปลี่ยน 21:2:36 app | 2021/02/17 21:02:36 &{4f1bf90a-ca51-4b20-a69f-3263cf41aa17 false 0xc00029e000 0xc000202150 0xc0002900a0} 21:2:36 app | views: parsed template: index 21:2:50 app | 2021/02/17 21:02:50 &{4f1bf90a-ca51-4b20-a69f-3263cf41aa17 false 0xc00029e000 0xc000202150 0xc0002903e0} 21:2:50 app | views: parsed template: index 21:2:55 app | 2021/02/17 21:02:55 &{4f1bf90a-ca51-4b20-a69f-3263cf41aa17 false 0xc00029e000 0xc000202150 0xc000290620}
แต่ถ้า api เรามีการ compile ใหม่ ทำให้ค่า store เปลี่ยนใหม่ session ทั้งหมดจะถูกทำลายทันที
จริงๆ แล้ว package fiber session มันอำนวยความสำดวกให้เราเฉยๆ โดยการที่
- สร้าง uuid ขึ้นมาให้เมื่อไม่พบว่า request นั้นมีการแนบ cookie มาให้
- ใน method save มันก็จะ แนบ uuid เข้าไปใน fiber context cookie ให้ก่อนการส่ง response ออกไป
ปัญหาที่เจอ
- Cookie แนบมากับหลังบ้าน แต่หน้าบ้านไม่เก็บ cookie เมื่อใช้งาน axios > เราต้องไปตั้งค่า axios 2 อย่าง
axios.defaults.baseURL = `${BASE_URL}` axios.defaults.withCredentials = true
Top comments (2)
how can i declare session middleware in app.go and using session middleware in other package (for example: user package) ? thank you
In my opinion, use store method func (s *Store) Get(c *fiber.Ctx) (*Session, error)
by pass store into your other package.