使用做到零在去中快速实现JWT认证

  介绍

使用做到零在去中快速实现JWT认证?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

JWT是可以实现服务器无状态的鉴权认证方案,也是目前最流行的跨域认证解决方案。

要实现JWT认证,我们需要分成如下两个步骤

    <李>客户端获取JWT牌。 <李>服务器对客户端带来的JWT牌认证。

<强> 1。客户端获取JWT标记

我们定义一个协议供客户端调用获取JWT令牌,我们新建一个目录JWT然后在目录中执行<代码> goctl api - o jwt.api> JwtTokenRequest struct类型{   }      JwtTokenResponse struct类型{   AccessToken字符串的json:“access_token"   AccessExpire int64 ' json:“access_expire" '   RefreshAfter int64 ' json:“refresh_after" '//建议客户端刷新令牌的绝对时间   }      GetUserRequest struct类型{   用户id字符串的json:“userId"”   }      GetUserResponse struct类型{   名字字符串“json:“name"”   }      服务jwt-api {   @handler JwtHandler   post/user/令牌(JwtTokenRequest)返回(JwtTokenResponse)   }      @server (   jwt: JwtAuth   )   服务jwt-api {   @handler JwtHandler   post/user/信息(GetUserRequest)返回(GetUserResponse)   }

在服务jwt目录中执行:<代码> goctl api api jwt去。api dir。
打开jwtlogic。去文件,修改<代码> func (l * JwtLogic)智威汤逊(点播types.JwtTokenRequest)(*类型。JwtTokenResponse错误){方法如下:

 func (l * JwtLogic)智威汤逊(点播types.JwtTokenRequest)(*类型。JwtTokenResponse错误){
  var accessExpire=l.svcCtx.Config.JwtAuth.AccessExpire
  
  :=time.Now () .Unix ()
  accessToken犯错:=l。GenToken (l.svcCtx.Config.JwtAuth。AccessSecret nil, accessExpire)
  如果犯错!=nil {
  返回nil,犯错
  }
  
  返回,types.JwtTokenResponse {
  AccessToken: AccessToken,
  AccessExpire:现在+ AccessExpire,
  RefreshAfter:现在+ accessExpire/2,
  },零
  }
  
  func (l * JwtLogic) GenToken (iat int64, secretKey字符串,载荷map [string]接口{},秒int64)(字符串,错误){
  索赔:=(jwt.MapClaims)
  索赔(“exp")=iat +秒
  [“iat"]=iat
  对于k、v:=载荷范围{
  索赔[k]=v
  }
  
  令牌:=jwt.New (jwt.SigningMethodHS256)
  令牌。索赔=索赔
  
  返回token.SignedString([]字节(secretKey))
  }

在启动服务之前,我们需要修改等/jwt-api。yaml文件如下:

名字:jwt-api   主持人:0.0.0.0   端口:8888   JwtAuth:   AccessSecret: xxxxxxxxxxxxxxxxxxxxxxxxxxxxx   AccessExpire: 604800

启动服务器,然后测试下获取到的令牌。

,# 10140;curl——位置请求POST & # 39; 127.0.0.1:8888/user/令牌# 39;   {“access_token":“eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDEyNjE0MjksImlhdCI6MTYwMDY1NjYyOX0.6u_hpE_4m5gcI90taJLZtvfekwUmjrbNJ-5saaDGeQc",“access_expire": 1601261429,“refresh_after": 1600959029}

<强> 2。服务器验证JWT标记

在api文件中通过<代码> JWT: JwtAuth> func (l * GetUserLogic) GetUser(点播types.GetUserRequest)(*类型。GetUserResponse错误){   返回和类型。GetUserResponse{名称:“kim"}, nil   }

我们先不带JWT授权头请求头测试下,返回http状态代码是401,符合预期。

,# 10140;curl - w“\ nhttp: % {http_code} \ n"——位置请求POST & # 39; 127.0.0.1:8888/user/信息# 39;\   ——头& # 39;- type: application/json # 39;\   ——data-raw & # 39; {   “userId":“a"   }& # 39;      http: 401

加上授权头请求头测试。

,# 10140;curl - w“\ nhttp: % {http_code} \ n"——位置请求POST & # 39; 127.0.0.1:8888/user/信息# 39;\   ——头& # 39;授权:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDEyNjE0MjksImlhdCI6MTYwMDY1NjYyOX0.6u_hpE_4m5gcI90taJLZtvfekwUmjrbNJ-5saaDGeQc& # 39;\   ——头& # 39;- type: application/json # 39;\   ——data-raw & # 39; {   “userId":“a"   }& # 39;   {“name":“kim"}   http: 200

综上所述:基于变成零的JWT认证完成,在真实生产环境部署时候,AccessSecret, AccessExpire, RefreshAfter根据业务场景通过配置文件配置,RefreshAfter是告诉客户端什么时候该刷新JWT令牌了,一般都需要设置过期时间前几天。

使用做到零在去中快速实现JWT认证