我从 go 和 jwt 开始。
为了测试目的,我有一个硬编码的秘密。以及获取钥匙的路线
const secretKey = "YOLOSWAG"
var mySigningKey = []byte(secretKey)
var GetTokenHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
token := jwt.New(jwt.SigningMethodHS256)
token.Claims = jwt.MapClaims{
"admin": true,
"name": "John Doe",
"exp": time.Now().Add(time.Hour * 24).Unix(),
}
tokenString, _ := token.SignedString(mySigningKey)
w.Write([]byte(tokenString))
})
var jwtMiddleware = jwtmiddleware.New(jwtmiddleware.Options{
ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
return mySigningKey, nil
},
SigningMethod: jwt.SigningMethodHS256,
})
Run Code Online (Sandbox Code Playgroud)
后来将 jwtMiddleware 添加到我的路线中
r.Handle("/protected", jwtMiddleware.Handler(ProtectedTestHandler)).Methods("GET")
Run Code Online (Sandbox Code Playgroud)
所以 localhost:3000/protected 会输出一个错误 未找到所需的授权令牌
这有效。
/token 将输出我的令牌。这也有效。
最后 /protected(在邮递员中)授权:Bearer {token}
将在输入字节 0 处输出非法的 base64 数据我真的很困惑为什么会发生这种情况。
不要在令牌周围使用花括号。许多地方的文档令人困惑,因为它将您的令牌包裹在花括号中。它的目的是代表一个占位符。实际上你不应该用它们来包装你的令牌。不要这样做。
Bearer {my-special-token}
Run Code Online (Sandbox Code Playgroud)
应该这样做
Bearer my-special-token
Run Code Online (Sandbox Code Playgroud)