echo-jwt 发表于 2019-08-01 | 分类于 go web框架 Echo | 浏览 次 echo使用jwt中间件认证 JWT服务端(map)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374package mainimport ( "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)12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394package mainimport ( "github.com/dgrijalva/jwt-go" "github.com/labstack/echo" "github.com/labstack/echo/middleware" "time")type User struct { UserName string PassWord string}// 定义一个自定义jwt claimstype 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"))} 打赏 微信支付 支付宝