生产环境用Go语言完成微服务搭建和业务融入

业务场景:已经有一套在运行的php项目,但是性能和灵活性不足。需要开发部署一套go语言服务,但是要能兼容前项目的鉴权规则。那么我们除了将php的鉴权模块独立出来,放到网关,再就是在go服务里写一个同逻辑的中间件。

我发现了项目中这张表里存了用户的token和创建销毁时间,也就不难猜出,原来的后端是通过这里判断token有效和时间的。

那么作为后来者,我也可以通过这张表去对比前端携带的token是否合法,就有了以下的代码。

Go 复制代码
// Token验证中间件(仅通过token验证)
func TokenAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求头获取token
		token := c.GetHeader("Authorization")
		if token == "" {
			c.JSON(http.StatusUnauthorized, gin.H{
				"success": false,
				"error":   "未授权",
			})
			c.Abort()
			return
		}

		// 去除可能的"Bearer "前缀
		if strings.HasPrefix(token, "Bearer ") {
			token = strings.TrimPrefix(token, "Bearer ")
		}
		log.Printf("前端token%s:", token)
		// 验证token有效性
		isValid := verifyToken(token)
		if !isValid {
			c.JSON(http.StatusUnauthorized, gin.H{
				"success": false,
				"error":   "未授权",
			})
			c.Abort()
			return
		}

		// token验证通过,继续执行后续逻辑
		c.Next()
	}
}

// 通过token验证有效性
func verifyToken(token string) bool {
	// 查询token对应的记录
	type UserToken struct {
		Createtime int64 `json:"createtime"`
		Expiretime int64 `json:"expiretime"`
	}

	var userToken UserToken

	// 查询该token对应的记录
	query := `
        SELECT createtime, expiretime 
        FROM fa_user_token 
        WHERE token = ? 
        LIMIT 1
    `

	err := dbManager.GetDB().QueryRow(query, token).Scan(
		&userToken.Createtime,
		&userToken.Expiretime,
	)

	if err != nil {
		if err == sql.ErrNoRows {
			log.Printf("token不存在: %s", token)
		} else {
			log.Printf("查询token失败: %s, 错误: %v", token, err)
		}
		return false
	}

	// 获取当前时间戳(秒级)
	currentTime := time.Now().Unix()

	// 验证是否过期
	isExpired := false

	// 1. 验证是否超过两个月(5184000秒 = 60天)
	twoMonthsAgo := currentTime - 5184000
	//2592000 一个月
	//1296000 半个月
	if userToken.Createtime < twoMonthsAgo {
		isExpired = true
		log.Printf("token已超过两个月: %s", token)
	}

	// 2. 检查是否已主动退出/销毁(expiretime字段有值且小于当前时间)
	if userToken.Expiretime > 0 {
		if currentTime > userToken.Expiretime {
			isExpired = true
			log.Printf("token已主动退出/销毁: %s, 销毁时间: %d", token, userToken.Expiretime)
		} else {
			log.Printf("token有效期内: %s, 过期时间: %d", token, userToken.Expiretime)
		}
	} else {
		log.Printf("token无过期时间设置: %s", token)
	}

	if isExpired {
		return false
	}

	log.Printf("token验证成功: %s", token)
	return true
}

使用时作为中间件放入到函数中当做参数传入就ok了。

相关推荐
2601_960567967 小时前
电商套图自动化效率的工程量化分析——从逐张生成到批量套图的架构演进
运维·架构·自动化
shiyi.十一8 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
张忠琳9 小时前
【NVIDIA】 NVIDIA Container Toolkit v1.19.1 — OCI 模块超深度分析之三
云原生·容器·架构·kubernetes·nvidia
阿里云云原生10 小时前
让 AI Agent 看见正在发生的业务,阿里云 EventHouse 正式商业化
云原生
XUHUOJUN10 小时前
Azure Local VM 部署第 1 篇:Hyperconverged 路径完整实战
架构·azure local
AOwhisky11 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
REST_302712 小时前
告别Excel孤岛:一款任务链路可视化工具带来的真实改变
大数据·微服务·云计算·编辑器·excel·动态规划
beibeix201513 小时前
CppMicroServices 核心概念:动态服务注册与模块化系统
微服务·mitk
微三云 - 廖会灵 (私域系统开发)14 小时前
电商系统从单体到微服务拆分实践:拆什么、怎么拆、拆完后怎么办
微服务·云原生·架构
在水一缸14 小时前
苹果AI国行版过审背后的技术架构深度解析:端侧模型与私有云计算的融合实践
人工智能·架构·云计算·技术架构·苹果ai·端侧模型·私有云计算