From 0b04c16dfb1e5ad46d12adf9ddb36447934f7ce2 Mon Sep 17 00:00:00 2001 From: Umputun Date: Thu, 28 Dec 2017 14:40:12 -0600 Subject: [PATCH] auth via mounted routes --- README.md | 7 ++++--- app/rest/auth/auth.go | 10 ++++++++++ app/rest/server.go | 9 ++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 07181523..5a8a52ed 100644 --- a/README.md +++ b/README.md @@ -42,9 +42,8 @@ TBD ### Authorization -- `GET /login/{provider}?from=http://url` - perform "social" login with one of supported providers and redirect to `url` -- `GET /logout` - logout -- `GET /api/v1/user` - get user info, _auth required_ +- `GET /auth/{provider}/login?from=http://url` - perform "social" login with one of supported providers and redirect to `url` +- `GET /auth/{provider}/logout` - logout ```go type User struct { @@ -108,3 +107,5 @@ Sort can be `time` or `score`. Supported sort order with prefix -/+, i.e. `-time - `PUT /api/v1/admin/user/{userid}?site=site-id&block=1` - block or unblock user. _auth and admin required_ - `GET /api/v1/admin/export?site=side-id&block=1` - export all comments. _auth and admin required_ - `PUT /api/v1/admin/pin/{id}?site=site-id&url=post-url&pin=1` - pin or unpin comment. _auth and admin required_ +- `GET /api/v1/user` - get user info, _auth required_ + diff --git a/app/rest/auth/auth.go b/app/rest/auth/auth.go index c60203f9..f4bd411b 100644 --- a/app/rest/auth/auth.go +++ b/app/rest/auth/auth.go @@ -11,6 +11,7 @@ import ( "log" "net/http" + "github.com/go-chi/chi" "github.com/go-chi/render" "github.com/gorilla/sessions" "golang.org/x/oauth2" @@ -57,6 +58,15 @@ func initProvider(p Params, provider Provider) *Provider { return &provider } +// Routes returns auth routes for given provider +func (p Provider) Routes() chi.Router { + router := chi.NewRouter() + router.Get("/login", p.LoginHandler) + router.Get("/callback", p.AuthHandler) + router.Get("/logout", p.LogoutHandler) + return router +} + // LoginHandler - GET /login/{provider}?from=redirect-back-url func (p Provider) LoginHandler(w http.ResponseWriter, r *http.Request) { diff --git a/app/rest/server.go b/app/rest/server.go index 5c558742..2feac2c8 100644 --- a/app/rest/server.go +++ b/app/rest/server.go @@ -62,11 +62,8 @@ func (s *Server) Run() { // If you aren't using gorilla/mux, you need to wrap your handlers with context.ClearHandler router.Use(context.ClearHandler) - router.Get("/login/google", s.AuthGoogle.LoginHandler) - router.Get("/auth/google", s.AuthGoogle.AuthHandler) - router.Get("/logout", s.AuthGithub.LogoutHandler) // can hit any provider - router.Get("/login/github", s.AuthGithub.LoginHandler) - router.Get("/auth/github", s.AuthGithub.AuthHandler) + router.Mount("/auth/google", s.AuthGoogle.Routes()) + router.Mount("/auth/github", s.AuthGithub.Routes()) router.Route("/api/v1", func(rapi chi.Router) { rapi.Get("/find", s.findCommentsCtrl) @@ -75,11 +72,13 @@ func (s *Server) Run() { rapi.Get("/last/{max}", s.lastCommentsCtrl) rapi.Get("/count", s.countCtrl) + // require auth rapi.With(auth.Auth(s.SessionStore, s.Admins, applyDevMode(auth.Full))).Group(func(rauth chi.Router) { rauth.Post("/comment", s.createCommentCtrl) rauth.Get("/user", s.userInfoCtrl) rauth.Put("/vote/{id}", s.voteCtrl) + // require admin s.mod = admin{dataService: s.DataService, exporter: s.Exporter, respCache: s.respCache} rauth.Mount("/admin", s.mod.routes()) })