在改造为微服务框架后, 加入token验证中间件间的时候会报错, 不加中间件就没问题。

来源:10-14 综合测试演示+小结

慕仰9495179

2020-10-19

在改造为微服务框架后 加入token验证中间件间的时候会报错 不加中间件就没问题。
图片描述
图片描述

然后再apiwg.log中有该报错信息

[31m2020/10/19 17:56:36 [Recovery] 2020/10/19 - 17:56:36 panic recovered:
GET /user/info?username=admin2&token=24072fcfb4a5e324b3816accbf4926145f8d62d3 HTTP/1.1

Host: localhost:8080

Accept: */*

Accept-Encoding: gzip, deflate

Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

Connection: keep-alive

Referer: http://localhost:8080/static/view/home.html

User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:81.0) Gecko/20100101 Firefox/81.0

X-Requested-With: XMLHttpRequest




runtime error: invalid memory address or nil pointer dereference
/opt/go/src/runtime/panic.go:212 (0x99b7d9)
	panicmem: panic(memoryError)
/opt/go/src/runtime/signal_unix.go:695 (0x99b628)
	sigpanic: panicmem()
/home/zwx/go/src/filestore-hsz/service/dbproxy/client/client.go:53 (0x147d620)
	execAction: return dbCli.ExecuteAction(context.TODO(), &dbProto.ReqExec{
/home/zwx/go/src/filestore-hsz/service/dbproxy/client/client.go:207 (0x147d8a8)
	GetUserToken: res, err := execAction("/user/GetUserToken", uInfo)
/home/zwx/go/src/filestore-hsz/service/apiwg/handler/auth.go:57 (0x148dc1e)
	IsTokenValid: dbToken, err := dbCli.GetUserToken(username)
/home/zwx/go/src/filestore-hsz/service/apiwg/handler/auth.go:23 (0x14902d6)
	HTTPInterceptor.func1: if len(username) < 3 || !IsTokenValid(token, username) {
/home/zwx/go/src/filestore-hsz/vendor/github.com/gin-gonic/gin/context.go:156 (0x142181a)
	(*Context).Next: c.handlers[c.index](c)
/home/zwx/go/src/filestore-hsz/vendor/github.com/gin-gonic/gin/recovery.go:83 (0x143506f)
	RecoveryWithWriter.func1: c.Next()
/home/zwx/go/src/filestore-hsz/vendor/github.com/gin-gonic/gin/context.go:156 (0x142181a)
	(*Context).Next: c.handlers[c.index](c)
/home/zwx/go/src/filestore-hsz/vendor/github.com/gin-gonic/gin/logger.go:241 (0x14341a0)
	LoggerWithConfig.func1: c.Next()
/home/zwx/go/src/filestore-hsz/vendor/github.com/gin-gonic/gin/context.go:156 (0x142181a)
	(*Context).Next: c.handlers[c.index](c)
/home/zwx/go/src/filestore-hsz/vendor/github.com/gin-gonic/gin/gin.go:409 (0x142b705)
	(*Engine).handleHTTPRequest: c.Next()
/home/zwx/go/src/filestore-hsz/vendor/github.com/gin-gonic/gin/gin.go:367 (0x142addd)
	(*Engine).ServeHTTP: engine.handleHTTPRequest(c)
/opt/go/src/net/http/server.go:2807 (0xc3d152)
	serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
/opt/go/src/net/http/server.go:1895 (0xc38a1b)
	(*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
/opt/go/src/runtime/asm_amd64.s:1373 (0x9b5a90)
	goexit: BYTE	$0x90	// NOP
[0m
[GIN] 2020/10/19 - 17:56:36 | 500 |  199.322855ms |       127.0.0.1 | GET      "/user/info?username=admin2&token=24072fcfb4a5e324b3816accbf4926145f8d62d3"

拦截器代码

// http请求拦截器
func HTTPInterceptor() gin.HandlerFunc {
	return func(c *gin.Context) {

		username := c.Request.FormValue("username")
		token := c.Request.FormValue("token")

		// 验证登录token是否有效
		// TODO error
		//log.Println("hsz1")
		if len(username) < 3 || !IsTokenValid(token, username) {
			//log.Println("hsz2")
			// token校验失败则跳转到登录界面
			c.Abort()
			resp := util.NewRespMsg(
				int(common.StatusInvalidToken),
				"token无效",
				nil,
			)
			c.JSON(http.StatusOK, resp)
		}
		c.Next()
	}
}

// token是否有效
func IsTokenValid(token string, username string) bool {
	if len(token) != 40 {
		log.Println("token invalid: " + token)
		return false
	}
	// 判断token的时效性 是否过期
	// 假设token的有效期为1天
	tokenTS := token[32:40]
	if util.Hex2Dec(tokenTS) < time.Now().Unix()-86400 {
		log.Println("token expired: " + token)
		return false
	}

	// 从数据库表tbl_user_token查询username对应的token信息
	// 对比两个token是否一致
	// TODO error
	log.Println("username"+ username)
	//log.Println("hsz11")
	dbToken, err := dbCli.GetUserToken(username)
	//log.Println("hsz22")
	if err != nil || dbToken != token {
		return false
	}

	return true
}
写回答

1回答

慕仰9495179

提问者

2020-10-21

在IsTokenValid里面的dbToken, err := dbCli.GetUserToken(username)中, dbCli即dbproxy/client,client里面的dbCli 没有初始化,才会报空指针错误

//img.mukewang.com/szimg/5f8fc16f081d788411870767.jpg

需要在IsTokenValid的dbToken, err := dbCli.GetUserToken(username)前面添加

service := micro.NewService(

micro.Registry(config.RegistryConsul()),

)

service.Init()

dbCli.Init(service)


0
0

Go实战仿百度云盘-实现企业级分布式云存储系统

紧随“云时代”技术潮流,分布式云存储系统,做第一代云程序员

1077 学习 · 494 问题

查看课程