基本信息
文件名称:golang原生实现JWT的示例代码.docx
文件大小:17.85 KB
总页数:6 页
更新时间:2025-05-22
总字数:约3.81千字
文档摘要

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