优秀的编程知识分享平台

网站首页 > 技术文章 正文

golang jwt登录系统(golang模拟登录)

nanyue 2024-08-17 19:14:08 技术文章 25 ℃

github地址:

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

Star: 10.1k

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

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

package main
import (
    "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

Tags:

最近发表
标签列表