0、转载

go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构

0.1源码地址

https://github.com/liuyuede123/go-zero-courseware

1、用户服务登录接口生成jwt token

user/api/etc/user.yaml中增加用于生成jwt的secret和过期时间

  1. ...
  2. Auth:
  3. AccessSecret: 38f9c7af24ff11edb92900163e30ef81
  4. AccessExpire: 86400

user/api/internal/config/config.go增加配置参数

  1. ...
  2. Auth struct {
  3. AccessSecret string
  4. AccessExpire int64
  5. }

在之前编写的登录逻辑中增加获取token的方法,并修改登录逻辑

  1. ...
  2. func (l *UserLoginLogic) UserLogin(req *types.LoginRequest) (resp *types.LoginResponse, err error) {
  3. login, err := l.svcCtx.UserRpc.Login(l.ctx, &userclient.LoginRequest{
  4. LoginName: req.LoginName,
  5. Password: req.Password,
  6. })
  7. if err != nil {
  8. return nil, err
  9. }
  10. now := time.Now().Unix()
  11. login.Token, err = l.getJwtToken(l.svcCtx.Config.Auth.AccessSecret, now, l.svcCtx.Config.Auth.AccessExpire, int64(login.Id))
  12. if err != nil {
  13. return nil, status.Error(5000, err.Error())
  14. }
  15. return &types.LoginResponse{
  16. Id: login.Id,
  17. Token: login.Token,
  18. }, nil
  19. }
  20. func (l *UserLoginLogic) getJwtToken(secretKey string, iat, seconds, userId int64) (string, error) {
  21. claims := make(jwt.MapClaims)
  22. claims["exp"] = iat + seconds
  23. claims["iat"] = iat
  24. claims["userId"] = userId
  25. token := jwt.New(jwt.SigningMethodHS256)
  26. token.Claims = claims
  27. return token.SignedString([]byte(secretKey))
  28. }

2、用户密码加密

user/rpc/internal/logic/registerlogic.go修改代码加密密码

  1. ...
  2. func (l *RegisterLogic) Register(in *user.RegisterRequest) (*user.RegisterResponse, error) {
  3. _, err := l.svcCtx.UserModel.FindOneByLoginName(l.ctx, in.LoginName)
  4. if err == nil {
  5. return nil, status.Error(5000, "登录名已存在")
  6. }
  7. if err != model.ErrNotFound {
  8. return nil, status.Error(500, err.Error())
  9. }
  10. pwd, err := bcrypt.GenerateFromPassword([]byte(in.Password), bcrypt.DefaultCost)
  11. if err != nil {
  12. return nil, status.Error(500, err.Error())
  13. }
  14. newUser := model.User{
  15. LoginName: in.LoginName,
  16. Username: in.Username,
  17. Sex: in.Sex,
  18. Password: string(pwd),
  19. }
  20. _, err = l.svcCtx.UserModel.Insert(l.ctx, &newUser)
  21. if err != nil {
  22. return nil, status.Error(500, err.Error())
  23. }
  24. return &user.RegisterResponse{}, nil
  25. }

user/rpc/internal/logic/loginlogic.go 登录逻辑修改密码验证

  1. ...
  2. func (l *LoginLogic) Login(in *user.LoginRequest) (*user.LoginResponse, error) {
  3. userInfo, err := l.svcCtx.UserModel.FindOneByLoginName(l.ctx, in.LoginName)
  4. if err == model.ErrNotFound {
  5. return nil, status.Error(5000, "用户不存在")
  6. }
  7. if err != nil {
  8. return nil, status.Error(500, err.Error())
  9. }
  10. err = bcrypt.CompareHashAndPassword([]byte(userInfo.Password), []byte(in.Password))
  11. if err != nil {
  12. return nil, status.Error(5000, "密码错误")
  13. }
  14. return &user.LoginResponse{
  15. Id: userInfo.Id,
  16. Token: "a.b.c",
  17. }, nil
  18. }

3、其他接口增加鉴权中间件

