iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > GO >带 cookie 身份验证的 Golang Websocket (Gorilla)
  • 263
分享到

带 cookie 身份验证的 Golang Websocket (Gorilla)

2024-02-11 19:02:49 263人浏览 安东尼
摘要

在web开发中,身份验证是一个必不可少的功能,而基于cookie的身份验证是一种常见的方式。golang作为一种高效、简洁的编程语言,拥有强大的WEB开发能力。本文将介绍如何使用Gor

web开发中,身份验证是一个必不可少的功能,而基于cookie的身份验证是一种常见的方式。golang作为一种高效、简洁的编程语言,拥有强大的WEB开发能力。本文将介绍如何使用Gorilla工具包在Golang中实现带cookie身份验证的websocket功能,让你的应用程序更加安全可靠。无论你是Golang初学者还是有一定经验的开发者,本文都能帮助你快速上手。让我们一起来看看吧!

问题内容

我正在尝试使用 gorilla webSocket 来启动图表。 身份验证中间件通过 cookie 和 Jwt 令牌工作。 我所有通过 Http 的端点都可以工作,但 websocket 却不能。 在阅读了很多像带有 cookie 身份验证的 gorilla websocket 之类的主题后,我发现我的 cookie 是空的,并且 websocket 连接中的上下文也是空的。我不明白为什么?谁能解释一下为什么? p.s.:我尝试从该处理程序中删除升级程序,并且 cookie 和上下文顺利通过,但是在升级到 websocket 协议的连接后,它失败了。 这是我的文件: 端点:

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
    }

中间件:

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()
    }
}

所有其他端点都有效,如果您需要任何其他代码,请告诉我。我不想让我的问题变得更复杂,因为我认为这很简单,但我误解了一些东西( 感谢您的帮助和建议。

p.s.:如果我关闭中间件,一切都会按预期工作。

更新: 添加了验证和生成函数

func validatetoken(jwttoken string) (*models.claims, bool) {
    claims := &models.claims{}

    token, err := jwt.parsewithclaims(jwttoken, claims, func(token *jwt.token) (interface{}, error) {
        return []byte(config.secreTKEy), nil
    })
    if err != nil {
        return claims, false
    }

    if !token.valid {
        return claims, false
    }

    return claims, true
}

func (h *handler) generatetokenstringforuser(id, name string) (string, error) {
    // create the jwt claims, which includes the username and expiry time
    claims := models.claims{
        id:   id,
        name: name,
        reGISteredclaims: jwt.registeredclaims{
            issuer:    id,
            expiresat: jwt.newnumericdate(time.now().add(24 * time.hour)),
        },
    }

    token := jwt.newwithclaims(jwt.signingmethodhs256, claims)
    tokenstring, err := token.signedstring([]byte(config.secretkey))
    return tokenstring, err
}

添加了登录功能,其中我添加了带有 jwt 字符串的 cookie

func (h *handler) LoginUser(c *gin.Context) {
    var input models.LoginUserReq

    if err := c.ShouldBindJSON(&input); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    res, err := h.Service.LoginUser(context.Background(), &input)
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    token, err := h.generateTokenStringForUser(res.ID, res.Name)
    if err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
        return
    }

    c.SetCookie("chartJWT", token, 60*60*24, "/", "localhost", false, true)
    c.JSON(http.StatusOK, gin.H{"user": res})
}

帮助后更新: 问题出在我的 postman 设置请求中,我没有正确指定 cookie。

解决方法

让我尝试帮助找出问题所在。首先,我稍微简化了您的示例,以便仅关注相关部分。如果您需要省略某些内容,请告诉我,我会更新答案。首先,让我从本地 auth 包中进行的 jwt 令牌生成/验证开始。

auth/auth.go 文件

package auth

import (
    "fmt"
    "strings"
    "time"

    "GitHub.com/golang-jwt/jwt"
)

func validatetoken(jwttoken string) (*jwt.mapclaims, error) {
    // parse the token
    token, err := jwt.parse(strings.replace(jwttoken, "bearer ", "", 1), func(token *jwt.token) (interface{}, error) {
        _, ok := token.method.(*jwt.signingmethodhMac)
        if !ok {
            return nil, fmt.errorf("unexpected signing method: %v", token.header["alg"])
        }
        return []byte("abcd1234!!"), nil
    })
    // err while parsing the token
    if err != nil {
        return nil, err
    }
    // token valid
    var claims jwt.mapclaims
    var ok bool
    if claims, ok = token.claims.(jwt.mapclaims); ok && token.valid {
        return &claims, nil
    }
    return nil, fmt.errorf("token not valid")
}

