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和过期时间

...

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 response

import (
"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服务重复上面的步骤...

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. 基于EasyExcel实现的分页数据下载封装

    功能概述 主要实现的功能: 1.分页查询,避免一次性查询全部数据加载到内存引起频繁FULL GC甚至OOM 2.当数据量超过单个工作簿最大行数(1048575)时,自动将数据写入新的工作簿 3.支持百 ...

  2. EMAS Serverless到底有多便利?

    EMAS Serverless 简介 EMAS Serverless 是阿里云提供的基于Serverless技术的一站式后端开发平台,为开发者提供高可用.弹性伸缩的云开发服务,包含云函数.云数据库.云 ...

  3. ACM模式细节

    牛客网的ACM模式需要自己写输入输出,在这里简单记录一下: 基本答题框架: import java.util.*; public class Main{ public static void main ...

  4. 三 单例模式【Singleton Pattern】  来自CBF4LIFE 的设计模式

    这个模式是很有意思,而且比较简单,但是我还是要说因为它使用的是如此的广泛,如此的有人缘,单例就是单一.独苗的意思,那什么是独一份呢?你的思维是独一份,除此之外还有什么不能山寨的呢?我们举个比较难复制的 ...

  5. Html飞机大战(一):绘制动态背景

    好家伙,飞机大战终于开始弄了 这会有很多很多复杂的东西,但是我们总要从最简单,和最基础的部分开始,   我们先从背景开始弄吧! 1.绘制静态背景 这里我们会用到canvas <!DOCTYPE ...

  6. KingbaseESV8R6等待事件之lwlock buffer_content

    前言 等待事件是排查数据库性能的指标之一.简单理解,cpu在处理业务时由于业务逻辑,和不可避免的数据库其他原因造成的前台进程等待,这里的等待事件包含buffer类,io类,以及网络类等等,当我们遇到等 ...

  7. MySQL 不同隔离级别,都使用了什么锁?

    大家好,我是树哥. 在上篇文章,我们聊了「MySQL 啥时候会用表锁,啥时候用行锁」这个问题.在文章中,我们还留了一个问题,即:如果查询或更新时的数据特别多,是否从行锁会升级为表锁?此外,还有朋友留言 ...

  8. 【Vue学习笔记】—— vue的基础语法 { }

    学习笔记 作者:oMing vue v-on: 简称 @ <div id='app'> <button v-on:click='Show1'> </button> ...

  9. 新一代网络请求库:python-httpx库

    目录 httpx库 一. 概述 1. 简介 2. 命令行模式 3. 快速开始 3.1 get请求 3.2 post请求 3.2.1 表单 3.2.2 文件 3.2.3 JSON 3.2.4 二进制 3 ...

  10. 超详细的格式化输出(format的基本玩法)

    一.format的基本玩法 一.什么是format format是字符串内嵌(字符串内嵌:字符串中再嵌套字符串,加入双引号或单引号)的一个方法,用于格式化字符串.以大括号{}来标明被替换的字符串 fo ...