0、索引
go-zero docker-compose 搭建课件服务(一):编写服务api和proto
go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务
go-zero docker-compose 搭建课件服务(三):编写courseware api服务
go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动
go-zero docker-compose 搭建课件服务(五):欠缺user服务
go-zero docker-compose 搭建课件服务(六):欠缺jwt鉴权和返回构造
go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控
0.1源码地址
https://github.com/liuyuede123/go-zero-courseware
1、用户服务登录接口生成jwt token
user/api/etc/user.yaml中减少用于生成jwt的secret和过期工夫
...Auth: AccessSecret: 38f9c7af24ff11edb92900163e30ef81 AccessExpire: 86400
user/api/internal/config/config.go减少配置参数
...Auth struct { AccessSecret string AccessExpire int64}
在之前编写的登录逻辑中减少获取token的办法,并批改登录逻辑
...func (l *UserLoginLogic) UserLogin(req *types.LoginRequest) (resp *types.LoginResponse, err error) { login, err := l.svcCtx.UserRpc.Login(l.ctx, &userclient.LoginRequest{ LoginName: req.LoginName, Password: req.Password, }) if err != nil { return nil, err } now := time.Now().Unix() login.Token, err = l.getJwtToken(l.svcCtx.Config.Auth.AccessSecret, now, l.svcCtx.Config.Auth.AccessExpire, int64(login.Id)) if err != nil { return nil, status.Error(5000, err.Error()) } return &types.LoginResponse{ Id: login.Id, Token: login.Token, }, nil}func (l *UserLoginLogic) 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))}
2、用户明码加密
user/rpc/internal/logic/registerlogic.go批改代码加密明码
...func (l *RegisterLogic) Register(in *user.RegisterRequest) (*user.RegisterResponse, error) { _, err := l.svcCtx.UserModel.FindOneByLoginName(l.ctx, in.LoginName) if err == nil { return nil, status.Error(5000, "登录名已存在") } if err != model.ErrNotFound { return nil, status.Error(500, err.Error()) } pwd, err := bcrypt.GenerateFromPassword([]byte(in.Password), bcrypt.DefaultCost) if err != nil { return nil, status.Error(500, err.Error()) } newUser := model.User{ LoginName: in.LoginName, Username: in.Username, Sex: in.Sex, Password: string(pwd), } _, err = l.svcCtx.UserModel.Insert(l.ctx, &newUser) if err != nil { return nil, status.Error(500, err.Error()) } return &user.RegisterResponse{}, nil}
user/rpc/internal/logic/loginlogic.go 登录逻辑批改明码验证
...func (l *LoginLogic) Login(in *user.LoginRequest) (*user.LoginResponse, error) { userInfo, err := l.svcCtx.UserModel.FindOneByLoginName(l.ctx, in.LoginName) if err == model.ErrNotFound { return nil, status.Error(5000, "用户不存在") } if err != nil { return nil, status.Error(500, err.Error()) } err = bcrypt.CompareHashAndPassword([]byte(userInfo.Password), []byte(in.Password)) if err != nil { return nil, status.Error(5000, "明码谬误") } return &user.LoginResponse{ Id: userInfo.Id, Token: "a.b.c", }, nil}
3、其余接口减少鉴权中间件
批改courseware/api/courseware.api减少鉴权中间件
...@server ( jwt : Auth)service courseware { @handler coursewareAdd post /api/courseware/add (AddRequest) returns (AddResponse) @handler coursewareUpdate post /api/courseware/update (UpdateRequest) returns (UpdateResponse) @handler coursewareGet post /api/courseware/get (GetRequest) returns (GetResponse) @handler coursewareDelete post /api/courseware/delete (DeleteRequest) returns (DeleteResponse)
courseware/api/etc/courseware.yaml课件api减少auth配置
...Auth: AccessSecret: 38f9c7af24ff11edb92900163e30ef81 AccessExpire: 86400
courseware/api/internal/config/config.go减少auth配置
Auth struct { AccessSecret string AccessExpire int64}
到courseware/api/目录下从新生成路由文件
goctl api go -api courseware.api -dir . -style gozero
用户服务获取用户信息接口须要减少权限校验
批改user/api/user.api减少鉴权中间件
...service user { @handler userLogin post /api/user/login (LoginRequest) returns (LoginResponse) @handler userRegister post /api/user/register (RegisterRequest) returns (RegisterResponse)}@server ( jwt : Auth)service user { @handler userInfo post /api/user/userInfo (UserInfoRequest) returns (UserInfoResponse)}
第一步曾经生成auth相干配置不须要从新设置,到user/api/目录下更新路由
goctl api go -api user.api -dir . -style gozero
4、返回构造优化
课件api层新增courseware/api/response/response.go
package responseimport ( "github.com/zeromicro/go-zero/rest/httpx" "net/http")type Body struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data,omitempty"`}func Response(w http.ResponseWriter, resp interface{}, err error) { var body Body if err != nil { body.Code = 5000 body.Message = err.Error() body.Data = nil } else { body.Code = 0 body.Message = "OK" body.Data = resp } httpx.OkJson(w, body)}
handler中批改返回构造
批改前
...if err != nil { httpx.Error(w, err) } else { httpx.OkJson(w, resp) }
批改后
response.Response(w, resp, err)
用户api服务反复下面的步骤...