2017-05-16 1 views
4

현재 golang (고릴라 포함)에 웹 응용 프로그램을 구축 중이며 소수의 API 끝점을 구현했습니다.수백, 수천 개의 API 엔드 포인트에 대한 인증을 확인하는 방법은 무엇입니까?

func checkAuthorizedUser (r * http.Request) error { 
    uid, err := CheckRequestUser (r.Cookie("uid")) 
    if err != nil { 
     return errors.New("Can't find cookie value for uid") 
    } 
    if !IsValidUser (uid.Value) { 
     return errors.New("Not a valid user") 
    } 
    return nil 
} 

어떻게 나에게 발생 : 그러나, 나는 때마다 내가 요청이 승인되면 내가 확인하는 핸들러 함수의 몸체에 아래의 기능을 추가 할 필요가

func CreateUserHandler(w http.ResponseWriter, r *http.Request) {} 

같은 기능을 구현하는 것으로 나타났습니다 지금 당장은 모든 핸들러 함수에 checkAuthorizedUser()을 추가해야한다는 것과 내가 지금까지 많은 핸들러 함수를 가지고 있다는 것입니다. 클라이언트가 모든 처리기 기능에서 명시 적으로 인증을 확인하는 것 이외의 특정 끝점에 액세스 할 수있는 권한이 있는지 확인하는 더 좋은 방법이 있는지 궁금합니다.

답변

5

고릴라에는 사용할 수있는 라우터가 있습니다. 그런 다음 인증 검사를 통해 라우터를 래핑 할 수 있습니다. 이런 식으로 뭔가가 작동합니다 :

func checkPermissions(h http.Handler) http.HandlerFunc { 
    return func(w http.ResponseWriter, r *http.Request) { 
     authCheck := true //implement the actual checking 

     if authCheck { 
      w.WriteError(w, 400, "error") 
      return 
     } 

     h.ServeHttp(w, r) 
    } 
} 

func main() { 
    r := mux.NewRouter() 
    r.HandleFunc("/", HomeHandler) 
    r.HandleFunc("/products", ProductsHandler) 
    r.HandleFunc("/articles", ArticlesHandler) 
    http.Handle("/", checkPermissions(r)) 
} 

지원 링크 :

https://godoc.org/github.com/gorilla/mux#NewRouter

https://github.com/gorilla/mux

+0

감사합니다! 그러나 이는 핸들러 함수를 감싸는 패키지가 본질적으로 인증 프로세스를 처리한다는 것을 의미합니까? 모델 대신 컨트롤러가 인증을 처리해야합니까? –