目录

Go Echo JWT

1.1 简介

JWT 全称 JSON Web Token ,是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息是数字签名的,可以被验证和信任。

使用场景:
  • Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
  • Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。
1.2Echo 中使用(配合官方教程)
1.token 生成:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
func login(c echo.Context) error {
   username := c.FormValue("username")
   password := c.FormValue("password")
   // Throws unauthorized error
   if username == "beihai" && password == "mima" {
      fmt.Println(username)
      // Create token
      token := jwt.New(jwt.SigningMethodHS256)
      // Set claims
      claims := token.Claims.(jwt.MapClaims)
      claims["name"] = username
      claims["exp"] = time.Now().Add(time.Hour * 72).Unix()
      // Generate encoded token and send it as response.
      t, err := token.SignedString([]byte("secret"))//密钥
      if err != nil {
         return err
      }
      return c.JSON(http.StatusOK, map[string]string{"token": t,})
   } else {
      return echo.ErrUnauthorized
   }
}
2.token 解析:
1
2
3
4
5
6
func GetUsrName(c echo.Context) error {
	user := c.Get("user").(*jwt.Token)
	claims := user.Claims.(jwt.MapClaims)
	name := claims["name"].(string)
	return c.String(http.StatusOK, "Welcome "+name+"!")
}

3.启动服务:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
func main() {
	e := echo.New()
	// Middleware
	e.Use(middleware.Logger())
	e.Use(middleware.Recover())
	// Login route
	e.POST("/login", login)
	// Restricted group
	r := e.Group("/restricted")
	r.Use(middleware.JWT([]byte("secret")))//密钥与login中保持一致
	r.POST("/getusrname", GetUsrName)
	e.Logger.Fatal(e.Start(":1323"))
}

我们创建一个 r  路由组,使用 JWT 中间件,该路由组统一前缀路径为:/restricted,所以/getusrname 的实际路由为:/restricted/getusrname