时长一周的golang萌新学习go-zero --- 进度三

247 阅读3分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

今天继续学习goz-zero微服务框架。兄弟们最近太忙了;坑货公司接了一个项目硬件对接音频视频项目;这几天一直在找流媒体服务器框架;天天在公司编译代码;不是C++、.Net、Vue、React这几天人都要整神的;更可恶的就是前端这几天拉起包一直不成功;后端代码代码那么难都编译出来;嘎在前端的上;很无语。废话少说今天晚上🧐了下go-zero的JWT。

什么是 JWT

在我眼里就是一个token来做鉴权验证没了。

  • Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
  • Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。 这是找的资料;说白了就是鉴权的;这玩意什么都能做;比如用MD5哈希加密等都能做;为啥要用JWT;其实我也不知道为啥要用;估计高大上吧。
上代码实操吧

继续用我们前面的模版。 找到我们的前几天说那个登录业务模块的代码地方。

jwt1.jpg 开始我们代码表演

func (l *LogicLogic) getJwtToken(secretKey string, iat, seconds, userId int64) (string, error) {
   claims := make(jwt.MapClaims)
   claims["exp"] = iat + seconds
   claims["iat"] = iat
   claims["userId"] = userId
   token := jwt.New(jwt.SigningMethodHS256)
   token.Claims = claims
   return token.SignedString([]byte(secretKey))
}

这是官方大大给的例子。

  1. secretKey这个是什么 就是JWT加盐的密钥字符串(这玩意随便写生成)
  2. iat 这玩意我觉得是表示当前时间戳(具体我也不知道是什么)
  3. seconds这是是我们设置当前过好久过期时间(说白就是过期时间)
  4. userId这个不需要我解释吧。

在此之前忘记介绍最重要的配置文件设置 JWT密钥和过期时间了。

Name: user-api
Host: 0.0.0.0
Port: 8888
Auth:
   AccessSecret: ee58582331be205b
   AccessExpire: 1140

我们如何引用呢;直接看代码

package logic

import (
   "context"
   "github.com/golang-jwt/jwt/v4"
   "time"
   "user-api/internal/svc"
   "user-api/internal/types"

   "github.com/zeromicro/go-zero/core/logx"
)

type LogicLogic struct {
   logx.Logger
   ctx    context.Context
   svcCtx *svc.ServiceContext
}

func NewLogicLogic(ctx context.Context, svcCtx *svc.ServiceContext) *LogicLogic {
   return &LogicLogic{
      Logger: logx.WithContext(ctx),
      ctx:    ctx,
      svcCtx: svcCtx,
   }
}

func (l *LogicLogic) Logic(req *types.LogicReq) (resp *types.LogicRep, err error) {
   // todo: add your logic here and delete this line
   jwtToken, err := l.getJwtToken(l.svcCtx.Config.Auth.AccessSecret, time.Now().Unix(), l.svcCtx.Config.Auth.AccessExpire, 1)
   if err != nil {
      return nil, err
   }
   return &types.LogicRep{
      Token: jwtToken,
   }, nil
}

func (l *LogicLogic) getJwtToken(secretKey string, iat, seconds, userId int64) (string, error) {
   claims := make(jwt.MapClaims)
   claims["exp"] = iat + seconds
   claims["iat"] = iat
   claims["userId"] = userId
   token := jwt.New(jwt.SigningMethodHS256)
   token.Claims = claims
   return token.SignedString([]byte(secretKey))
}

这是我的登录模块 ;返回的 Token

下面是如何调用前端 JWTUserId呢?

l.ctx.Value("userId")

好了下课,拜拜