2016-08-13 16 views
1

私はgoとjwtで始まります。入力バイト0の不正なbase64データ

私はハードコードされた秘密を持っています。 とキー

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

以降だからlocalhostの私のルート

r.Handle("/protected", jwtMiddleware.Handler(ProtectedTestHandler)).Methods("GET") 

にjwtMiddlewareを追加取得するには、ルート:3000 /保護された意志の出力がエラー必要な許可トークン

これを発見していません働く

/トークンからトークンが出力されます。これも機能します。

そして最後に/(郵便配達中)認証で保護:ベアラ{トークン}入力バイト0 で

ウィル出力違法base64のデータ私はこれがなぜ起こるか本当に混乱しています。

+0

のように行われるべきでは基本的に私はベース64でエンコードされた文字列を期待」を意味し、今表示されていませんしかし何か他のものがあります "。 (おそらく何かデコードされたものかエラーですか?)ハッピーなデバッグ。 – Jakumi

+0

jwtMiddleware.Handlerを追加した場合にのみ発生するので、それは超奇妙です。ミドルウェアを削除してルートを公開すると、エラーは発生しません。 –

+0

よく、jwtはエンコードされなければなりません(これは私が思うような仕様ですか?)base64(header) "。" base64(ペイロード) "" base64(署名)。したがって、最初の部分が64文字の文字列で始まらない場合、おそらく正しくエンコードされません。 jwtMiddlewareライブラリを正しく使用する方法を知る必要があります。なぜなら、おそらくそれがうまくいかない理由でしょう。セットアップの仕方によっては、あなたが得ている「トークン」がエラーである可能性があります。いずれにせよ、いくつかのデバッグが順番に行われています – Jakumi

答えて

1

トークンの周りにカーリーを使用しないでください。あなたのトークンを括弧で囲んでいるため、多くの場所のドキュメントは混乱しています。プレースホルダを表すことを意味します。あなたは実際にあなたのトークンをそれらで包むことになっていません。このようにしないでください。これは、「入力バイト0で違法BASE64データ」が起こるかもしれませんが、どこ

Bearer {my-special-token} 

それはこの

Bearer my-special-token 
+0

これが役に立った場合は、それをupvoteして正しい答えとしてチェックしてください。 – jamrizzi

関連する問題