Go语言如何使用golang_第1页
Go语言如何使用golang_第2页
Go语言如何使用golang_第3页
Go语言如何使用golang_第4页
Go语言如何使用golang_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论