使用做到零在去中快速实现JWT认证?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
JWT是可以实现服务器无状态的鉴权认证方案,也是目前最流行的跨域认证解决方案。
要实现JWT认证,我们需要分成如下两个步骤
- <李>客户端获取JWT牌。李> <李>服务器对客户端带来的JWT牌认证。李>
<强> 1。客户端获取JWT标记强>
我们定义一个协议供客户端调用获取JWT令牌,我们新建一个目录JWT然后在目录中执行<代码> goctl api - o jwt.api> 代码,将生成的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> 代码标记的服务表示激活了JWT认证。可以阅读其他/处理/authhandler.go文件了解服务器JWT实现。修改getuserlogic。去如下:
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令牌了,一般都需要设置过期时间前几天。