本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
今天继续学习goz-zero微服务框架。兄弟们最近太忙了;坑货公司接了一个项目硬件对接音频视频项目;这几天一直在找流媒体服务器框架;天天在公司编译代码;不是C++、.Net、Vue、React这几天人都要整神的;更可恶的就是前端这几天拉起包一直不成功;后端代码代码那么难都编译出来;嘎在前端的上;很无语。废话少说今天晚上🧐了下go-zero的JWT。
什么是 JWT
在我眼里就是一个token来做鉴权验证没了。
Authorization(授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。Information Exchange(信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWT可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。 这是找的资料;说白了就是鉴权的;这玩意什么都能做;比如用MD5、哈希加密等都能做;为啥要用JWT;其实我也不知道为啥要用;估计高大上吧。
上代码实操吧
继续用我们前面的模版。 找到我们的前几天说那个登录业务模块的代码地方。
开始我们代码表演
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))
}
这是官方大大给的例子。
secretKey这个是什么 就是JWT加盐的密钥字符串(这玩意随便写生成)iat这玩意我觉得是表示当前时间戳(具体我也不知道是什么)seconds这是是我们设置当前过好久过期时间(说白就是过期时间)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
下面是如何调用前端 JWT的 UserId呢?
l.ctx.Value("userId")
好了下课,拜拜