0

我正在尝试 JWT 中间件示例以使 JWT 与 Martini 一起使用,并且当它遇到身份验证处理程序时它会给我一个回报。

这是直接来自示例的代码..

package main

import (
    "encoding/json"
    "github.com/auth0/go-jwt-middleware"
    "github.com/dgrijalva/jwt-go"
    "github.com/go-martini/martini"
    "net/http"
)

func main() {

    StartServer()

}

func StartServer() {
    m := martini.Classic()

    jwtMiddleware := jwtmiddleware.New(jwtmiddleware.Options{
        ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
            return []byte("My Secret"), nil
        },
        SigningMethod: jwt.SigningMethodHS256,
    })

    m.Get("/ping", PingHandler)
    m.Get("/secured/ping", jwtMiddleware.CheckJWT, SecuredPingHandler)

    m.Run()
}

type Response struct {
    Text string `json:"text"`
}

func respondJson(text string, w http.ResponseWriter) {
    response := Response{text}

    jsonResponse, err := json.Marshal(response)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    w.Header().Set("Content-Type", "application/json")
    w.Write(jsonResponse)
}

func PingHandler(w http.ResponseWriter, r *http.Request) {
    respondJson("All good. You don't need to be authenticated to call this", w)
}

func SecuredPingHandler(w http.ResponseWriter, r *http.Request) {
    respondJson("All good. You only get this message if you're authenticated", w)
}

如果我点击未经身份验证的路线,它会起作用。如果我点击经过身份验证的路线,它会告诉我我需要一个令牌。如果我使用不正确的令牌访问经过身份验证的路由,我会收到一条错误消息,

signature is invalid
<*errors.errorString Value>

所以这一切都有效。如果我使用正确的令牌点击经过身份验证的路由,它会给我作为返回文本。我不知道为什么。这直接来自他们的示例,尽管我在我的个人项目中得到了相同的结果。

4

1 回答 1

0

代替

m.Get("/secured/ping", jwtMiddleware.CheckJWT, SecuredPingHandler)

试试这个

m.Get("/secured/ping", jwtMiddleware.Handler(SecuredPingHandler))
于 2017-02-17T05:04:28.360 回答