Golang使用Token来验证

 更新时间:2024年08月14日 09:58:37   作者:JawCat  
token指的是一种用于验证用户身份或授权访问的凭证,本文主要介绍了Golang使用Token来验证,具有一定的参考价值,感兴趣的可以了解一下

Token的概念及作用

什么是Token?

Token就像是一个通行证。当你登录某个网站时,服务器会给你一个Token,这个Token里面有一些信息,比如你是谁(用户身份)。以后你再访问这个网站的时候,就可以带上这个Token,服务器通过验证Token来确认你是合法的用户,而不是别人假冒的。

Token的作用:

身份确认:当用户登录成功后,服务器给用户一个Token。用户在访问其他页面或功能时,服务器通过这个Token确认用户身份。

无状态:服务器不需要记住每个用户的登录状态,只需要验证每次请求中携带的Token即可。这使得服务器更容易扩展。

安全:Token通常是加密的,别人不能轻易伪造或篡改它。

golang使用token

在Go语言中,我们经常使用JWT(JSON Web Token)来实现Token机制。JWT是一种很流行的Token格式,使用起来也很方便。

使用JWT的步骤:

安装JWT库:

go get github.com/golang-jwt/jwt

生成Token:

当用户登录时,我们生成一个Token并返回给用户。Token中包含了用户的信息,比如用户名和过期时间。

package main

import (
    "fmt"
    "time"
    "github.com/golang-jwt/jwt"
)

// 定义一个密钥,用于加密Token
var jwtKey = []byte("my_secret_key")

// 定义Token中包含的信息
type Claims struct {
    Username string `json:"username"`
    jwt.StandardClaims
}

// 生成Token的函数
func GenerateToken(username string) (string, error) {
    // 设置Token的过期时间,比如24小时后过期
    expirationTime := time.Now().Add(24 * time.Hour)
    // 创建一个包含用户名和过期时间的声明
    claims := &Claims{
        Username: username,
        StandardClaims: jwt.StandardClaims{
            ExpiresAt: expirationTime.Unix(),
        },
    }
    // 使用声明创建一个Token
    token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
    // 使用密钥对Token进行签名
    tokenString, err := token.SignedString(jwtKey)
    if err != nil {
        return "", err
    }
    return tokenString, nil
}

func main() {
    // 假设用户名是"user1"
    token, err := GenerateToken("user1")
    if err != nil {
        fmt.Println("生成Token时出错:", err)
    } else {
        fmt.Println("生成的Token:", token)
    }
}

验证Token:

每次用户带着Token访问服务器时,我们需要验证Token的合法性,确认这个Token是我们生成的,并且没有过期。

package main

import (
    "fmt"
    "github.com/golang-jwt/jwt"
    "net/http"
)

// 验证Token的函数
func ValidateToken(tokenString string) (*Claims, error) {
    claims := &Claims{}
    token, err := jwt.ParseWithClaims(tokenString, claims, func(token *jwt.Token) (interface{}, error) {
        return jwtKey, nil
    })
    if err != nil {
        if err == jwt.ErrSignatureInvalid {
            return nil, fmt.Errorf("无效的Token签名")
        }
        return nil, fmt.Errorf("无效的Token")
    }
    if !token.Valid {
        return nil, fmt.Errorf("无效的Token")
    }
    return claims, nil
}

func main() {
    http.HandleFunc("/protected", func(w http.ResponseWriter, r *http.Request) {
        // 从请求头中获取Token
        tokenString := r.Header.Get("Authorization")
        // 验证Token
        claims, err := ValidateToken(tokenString)
        if err != nil {
            http.Error(w, err.Error(), http.StatusUnauthorized)
            return
        }
        // 如果Token合法,返回欢迎信息
        fmt.Fprintf(w, "Hello, %s", claims.Username)
    })

    http.ListenAndServe(":8080", nil)
}

总结

Token就像是一张通行证,用户登录后得到这张通行证,后续访问时带上它,服务器通过验证通行证来确认用户身份。在Go语言中,我们可以使用JWT来生成和验证Token,这样既方便又安全。

到此这篇关于Golang使用Token来验证的文章就介绍到这了,更多相关Golang Token验证内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • golang环形队列实现代码示例

    golang环形队列实现代码示例

    这篇文章主要介绍了golang环形队列实现代码示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • go语言实现并发网络爬虫的示例代码

    go语言实现并发网络爬虫的示例代码

    本文主要介绍了go语言实现并发网络爬虫的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • go mod 依赖管理的具体使用

    go mod 依赖管理的具体使用

    在Go语言开发中,依赖管理是一项非常重要的工作,Go mod作为官方的包管理工具已经成为了Go语言依赖管理的首选方式,本文就来介绍一下go mod 依赖管理的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • goland把go项目打包进docker镜像的全过程记录

    goland把go项目打包进docker镜像的全过程记录

    golang编译的应用是不需要依赖其他运行环境的,下面这篇文章主要给大家介绍了关于goland把go项目打包进docker镜像的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • Golang中的sync.WaitGroup用法实例

    Golang中的sync.WaitGroup用法实例

    这篇文章主要介绍了Golang中的sync.WaitGroup用法实例,WaitGroup的用途,它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成,需要的朋友可以参考下
    2015-07-07
  • 使用Go HTTP客户端打造高性能服务

    使用Go HTTP客户端打造高性能服务

    大多数语言都有提供各自的 HTTP 客户端,本文将动手实践如何使用Go语言发起HTTP请求,并讨论其中有可能遇到的问题。具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • Go语言实现多协程文件下载器的过程详解

    Go语言实现多协程文件下载器的过程详解

    这篇文章主要介绍了Go语言实现多协程文件下载器的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-08-08
  • Go语言实现超时的三种方法实例

    Go语言实现超时的三种方法实例

    超时在一些业务场景里非常普遍,下面这篇文章主要给大家介绍了关于Go语言实现超时的三种方法,文中通过实例代码介绍的非常详细,对大家学习或者使用Go语言具有一定的参考学习价值,需要的朋友可以参考下
    2022-07-07
  • 分析Go语言中CSP并发模型与Goroutine的基本使用

    分析Go语言中CSP并发模型与Goroutine的基本使用

    我们都知道并发是提升资源利用率最基础的手段,尤其是当今大数据时代,流量对于一家互联网企业的重要性不言而喻。串流显然是不行的,尤其是对于web后端这种流量的直接载体。并发是一定的,问题在于怎么执行并发。常见的并发方式有三种,分别是多进程、多线程和协程
    2021-06-06
  • golang http 连接超时和传输超时的例子

    golang http 连接超时和传输超时的例子

    今天小编就为大家分享一篇golang http 连接超时和传输超时的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07

最新评论