golang JWT的简单使用

栏目: Go · 发布时间: 6年前

内容简介:JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。JWT和session有所不同,session需要在服务器端生成,服务器保存session,只返回给客户端sessionid,客户端下次请求时带上sessionid即可。因为session是储存在服务器中,有多台服务器时会出现一些麻烦,需要同步多台主机的信息,不然会出现在请求A服务器时能获取信息,但是请求B服务器身份信息无法通过。JWT能很

JWT是json web token缩写。它将用户信息加密到token里,服务器不保存任何用户信息。服务器通过使用保存的密钥验证token的正确性,只要正确即通过验证。

JWT和session有所不同,session需要在服务器端生成,服务器保存session,只返回给客户端sessionid,客户端下次请求时带上sessionid即可。因为session是储存在服务器中,有多台服务器时会出现一些麻烦,需要同步多台主机的信息,不然会出现在请求A服务器时能获取信息,但是请求B服务器身份信息无法通过。JWT能很好的解决这个问题,服务器端不用保存jwt,只需要保存加密用的secret,在用户登录时将jwt加密生成并发送给客户端,由客户端存储,以后客户端的请求带上,由服务器解析jwt并验证。这样服务器不用浪费空间去存储登录信息,不用浪费时间去做同步。

JWT构成

一、Header(头部)

Jwt的头部承载两部分信息:

声明类型,这里是jwt

声明加密的算法 通常直接使用 HMAC SHA256

二、 Playload(载荷又称为Claim)

playload可以填充两种类型数据

1.标准中注册的声明:

iss: 签发者

sub: 面向的用户

aud: 接收方

exp: 过期时间

nbf: 生效时间

iat: 签发时间

jti: 唯一身份标识

2.自定义数据

三、Signature(签名)

签名的算法:

HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret
)

代码实现

type UserInfo struct {
    ID uint64
    Username string
}

1.生成token

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)
    tokenss,err  = token.SignedString([]byte(viper.GetString("token.secret"))) 
    return
}

用户登录后获得的ID和username可以保存在自定义的mapclaim中,在mapcalim中还可以存放需要的用户信息

2.解析token

func secret()jwt.Keyfunc{
    return func(token *jwt.Token) (interface{}, error) {
        return []byte(viper.GetString("token.secret")),nil
    }
}


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
}

用户请求时带上token,服务器解析token后可以获得其中的用户信息,如果token有任何改动,都无法通过验证.


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

顺势而为--雷军传

顺势而为--雷军传

采文 / 哈尔滨出版社 / 2014-9 / 29.80

主要介绍了雷军上大学开始创业到加入金山再到成为天使投资人一直最后创立小米公司的过程,以及他的“站在风口的猪”等个人名言思想的涉及。一起来看看 《顺势而为--雷军传》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

html转js在线工具
html转js在线工具

html转js在线工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具