登录后如何自动添加JWT?
How can I add JWT automatically after login?
我有一个残酷的怀疑。
我是运行下面的代码:
package main
import (
"net/http"
"time"
"github.com/dgrijalva/jwt-go"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
func login(c echo.Context) error {
username := c.FormValue("username")
password := c.FormValue("password")
if username == "jon" && password == "shhh!" {
// Create token
token := jwt.New(jwt.SigningMethodHS256)
// Set claims
claims := token.Claims.(jwt.MapClaims)
claims["name"] = "Jon Snow"
claims["admin"] = true
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,
})
}
return echo.ErrUnauthorized
}
func accessible(c echo.Context) error {
return c.String(http.StatusOK, "Accessible")
}
func restricted(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+"!")
}
func main() {
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Login route
e.POST("/login", login)
// Unauthenticated route
e.GET("/", accessible)
// Restricted group
r := e.Group("/restricted")
r.Use(middleware.JWT([]byte("secret")))
r.GET("", restricted)
e.Logger.Fatal(e.Start(":1323"))
}
字体:https://echo.labstack.com/cookbook/jwt
游乐场:https://goplay.space/#-9_4N2jM5P
一切顺利!但是我如何在 header 中添加令牌,以便当用户登录它以在路由 /restricted 之间正常导航时?
目前,如果我在 POSTMAN 中添加 header 授权,我可以导航路线 /restricted。
但我希望它在用户登录后是自动的。感激不尽!
谢谢大家。
您可以将中间件添加到 /accesible 路由,没问题,此时该路由 public 与登录名相同。
令牌 header 总是从发出请求的地方发送,它进入一个名为 Authorization 的 header 并且必须指明令牌的类型和令牌,此外还能够包含额外信息。
编辑:
r := e.Group("/restricted")
-> r := e.Group("/restricted", middlewareAuth)
您必须为此创建一个中间件。
祝你好运
使用 JWT 时,客户端通常必须自己指定令牌。为了使客户端的令牌处理无缝,您可以将令牌作为 cookie 发回。您可以配置 echo 的中间件以从 cookie 中提取令牌:
// ...
r.Use(middleware.JWTWithConfig(middleware.JWTConfig{
SigningKey: []byte("secret"),
TokenLookup: "cookie:Authorization",
}))
为此,您需要在登录处理程序中将令牌作为 cookie 发回:
// ...
c.SetCookie(http.Cookie{
Name: "Authorization",
Value: t,
Path: "/root/path",
Domain: "your.domain.com",
HttpOnly: true,
})
return c.JSON(http.StatusOK, map[string]string{
"token": t,
})
我有一个残酷的怀疑。
我是运行下面的代码:
package main
import (
"net/http"
"time"
"github.com/dgrijalva/jwt-go"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
func login(c echo.Context) error {
username := c.FormValue("username")
password := c.FormValue("password")
if username == "jon" && password == "shhh!" {
// Create token
token := jwt.New(jwt.SigningMethodHS256)
// Set claims
claims := token.Claims.(jwt.MapClaims)
claims["name"] = "Jon Snow"
claims["admin"] = true
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,
})
}
return echo.ErrUnauthorized
}
func accessible(c echo.Context) error {
return c.String(http.StatusOK, "Accessible")
}
func restricted(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+"!")
}
func main() {
e := echo.New()
// Middleware
e.Use(middleware.Logger())
e.Use(middleware.Recover())
// Login route
e.POST("/login", login)
// Unauthenticated route
e.GET("/", accessible)
// Restricted group
r := e.Group("/restricted")
r.Use(middleware.JWT([]byte("secret")))
r.GET("", restricted)
e.Logger.Fatal(e.Start(":1323"))
}
字体:https://echo.labstack.com/cookbook/jwt 游乐场:https://goplay.space/#-9_4N2jM5P
一切顺利!但是我如何在 header 中添加令牌,以便当用户登录它以在路由 /restricted 之间正常导航时?
目前,如果我在 POSTMAN 中添加 header 授权,我可以导航路线 /restricted。
但我希望它在用户登录后是自动的。感激不尽!
谢谢大家。
您可以将中间件添加到 /accesible 路由,没问题,此时该路由 public 与登录名相同。
令牌 header 总是从发出请求的地方发送,它进入一个名为 Authorization 的 header 并且必须指明令牌的类型和令牌,此外还能够包含额外信息。
编辑:
r := e.Group("/restricted")
-> r := e.Group("/restricted", middlewareAuth)
您必须为此创建一个中间件。
祝你好运
使用 JWT 时,客户端通常必须自己指定令牌。为了使客户端的令牌处理无缝,您可以将令牌作为 cookie 发回。您可以配置 echo 的中间件以从 cookie 中提取令牌:
// ...
r.Use(middleware.JWTWithConfig(middleware.JWTConfig{
SigningKey: []byte("secret"),
TokenLookup: "cookie:Authorization",
}))
为此,您需要在登录处理程序中将令牌作为 cookie 发回:
// ...
c.SetCookie(http.Cookie{
Name: "Authorization",
Value: t,
Path: "/root/path",
Domain: "your.domain.com",
HttpOnly: true,
})
return c.JSON(http.StatusOK, map[string]string{
"token": t,
})