2016-09-29 8 views
0

私は、go-restfulで書かれた非常にシンプルなgoサービスでJWT認証を接続しようとしています。go-restful + JWT認証

コードは、と非常に類似している:restful.Requesthttp.Requestのラッパーである

package main 

import (
    "github.com/emicklei/go-restful" 
    "log" 
    "net/http" 
) 

type User struct { 
    Id, Name string 
} 

type UserList struct { 
    Users []User 
} 

func getAllUsers(request *restful.Request, response *restful.Response) { 
    log.Printf("getAllUsers") 
    response.WriteEntity(UserList{[]User{{"42", "Gandalf"}, {"3.14", "Pi"}}}) 
} 

func NewUserService() *restful.WebService { 
    ws := new(restful.WebService) 
    ws. 
     Path("/users"). 
     Consumes(restful.MIME_XML, restful.MIME_JSON). 
     Produces(restful.MIME_JSON, restful.MIME_XML) 

    ws.Route(ws.GET("").To(getAllUsers)) 

    return ws 
} 


func main() { 
    restful.Add(NewUserService()) 
    log.Printf("start listening on localhost:8080") 
    log.Fatal(http.ListenAndServe(":8080", nil)) 
} 

つまり、Auth0 jwt middlewareを使用することができます。

しかし、ゴランの初心者として、私は配管プロセスで少し失われています。私は

func jwtAuthentication(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { 
    // Jwt Magic goes here \o 
    chain.ProcessFilter(req, resp) 
} 

ws.Filter(jwtAuthentication) 

ようFilter機能を使用する必要があります。しかし、私はどこでどのように把握していない私はJWTミドルウェアをインスタンス化する必要があることを参照してください。

答えて

1

auth0/go-jwt-middlewareを使用したフィルタ実装の例を次に示します。実際には毎回jwtMiddlewareの新しいインスタンスを作成しないようにしたいと考えています。

func jwtAuthentication(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) { 
    jwtMiddleware := jwtmiddleware.New(jwtmiddleware.Options{ 
     ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) { 
      return []byte("My Secret"), nil 
     }, 
     SigningMethod: jwt.SigningMethodHS256, 
    }) 

    if err := jwtMiddleware.CheckJWT(resp.ResponseWriter, req.Request); err != nil { 
     logger.Errorf("Authentication error: %v", err) 
    } 
    chain.ProcessFilter(req, resp) 
} 

フィルタ後解析されたトークンは、(auth0/go-jwt-middlewaregorilla/contextを使用して)コンテキストであろう。デフォルトコンテキストキーはuserです。

注:JWTMiddleware.SigningMethodが設定されている場合、ミドルウェアはトークンが特定の署名アルゴリズムで署名されていることを確認します。

署名方法が一定でない場合は、ValidationKeyGetterコールバックを使用して追加チェックを実装できます。

セキュリティ上の問題を避けるために重要です。here