func generatetoken(username, passWord string) (string, error) {
    // todo: here you can add logic to check against a db
    //...

    // create a new token by providing the cryptographic algorithm
    token := jwt.new(jwt.signingmethodhs256)

    // set default/custom claims
    claims := token.claims.(jwt.mapclaims)
    claims["exp"] = time.now().add(24 * time.hour * 3).unix()
    claims["username"] = username
    claims["password"] = password

    tokenstring, err := token.signedstring([]byte("abcd1234!!"))
    if err != nil {
        return "", err
    }
    return tokenstring, nil
}

现在,让我们转到中间件部分。

middlewares/middlewares.go 文件

package middlewares

import (
    "net/http"

    "websocketauth/auth"

    "github.com/gin-gonic/gin"
)

func verifyuser() gin.handlerfunc {
    return func(c *gin.context) {
        notauth := []string{"/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, "/signin")
        }

        claims, err := auth.validatetoken(token)
        if err != nil {
            c.json(http.statusbadrequest, gin.h{"error": err.error()})
            return
        }

        c.set("jwt", *claims)
        c.next()
    }
}

为了能够在上下文中上传某些内容,您应该使用 c.set(key, value) 方法。现在,让我们转向处理程序。

handlers/handlers.go 文件

package handlers

import (
    "fmt"
    "net/http"

    "websocketauth/auth"

    "github.com/gin-gonic/gin"
    "github.com/golang-jwt/jwt"
    "github.com/gorilla/websocket"
)

var upgrader websocket.upgrader

type loginuserreq struct {
    username string `json:"username" binding:"required"`
    password string `json:"password" binding:"required"`
}

func loginuser(c *gin.context) {
    var input loginuserreq
    if err := c.shouldbind(&input); err != nil {
        c.json(http.statusbadrequest, gin.h{"error": err.error()})
        return
    }

    // i don't know what you do within the handler.service.loginuser() method

    token, err := auth.generatetoken(input.username, input.password)
    if err != nil {
        c.json(http.statusbadrequest, gin.h{"error": err.error()})
        return
    }

    c.setcookie("chartjwt", token, 60*60*24, "/", "localhost", false, true)
    c.json(http.statusok, gin.h{"user": token})
}

func joinroom(c *gin.context) {
    claims := c.mustget("jwt").(jwt.mapclaims)
    fmt.println("username", claims["username"])
    fmt.println("password", claims["password"])
    ws, err := upgrader.upgrade(c.writer, c.request, nil)
    if err != nil {
        panic(err)
    }
    charttoken, err := c.cookie("chartjwt")
    if err != nil {
        panic(err)
    }
    fmt.println("charttoken", charttoken)
    _ = ws
}

由于我不知道它们的作用,因此跳过了缺少的部分,例如 handler.service.loginuser() 方法。要正确地从上下文中读取内容,您必须使用 c.mustget(key) 方法。

main.go 文件

package main

import (
    "websocketauth/handlers"
    "websocketauth/middlewares"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"
)

func main() {
    handlers.Upgrader = websocket.Upgrader{
        ReadBufferSize:  1024,
        WriteBufferSize: 1024,
    }
    gin.SetMode(gin.DebugMode)
    r := gin.Default()

    r.Use(middlewares.VerifyUser())
    r.GET("/join-room", handlers.JoinRoom)
    r.POST("/signin", handlers.LoginUser)

    r.Run(":8000")
}

这是设置逻辑。这里没什么值得一提的。
如果您还需要其他帮助,请告诉我,谢谢!

以上就是带 cookie 身份验证的 Golang Websocket (Gorilla)的详细内容,更多请关注编程网其它相关文章!

您可能感兴趣的文档:

--结束END--

本文标题: 带 cookie 身份验证的 Golang Websocket (Gorilla)

