如何在登录后自动添加JWT?

时间:2017-07-13 16:02:00

标签: go

我有一个残酷的疑问。

我正在运行以下代码:

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

一切进展顺利!但是如何在标题中添加令牌,那么当用户将其记录为正常在路径 / restricted 之间导航时?

目前,如果我在POSTMAN中添加标题授权,我可以导航路径 / restricted

但我希望一旦用户登录就可以自动完成。感激不尽!

谢谢你们。

2 个答案:

答案 0 :(得分:2)

使用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,
})

答案 1 :(得分:0)

您可以将中间件添加到/可访问路由,没问题,此时该路由与登录公开相同。

令牌标头始终从发出请求的位置发送,它位于名为Authorization的标头中,除了能够包含额外信息外,还必须指示令牌和令牌的类型。

编辑:

r := e.Group("/restricted") - > r := e.Group("/restricted", middlewareAuth)

您必须为此创建一个中间件。

祝你好运