Golang JWT实现安全登录系统详解

发表时间: 2024-06-15 10:31

github地址:

https://github.com/dgrijalva/jwt-go

Star: 10.1k

在Go中可以直接使用
github.com/dgrijalva/jwt-go简单实现Token的生成和有效性检验。 如果存在私密的文件, 则需要使用使用密码对称加密。

jwt生成的token在没有加密的情况下, 需要使用https传输数据, 确保数据安全

package mainimport (    "errors"    "fmt"    "log"    "time"    "github.com/dgrijalva/jwt-go")type UserInfo struct {    ID uint64    Username string}const SecrectStr string ="hello world"func CreateToken(user *UserInfo)(tokenss string,err error){    //自定义claim    claim := jwt.MapClaims{    "id": user.ID,    "username": user.Username,    "nbf": time.Now().Unix(),    "iat": time.Now().Unix(),		}    token := jwt.NewWithClaims(jwt.SigningMethodHS256,claim)    // 签名后的token格式说明    // 示例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1NzUyODUyNzUsImlkIjoxLCJuYmYiOjE1NzUyODUyNzUsInVzZXJuYW1lIjoicGVuZ2oifQ.bDe8UZYLxvmrK7gHcuK8TrlnoiMsIm3Jo_f0-YYle7E    // 使用符号.,被分割成了三段    // 第一段base64解码之后:{"alg":"HS256","typ":"JWT"}    // 第二段base64解码之后:{"iat":1575285275,"id":1,"nbf":1575285275,"username":"pengj"},是原始的数据。    // 第三段是使用SigningMethodHS256加密之后的文本    tokenss,err = token.SignedString([]byte(SecrectStr))    return}func secret()jwt.Keyfunc{    return func(token *jwt.Token) (i interface{}, e error) {    return []byte(SecrectStr),nil        return i, e    }}func ParseToken(tokenss string)(user *UserInfo,err error){    user = &UserInfo{}    token,err := jwt.Parse(tokenss,secret())    if err != nil{        return    }    claim,ok := token.Claims.(jwt.MapClaims)    if !ok{        err = errors.New("cannot convert claim to mapclaim")        return		}    //验证token,如果token被修改过则为false    if !token.Valid{        err = errors.New("token is invalid")        return    }    user.ID =uint64(claim["id"].(float64))    user.Username = claim["username"].(string)    return}func main(){    user := UserInfo{ID:1, Username: "pengj"}    tokenStr, err := CreateToken(&user)    if err != nil {        panic(err)    }    log.Println("tokenStr:", tokenStr)    u , err := ParseToken(tokenStr)    if err != nil {        panic(err)    }    fmt.Println(u.ID, u.Username)}

注意: 此存储库不再维护

可以在以下位置找到新的存储库:https
://github.com/golang-jwt/jwt