本文链接: https://www.lsjlt.com/news/563575.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 带 cookie 身份验证的 Golang Websocket (Gorilla)
    在Web开发中,身份验证是一个必不可少的功能,而基于cookie的身份验证是一种常见的方式。Golang作为一种高效、简洁的编程语言,拥有强大的Web开发能力。本文将介绍如何使用Gor...
    99+
    2024-02-11
  • ASP.NET Core中Cookie验证身份用法详解
    目录添加配置ASP.NET Core 1.xASP.NET Core 2.x创建身份认证CookieASP.NET Core 1.xASP.NET Core 2.xSigning o...
    99+
    2024-04-02
  • Asp.net core中怎么使用cookie验证身份
    今天就跟大家聊聊有关Asp.net core中怎么使用cookie验证身份,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。ASP.NET Core Identity 是一个完整的全功能...
    99+
    2023-06-17
  • Node.js WebSocket中的身份验证机制有哪些?
    WebSocket身份验证机制简介 WebSocket是一种双向通信协议,允许客户端和服务器之间建立实时连接。WebSocket身份验证机制允许服务器端验证客户端的身份,从而保障应用程序的安全。Node.js提供了多种身份验证机制,包括J...
    99+
    2024-02-06
    WebSocket Node.js 身份验证 JWT OAuth 2.0 TLS
  • 特定路由的 Gorilla 中间件身份验证不起作用
    学习Golang要努力,但是不要急!今天的这篇文章《特定路由的 Gorilla 中间件身份验证不起作用》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对...
    99+
    2024-04-05
  • 如何使用会话Cookie和Java实现JWT身份验证
    目录1、基于会话的身份验证那么什么是会话Cookie? 2、基于令牌的身份验证哪个更好用?3、jwt实现登录HTTP是无状态协议,用于传输数据。它启用了客户端和服务器端>...
    99+
    2024-04-02
  • Node.js OAuth:身份验证的未来
    在当今数字时代,身份验证和授权对于保护用户数据和在线应用程序的安全至关重要。Node.js OAuth 是一种流行的框架,它通过提供一种标准化且安全的方法来处理第三方应用程序的认证和授权,极大地简化了应用程序开发。 什么是 OAuth...
    99+
    2024-02-19
    Node.js OAuth 身份验证 授权 安全
  • 使用带有 spring LDAP API 的 LDAP 进行身份验证
    要使用Spring LDAP API进行身份验证,您需要完成以下步骤:1. 添加Spring LDAP依赖项:首先,您需要将Spri...
    99+
    2023-09-26
    spring
  • 使用 Golang AWS SDK 和 RDS 进行 IAM 身份验证
    哈喽!今天心血来潮给大家带来了《使用 Golang AWS SDK 和 RDS 进行 IAM 身份验证》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你...
    99+
    2024-04-05
  • ASP.NET项目中的JWT身份验证
    JWT (JSON Web Token) 是一种用于身份验证的开放标准,可以在客户端和服务器之间传递安全的信息。在ASP.NET项目...
    99+
    2023-09-27
    ASP.NET
  • 一个简单的身份证校验
    需要椒盐虾身份证号的正确性,大致了搜了下, 感觉用datetime校验时间比正则,就改了下 代码 1 #!/usr/bin/env python 2 # -*- coding: utf-8 -*- 3 # @Time ...
    99+
    2023-01-30
    身份证 简单
  • Django中的JWT身份验证的实现
    1.认证与授权 1.验证:身份验证是验证个人或设备标识的过程。身份验证过程之一是登录过程。注册网站后,您的信息(ID,密码,名称,电子邮件等)将存储在其数据库中。之后,您无需创建帐...
    99+
    2024-04-02
  • golang中gin框架接入jwt使用token验证身份
    目录jwt 流程: 1.token 工具类 2. 使用该中间件 3. controller部分代码 jwt jwt的原理和session有点相像,其目的是为了解决rest api中...
    99+
    2024-04-02
  • Node.js OAuth:身份验证的终极指南
    OAuth 简介 OAuth (开放授权) 是一种行业标准协议,允许用户使用第三方平台(如 Google、Facebook 或 Twitter)向应用程序授权访问其数据。通过 OAuth,用户无需创建单独的应用程序凭据,即可安全地共享他...
    99+
    2024-02-19
    Node.js OAuth 授权 身份验证 API
  • Golang基于JWT与Casbin身份验证授权实例详解
    目录JWTHeaderPayloadSignatureJWT的优势JWT的使用场景CasbinCasbin可以做什么Casbin不可以做什么Casbin的工作原理实践登录接口请求To...
    99+
    2024-04-02
  • Node.js 保障用户身份:身份验证与授权的综合指南
    身份验证 身份验证是验证用户身份的过程,以确保他们被允许访问应用程序。常见的身份验证机制包括: 本地身份验证:用户在应用程序中创建和存储凭据(例如用户名和密码)。 社交登录:用户使用其社交媒体帐户(例如 Google 或 Faceboo...
    99+
    2024-04-02
  • Mongodb中的身份验证方式有哪些
    本篇文章给大家分享的是有关Mongodb中的身份验证方式有哪些,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1. 介绍不管数据库是在多安全的环...
    99+
    2024-04-02
  • PHP Session 跨域与身份验证的关系
    在Web开发中,跨域和身份验证是两个非常重要的概念。PHP Session在处理这两个问题时起着至关重要的作用。本文将介绍PHP Session在跨域访问和身份验证方面的关系,并提供代码示例以解释其实际应用。首先,我们来了解一下什么是跨域访...
    99+
    2023-10-21
    PHP 身份验证 跨域
  • oracle 身份证校验函数的实例代码
    1、正则表达式写法: CREATE OR REPLACE FUNCTION Func_checkidcard (p_idcard IN VARCHAR2) RETURN INT IS v_regst...
    99+
    2024-04-02
  • node如何实现基于token的身份验证
    小编给大家分享一下node如何实现基于token的身份验证,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!最近研究了下基于toke...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作