修改courseware/api/courseware.api增加鉴权中间件

  1. ...
  2. @server (
  3. jwt : Auth
  4. )
  5. service courseware {
  6. @handler coursewareAdd
  7. post /api/courseware/add (AddRequest) returns (AddResponse)
  8. @handler coursewareUpdate
  9. post /api/courseware/update (UpdateRequest) returns (UpdateResponse)
  10. @handler coursewareGet
  11. post /api/courseware/get (GetRequest) returns (GetResponse)
  12. @handler coursewareDelete
  13. post /api/courseware/delete (DeleteRequest) returns (DeleteResponse)

courseware/api/etc/courseware.yaml课件api增加auth配置

  1. ...
  2. Auth:
  3. AccessSecret: 38f9c7af24ff11edb92900163e30ef81
  4. AccessExpire: 86400

courseware/api/internal/config/config.go增加auth配置

  1. Auth struct {
  2. AccessSecret string
  3. AccessExpire int64
  4. }

到courseware/api/目录下重新生成路由文件

  1. goctl api go -api courseware.api -dir . -style gozero

用户服务获取用户信息接口需要增加权限校验

修改user/api/user.api增加鉴权中间件

  1. ...
  2. service user {
  3. @handler userLogin
  4. post /api/user/login (LoginRequest) returns (LoginResponse)
  5. @handler userRegister
  6. post /api/user/register (RegisterRequest) returns (RegisterResponse)
  7. }
  8. @server (
  9. jwt : Auth
  10. )
  11. service user {
  12. @handler userInfo
  13. post /api/user/userInfo (UserInfoRequest) returns (UserInfoResponse)
  14. }

第一步已经生成auth相关配置不需要重新设置,到user/api/目录下更新路由

  1. goctl api go -api user.api -dir . -style gozero

4、返回结构优化

课件api层新增courseware/api/response/response.go

  1. package response
  2. import (
  3. "github.com/zeromicro/go-zero/rest/httpx"
  4. "net/http"
  5. )
  6. type Body struct {
  7. Code int `json:"code"`
  8. Message string `json:"message"`
  9. Data interface{} `json:"data,omitempty"`
  10. }
  11. func Response(w http.ResponseWriter, resp interface{}, err error) {
  12. var body Body
  13. if err != nil {
  14. body.Code = 5000
  15. body.Message = err.Error()
  16. body.Data = nil
  17. } else {
  18. body.Code = 0
  19. body.Message = "OK"
  20. body.Data = resp
  21. }
  22. httpx.OkJson(w, body)
  23. }

handler中修改返回结构

修改前

  1. ...
  2. if err != nil {
  3. httpx.Error(w, err)
  4. } else {
  5. httpx.OkJson(w, resp)
  6. }

修改后

  1. response.Response(w, resp, err)

用户api服务重复上面的步骤...

go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构的更多相关文章

  1. Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  2. Docker Compose 搭建 Redis Cluster 集群环境

    在前文<Docker 搭建 Redis Cluster 集群环境>中我已经教过大家如何搭建了,本文使用 Docker Compose 再带大家搭建一遍,其目的主要是为了让大家感受 Dock ...

  3. Istio入门实战与架构原理——使用Docker Compose搭建Service Mesh

    本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于Kubernetes的教程仿佛不是亲儿子,写得非常随便,不仅缺 ...

  4. 利用 Docker Compose 搭建 SpringBoot 运行环境(超详细步骤和分析)

    0.前言 相信点进来看这篇文章的同学们已经对 Docker Dompose 有一定的了解了,下面,我们拿最简单的例子来介绍如何使用 Docker Compose 来管理项目. 本文例子: 一个应用服务 ...

  5. 使用Docker Compose搭建Service Mesh

    使用Docker Compose搭建Service Mesh 本文将介绍如何使用Docker Compose搭建Istio.Istio号称支持多种平台(不仅仅Kubernetes).然而,官网上非基于 ...

  6. go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务

    0.索引 go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务 0.1源码地址 https://github.com/liuyuede123/go-zero ...

  7. go-zero docker-compose 搭建课件服务(五):完善user服务

    0.转载 go-zero docker-compose 搭建课件服务(五):完善user服务 0.1源码地址 https://github.com/liuyuede123/go-zero-course ...

  8. go-zero docker-compose搭建课件服务(四):生成Dockerfile

    0.转载 go-zero docker-compose 搭建课件服务(四):生成Dockerfile并在docker-compose中启动 0.1源码地址 https://github.com/liu ...

  9. go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪

    0.转载 go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪 0.1源码地址 https://github.com/liuyuede123/go-zero-co ...

随机推荐

  1. 任意N阶幻方算法实现

    算法原理请参考:https://www.zhihu.com/question/23531676 先定义一些通用的函数,比如创建空幻方,删除幻方,打印幻方. 创建幻方 int **NewMagicS(i ...

  2. [原创] RestartPC64-中文版v1.0.0.9

    原来发布的RestartPC-中文版和英文版v1.0.0.5,在PE64下无效.所以重新编译了64位版的RestartPC64-中文版v1.0.0.9,可以在PE64下面.正常Win64系统下面重启关 ...

  3. js中数组去重的方法

    在实际工作或面试中,我们经常会遇到"数组去重"问题,接下来就是使用js实现的数组去重的多种方法: 1.借助ES6提供的Set结构 var arr = [1,1,2,2,3,3,4, ...

  4. MySQL 数据操纵语句

    插入 插入多个字段 insert into grade (`name`) values ('大一'),('大二'),('大三'),('大四'); 修改 设置时间为当前时间 update `studen ...

  5. 使用three.js(webgl)搭建智慧楼宇、设备检测、数字孪生——第十三课

    老子云:有道无术,术尚可求,有术无道,止于术. 咱开篇引用老子的话术,也没其它意思,只是最近学习中忽有感悟,索性就写了上来. 这句话用现代辩证思维理解,这里的"道" 大抵是指方法论 ...

  6. 若依 | 点击顶部 tag 标签不自动刷新

    需求场景 之前:只要点击若依顶部的标签,页面都会自动刷新. 问题:A 页面有查询结果,切换到 B 页面查看信息,再切回 A 页面,则 A 页面的查询结果不会保留. 需求:点击标签,页面不自动刷新,或者 ...

  7. 哔哩哔哩b站提取Cookie方法,bilibili获取Cookie教程

    大家可能对Cookie很陌生,甚至不知道是干嘛用,没关系,今天小编详细给大家讲解! Cookie是保存在客户端的纯文本文件,比如txt文件,所谓的客户端就是我们自己的本地电脑,当我们使用自己的电脑通过 ...

  8. 蕞短鹭(artskjid) (⭐通信题/模拟⭐)

    文章目录 题面(过于冗长,主要是对通信题的一些解释) 题解 1.通信题什么意思 2.此题题解 CODE 实现 题面(过于冗长,主要是对通信题的一些解释) 题解 1.通信题什么意思 并不是两个程序同时跑 ...

  9. 【lwip】04-网络数据包流向

    目录 前言 4.1 TCPIP分层与lwip数据共享 4.2 协议栈线程模型 4.3 pbuf 结构体 4.3.1 pbuf的标志位flags 4.4 pbuf的类型 4.4.1 PBUF_RAM类型 ...

  10. C++ 对于函数名的操作,函数名本身和取*以及取&的区别

    void TestFunc() { } int _tmain(int argc, _TCHAR* argv[]) { cout<<TestFunc<<endl; cout< ...