Skip to content

Commit 86d5fa8

Browse files
committed
feat: add logic of generate jwt and set ip into gin context
1 parent f7caace commit 86d5fa8

File tree

2 files changed

+131
-2
lines changed

2 files changed

+131
-2
lines changed

gmicro/server/restserver/middlewares/context.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ const (
1212
func Context() gin.HandlerFunc {
1313
return func(c *gin.Context) {
1414
//从c中获取到ip地址
15-
//TODO 自己扩展
16-
//c.Set(UserIP, c.GetString(UsernameKey))
15+
ip := c.ClientIP()
16+
17+
// 向 gin context 注入 ip 地址
18+
c.Set(UserIP, ip)
1719
c.Next()
1820
}
1921
}

pkg/common/auth/jwt.go

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
package auth
2+
3+
import (
4+
"errors"
5+
"net/http"
6+
"time"
7+
8+
"github.com/dgrijalva/jwt-go"
9+
"github.com/gin-gonic/gin"
10+
)
11+
12+
type CustomClaims struct {
13+
ID uint `json:"userid"`
14+
NickName string
15+
AuthorityId uint
16+
jwt.StandardClaims
17+
}
18+
19+
func JWTAuth(signKey string) gin.HandlerFunc {
20+
return func(c *gin.Context) {
21+
// 我们这里jwt鉴权取头部信息 x-token 登录时回返回token信息 这里前端需要把token存储到cookie或者本地localSstorage中 不过需要跟后端协商过期时间 可以约定刷新令牌或者重新登录
22+
token := c.Request.Header.Get("x-token")
23+
if token == "" {
24+
c.JSON(http.StatusUnauthorized, map[string]string{
25+
"msg": "请登录",
26+
})
27+
c.Abort()
28+
return
29+
}
30+
j := NewJWT(signKey)
31+
// parseToken 解析token包含的信息
32+
claims, err := j.ParseToken(token)
33+
if err != nil {
34+
if err == TokenExpired {
35+
if err == TokenExpired {
36+
c.JSON(http.StatusUnauthorized, map[string]string{
37+
"msg": "授权已过期",
38+
})
39+
c.Abort()
40+
return
41+
}
42+
}
43+
44+
c.JSON(http.StatusUnauthorized, "未登陆")
45+
c.Abort()
46+
return
47+
}
48+
c.Set("claims", claims)
49+
c.Set("userId", claims.ID)
50+
c.Next()
51+
}
52+
}
53+
54+
type JWT struct {
55+
SigningKey []byte
56+
}
57+
58+
var (
59+
TokenExpired = errors.New("Token is expired")
60+
TokenNotValidYet = errors.New("Token not active yet")
61+
TokenMalformed = errors.New("That's not even a token")
62+
TokenInvalid = errors.New("Couldn't handle this token:")
63+
)
64+
65+
func NewJWT(sign string) *JWT {
66+
//zap.S().Info(global.ServerConfig.JWTInfo.SigningKey)
67+
return &JWT{
68+
[]byte(sign), //可以设置过期时间
69+
}
70+
}
71+
72+
// 创建一个token
73+
func (j *JWT) CreateToken(claims CustomClaims) (string, error) {
74+
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
75+
return token.SignedString(j.SigningKey)
76+
}
77+
78+
// 解析 token
79+
func (j *JWT) ParseToken(tokenString string) (*CustomClaims, error) {
80+
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (i interface{}, e error) {
81+
return j.SigningKey, nil
82+
})
83+
if err != nil {
84+
if ve, ok := err.(*jwt.ValidationError); ok {
85+
if ve.Errors&jwt.ValidationErrorMalformed != 0 {
86+
return nil, TokenMalformed
87+
} else if ve.Errors&jwt.ValidationErrorExpired != 0 {
88+
// Token is expired
89+
return nil, TokenExpired
90+
} else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
91+
return nil, TokenNotValidYet
92+
} else {
93+
return nil, TokenInvalid
94+
}
95+
}
96+
}
97+
if token != nil {
98+
if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
99+
return claims, nil
100+
}
101+
return nil, TokenInvalid
102+
103+
} else {
104+
return nil, TokenInvalid
105+
106+
}
107+
108+
}
109+
110+
// 更新token
111+
func (j *JWT) RefreshToken(tokenString string) (string, error) {
112+
jwt.TimeFunc = func() time.Time {
113+
return time.Unix(0, 0)
114+
}
115+
token, err := jwt.ParseWithClaims(tokenString, &CustomClaims{}, func(token *jwt.Token) (interface{}, error) {
116+
return j.SigningKey, nil
117+
})
118+
if err != nil {
119+
return "", err
120+
}
121+
if claims, ok := token.Claims.(*CustomClaims); ok && token.Valid {
122+
jwt.TimeFunc = time.Now
123+
claims.StandardClaims.ExpiresAt = time.Now().Add(1 * time.Hour).Unix()
124+
return j.CreateToken(*claims)
125+
}
126+
return "", TokenInvalid
127+
}

0 commit comments

Comments
 (0)