




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第Go语言如何使用golang目录前言1.什么是JWT2.JWT的数据结构2.1Header2.2Payload2.3Signature2.4Base64URL3使用JWT安装生成Token总结
前言
最近写的项目中用到了JWT鉴权,因此做个记录
原先的jwt-go仓库已经不再维护,迁移到了/golang-jwt/jwt/v4
但是网上大多数还是v3版本的使用教程,建议使用更加安全的v4
1.什么是JWT
JSONWebToken(JWT)是一个开放标准(RFC7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
2.JWT的数据结构
实际的JWT由三部分组成,如下图
中间用点(.)分隔成三个部分。注意,JWT内部是没有换行的,这里只是为了便于展示,将它写成了几行。JWT的三个部分依次如下:
Header(头部)Payload(负载)Signature(签名)
写成一行就是Header.Payload.Signature
2.1Header
Header部分是一个JSON对象,描述JWT的元数据,通常是下面的样子
{
"alg":"HS256",
"typ":"JWT"
上面代码中,alg属性表示签名的算法(algorithm),默认是HMACSHA256(写成HS256);typ属性表示这个令牌(token)的类型(type),JWT令牌统一写为JWT。
将上面的JSON对象使用Base64URL算法(详见后文)转成字符串就成了第一部分Header。
2.2Payload
Payload部分也是一个JSON对象,用来存放实际需要传递的数据。JWT规定了7个官方字段,供选用。
iss(issuer):签发人exp(expirationtime):过期时间sub(subject):主题aud(audience):受众nbf(NotBefore):生效时间iat(IssuedAt):签发时间jti(JWTID):编号
我们还可以在这个部分自己定义字段,下面就是一个例子
{
"sub":"1234567890",
"name":"JohnDoe",
"admin":true
注意,JWT默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
这个JSON对象也要使用Base64URL算法转成字符串。
2.3Signature
Signature部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用Header里面指定的签名算法(默认是HMACSHA256),按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header)+"."+
base64UrlEncode(payload),
secret)
2.4Base64URL
前面提到,Header和Payload串型化的算法是Base64URL。这个算法跟Base64算法基本类似,但有一些小的不同。
JWT作为一个令牌(token),有些场合可能会放到URL(比如/token=xxx)。Base64有三个字符+,/和=,在URL里面有特殊含义,所以要被替换掉:=被省略、+替换成-,/替换成_。这就是Base64URL算法。
算出签名以后,把Header、Payload、Signature三个部分拼成一个字符串,每个部分之间用点(.)分隔,就可以返回给用户。
3使用JWT
安装
goinstall"/golang-jwt/jwt/v4"
生成Token
定义claims和serect
typeMyClaimsstruct{
Phonestring`json:"phone"`
jwt.RegisteredClaims//注意!这是jwt-go的v4版本新增的,原先是jwt.StandardClaims
varMySecret=[]byte("手写的从前")//定义secret,后面会用到
生成token
//这里传入的是手机号,因为我项目登陆用的是手机号和密码
funcMakeToken(phonestring)(tokenStringstring,errerror){
claim:=MyClaims{
Phone:phone,
RegisteredClaims:jwt.RegisteredClaims{
ExpiresAt:jwt.NewNumericDate(time.Now().Add(3*time.Hour*time.Duration(1))),//过期时间3小时
IssuedAt:jwt.NewNumericDate(time.Now()),//签发时间
NotBefore:jwt.NewNumericDate(time.Now()),//生效时间
token:=jwt.NewWithClaims(jwt.SigningMethodHS256,claim)//使用HS256算法
tokenString,err=token.SignedString(MySecret)
returntokenString,err
解析token
funcSecret()jwt.Keyfunc{
returnfunc(token*jwt.Token)(interface{},error){
return[]byte("手写的从前"),nil//这是我的secret
funcParseToken(tokenssstring)(*MyClaims,error){
token,err:=jwt.ParseWithClaims(tokenss,MyClaims{},Secret())
iferr!=nil{
ifve,ok:=err.(*jwt.ValidationError);ok{
ifve.Errorsjwt.ValidationErrorMalformed!=0{
returnnil,errors.New("that'snotevenatoken")
}elseifve.Errorsjwt.ValidationErrorExpired!=0{
returnnil,errors.New("tokenisexpired")
}elseifve.Errorsjwt.ValidationErrorNotValidYet!=0{
returnnil,errors.New("tokennotactiveyet")
}else{
returnnil,errors.New("couldn'thandlethistoken")
ifcl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 行政效能评估指标构建试题及答案
- 2025年货物购销合同范本
- 行政管理服务优化途径与实践试题及答案
- 老年义诊政策解读
- 2025停车场租赁合同范本
- 行政管理视角下的试题及答案总结
- 2025建筑工程混凝土采购合同
- 行政管理实务中的法律意识试题及答案
- 2025年梅阁村莲花山地块及地上相关资产租赁合同
- 2025企业单位员工劳动合同模板「版」
- 陶瓷制作工艺知识课件
- 重组人生长激素在儿科临床的应用课件
- 某步进式加热炉施工组织设计
- 产品近三年主要销售业绩清单
- 操作规程编制导则
- Dijkstra最短路径算法的优化和改进
- 升压站扩建间隔施工方案
- 圆锥-圆柱齿轮减速器课程设计说明书
- 高级财务管理(第三版)第03章-信息不对称与代理冲突
- 灭火和应急疏散流程图
- 重大危险源评估标准
评论
0/150
提交评论