Всем добрый день!
Я пытаюсь использовать Websocket (gorilla), чтобы запустить чат. Падает при проверки на аутентификацию в Мiddleware, работающее через cookie с токеном JWT. Все мои endpoint-ы через протокол HTTP работают, а через Websocket - нет. Я не понимаю, почему? Я пробовал убрать upgrader, и через HTTP этот же endpoint работает и все ок. Так же проверял куку и она почему-то пустая, даже до начала вызова upgrader-а. Тоже самое и с контекстом, через который я передаю некоторые данные - он тоже пуст. Вот мой код
Endpoint-ы
func (r *router) routes(engine *gin.Engine) {
engine.Use(r.handler.VerifyUser())
engine.POST("/signup", r.handler.CreateUser)
engine.POST("/signin", r.handler.LoginUser)
engine.GET("/welcome", r.handler.Welcome)
engine.GET("/logout", r.handler.Logout)
engine.POST("/ws/createRoom", r.wsHandler.CreateRoom)
engine.GET("/ws/joinRoom/:roomId", r.wsHandler.JoinRoom)
}
ws handler:
func (h *Handler) JoinRoom(c *gin.Context) {
claims := c.Request.Context().Value("jwt").(models.Claims) //couldn't find value with "jwt" key
fmt.Println(claims.ID, claims.Name)
cookie, err := c.Cookie("chartJWT") // allways err no cookie
if err != nil {
fmt.Printf("no cookie, error:%v\n", err)
}
fmt.Printf("cookie: %+v\n", cookie)
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
Middleware
func (h *handler) VerifyUser() gin.HandlerFunc {
return func(c *gin.Context) {
notAuth := []string{"/signup", "/signin"}
requestPath := c.Request.URL.Path
for _, val := range notAuth {
if val == requestPath {
c.Next()
return
}
}
token, err := c.Cookie("chartJWT")
if err != nil {
c.Redirect(http.StatusPermanentRedirect, signinPage)
}
claims, ok := validateToken(token)
if !ok {
c.JSON(http.StatusBadRequest, gin.H{"error": errors.New("invalid token")})
return
}
c.Request = c.Request.WithContext(context.WithValue(c.Request.Context(), "jwt", *claims))
c.Next()
}
Вопрос пустяковый, но уже второй день ничего найти не могу. Везде пишут, что до момента upgrade рабоатет по HTTP но у меня авторизация падает.
Тесты провожу в POSTMAN.
Кто-нибудь может объяснить мне, почему?
Буду благодарен за любую подсказку/мысли.