在改造为微服务框架后, 加入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 没有初始化,才会报空指针错误
需要在IsTokenValid的dbToken, err := dbCli.GetUserToken(username)前面添加
service := micro.NewService(
micro.Registry(config.RegistryConsul()),
)
service.Init()
dbCli.Init(service)
00
相似问题