echo-jwt

JWT

服务端(map)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main

import (
"fmt"
"github.com/dgrijalva/jwt-go"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
"time"
)

func login(c echo.Context) error {
username := c.FormValue("username")
password := c.FormValue("password")
if username == "jiang_wei" && password == "echo" {
// 创建一个token对象,传入一个header加密的算法
token := jwt.New(jwt.SigningMethodHS256)

// 为token对象设置载荷playload
// 类型断言:转换为jwt.MapClaims类型
claims := token.Claims.(jwt.MapClaims)
claims["name"] = "jiang_wei"
claims["admin"] = true
claims["iat"] = time.Now().Unix()
claims["exp"] = time.Now().Add(time.Hour * 72).Unix()

// 生成编码令牌并将其作为响应发送
t, err := token.SignedString([]byte("secret"))
if err != nil {
return err
}
fmt.Println(token)
return c.JSON(200, map[string]string{
"token": t,
})
}
return echo.ErrUnauthorized
}

func accessible(c echo.Context) error {
return c.String(200, "此路由未加认证,随意访问。")
}

func userInfo1(c echo.Context) error {
return c.String(200, " 查看用户信息")
}

func userInfo2(c echo.Context) error {
user := c.Get("user").(*jwt.Token)
claims := user.Claims.(jwt.MapClaims)
name := claims["name"].(string)

return c.String(200, "Welcome "+name+"!")
}

func main() {
e := echo.New()

// 中间件
e.Use(middleware.Logger())
e.Use(middleware.Recover())

// login route
e.POST("/login", login)

// Unauthorized route 不需要认证的路由
e.GET("/", accessible)

// authorized route 需要认证的路由
g := e.Group("/api/v1", middleware.JWT([]byte("secret")))
g.GET("/user_info1", userInfo1)
g.GET("/user_info2", userInfo2)

e.Logger.Debug(e.Start(":1111"))
}

测试:

访问不需要认证的url

通过登录url获取token

登录失败

登录成功

访问用户信息url

不带token访问用户信息

带token访问用户信息

服务端(struct)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package main

import (
"github.com/dgrijalva/jwt-go"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
"time"
)

type User struct {
UserName string
PassWord string
}

// 定义一个自定义jwt claims
type MyJwtClaims struct {
Name string `json:"name"`
Admin string `json:"admin"`
jwt.StandardClaims
}

func login(c echo.Context) error {
u := new(User)
if err := c.Bind(u); err != nil {
return err
}
if u.UserName == "jiang_wei" && u.PassWord == "echo" {

// 实例化一个自定义claims
claims := &MyJwtClaims{
"jiang_wei",
"true",
jwt.StandardClaims{
IssuedAt: time.Now().Unix(),
ExpiresAt: time.Now().Add(time.Hour * 72).Unix(),
},
}

// 执行NewWithClaimsmethod
token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

// 获取完整的签名令牌并将其作为响应发送
t, err := token.SignedString([]byte("secret"))
if err != nil {
return err
}
return c.JSON(200, echo.Map{
"token": t,
})
}
return echo.ErrUnauthorized
}

func accessible(c echo.Context) error {
return c.String(200, "此路由未加认证,随意访问。")
}

func userInfo1(c echo.Context) error {
return c.String(200, " 查看用户信息")
}

func userInfo2(c echo.Context) error {
user := c.Get("user").(*jwt.Token)
claims := user.Claims.(jwt.MapClaims)
name := claims["name"].(string)

return c.String(200, "Welcome "+name+"!")
}

func main() {
e := echo.New()

// 中间件
e.Use(middleware.Logger())
e.Use(middleware.Recover())

// login route
e.POST("/login", login)

// Unauthorized route 不需要认证的路由
e.GET("/", accessible)

// 实例化一个jwt conf对象
jwtConf := middleware.JWTConfig{
Claims: &MyJwtClaims{},
SigningKey: []byte("secret"),
}
// authorized route 需要认证的路由
g := e.Group("/api/v1", middleware.JWTWithConfig(jwtConf))
g.GET("/user_info1", userInfo1)
g.GET("/user_info2", userInfo2)

e.Logger.Debug(e.Start(":1111"))
}
/