@SSSSTTTTAAAASSSS

Golang Websocket не проходит авторизацию Middleware?

Всем добрый день!
Я пытаюсь использовать 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.
Кто-нибудь может объяснить мне, почему?
Буду благодарен за любую подсказку/мысли.
  • Вопрос задан
  • 185 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы