第
golang原生实现JWT的示例代码
目录获取Token解析Token实际使用测试结果结语JWT(JSONWebToken)是一种基于JSON的安全令牌,可以用于在不同系统之间传输认证信息。在Go中实现JWT验证,可以通过标准库crypto/hmac、crypto/sha256和encoding/base64来编写自己的JWT。
获取Token
我们在此封装一个JWT的struct结构体(由于除了Payload,其他很大可能不会在其他地方用到,所以不公开)
typeJWTstruct{
headerstring
Payloadstring
signaturestring
}
将base64的编码封装一下方便使用
funcencodeBase64(datastring)string{
returnbase64.RawURLEncoding.EncodeToString([]byte(data))
}
我们封装一个用来生成签名的方法
funcgenerateSignature(key[]byte,data[]byte)(string,error){
//创建一个哈希对象
hash:=hmac.New(sha256.New,key)
//将要签名的信息写入哈希对象中hash.Write(data)
_,err:=hash.Write(data)
iferr!=nil{
return,err
//hash.Sum()计算签名,在这里会返回签名内容
//将签名经过base64编码生成字符串形式返回。
returnencodeBase64(string(hash.Sum(nil))),nil
}
我们封装一个CreateToken用于生成Token(该方法的参数key为(生成签名所使用的密钥))
funcCreateToken(key[]byte,payloadDataany)(string,error){
//标准头部
header:=`{alg:HS256,typ:JWT}`
//将负载的数据转换为json
payload,jsonErr:=json.Marshal(payloadData)
ifjsonErr!=nil{
return,fmt.Errorf(负载json解析错误)
//将头部和负载通过base64编码,并使用.作为分隔进行连接
encodedHeader:=encodeBase64(header)
encodedPayload:=encodeBase64(string(payload))
HeaderAndPayload:=encodedHeader+.+encodedPayload
//使用签名使用的key将传入的头部和负载连接所得的数据进行签名
signature,err:=generateSignature(key,[]byte(HeaderAndPayload))
iferr!=nil{
return,err
//将token的三个部分使用.进行连接并返回
returnHeaderAndPayload+.+signature,nil
}
解析Token
我们封装一个解析token的方法
funcParseJwt(tokenstring,key[]byte)(*JWT,error){
//分解规定,我们使用.进行分隔,所以我们通过.进行分隔成三个字符串的数组
jwtParts:=strings.Split(token,.)
//数据数组长度不是3就说明token在格式上就不合法
iflen(jwtParts)!=3{
returnnil,fmt.Errorf(非法token)
//分别拿出
encodedHeader:=jwtParts[0]
encodedPayload:=jwtParts[1]
signature:=jwtParts[2]
//使用key将token中的头部和负载用.连接后进行签名
//这个签名应该个token中第三部分的签名一致
confirmSignature,err:=generateSignature(key,[]byte(encoded