move avatar proxy to login handler

This commit is contained in:
Umputun
2018-02-14 16:59:50 -06:00
parent 20a1047709
commit c71f4baf83
4 changed files with 29 additions and 25 deletions
+12 -10
View File
@@ -98,6 +98,12 @@ func main() {
exporter := migrator.Remark{DataStore: dataStore}
avatarProxy := &avatar.Proxy{
StorePath: opts.ServerCommand.AvatarStore,
RoutePath: "/api/v1/avatar",
DefaultAvatar: opts.ServerCommand.DefaultAvatar,
}
srv := rest.Server{
Version: revision,
DataService: dataService,
@@ -105,13 +111,9 @@ func main() {
Admins: opts.Admins,
DevMode: opts.DevMode,
Exporter: &exporter,
AuthProviders: makeAuthProviders(sessionStore),
AuthProviders: makeAuthProviders(sessionStore, avatarProxy),
Cache: common.NewLoadingCache(4*time.Hour, 15*time.Minute, postFlushFn),
AvatarProxy: avatar.Proxy{
StorePath: opts.ServerCommand.AvatarStore,
RoutePath: "/api/v1/avatar",
DefaultAvatar: opts.ServerCommand.DefaultAvatar,
},
AvatarProxy: avatarProxy,
}
if opts.DevMode {
@@ -173,19 +175,19 @@ func makeDirs(dirs ...string) error {
return nil
}
func makeAuthProviders(sessionStore sessions.Store) []auth.Provider {
func makeAuthProviders(sessionStore sessions.Store, avatarProxy *avatar.Proxy) []auth.Provider {
providers := []auth.Provider{}
srvOpts := opts.ServerCommand
if srvOpts.GoogleCID != "" && srvOpts.GoogleCSEC != "" {
providers = append(providers, auth.NewGoogle(auth.Params{
providers = append(providers, auth.NewGoogle(auth.Params{AvatarProxy: avatarProxy,
Cid: srvOpts.GoogleCID, Csecret: srvOpts.GoogleCSEC, SessionStore: sessionStore, RemarkURL: opts.RemarkURL}))
}
if srvOpts.GithubCID != "" && srvOpts.GithubCSEC != "" {
providers = append(providers, auth.NewGithub(auth.Params{
providers = append(providers, auth.NewGithub(auth.Params{AvatarProxy: avatarProxy,
Cid: srvOpts.GithubCID, Csecret: srvOpts.GithubCSEC, SessionStore: sessionStore, RemarkURL: opts.RemarkURL}))
}
if srvOpts.FacebookCID != "" && srvOpts.FacebookCSEC != "" {
providers = append(providers, auth.NewFacebook(auth.Params{
providers = append(providers, auth.NewFacebook(auth.Params{AvatarProxy: avatarProxy,
Cid: srvOpts.FacebookCID, Csecret: srvOpts.FacebookCSEC, SessionStore: sessionStore, RemarkURL: opts.RemarkURL}))
}
if len(providers) == 0 {
+13 -2
View File
@@ -17,6 +17,7 @@ import (
"github.com/gorilla/sessions"
"golang.org/x/oauth2"
"github.com/umputun/remark/app/rest/avatar"
"github.com/umputun/remark/app/rest/common"
"github.com/umputun/remark/app/store"
)
@@ -31,6 +32,7 @@ type Provider struct {
Endpoint oauth2.Endpoint
Scopes []string
MapUser func(userData) store.User
AvatarProxy *avatar.Proxy
conf *oauth2.Config
}
@@ -41,6 +43,7 @@ type Params struct {
Csecret string
SessionStore sessions.Store
RemarkURL string
AvatarProxy *avatar.Proxy
}
type userData map[string]interface{}
@@ -53,7 +56,7 @@ func (u userData) value(key string) string {
}
// newProvider makes auth for given provider
func initProvider(p Params, provider Provider) Provider {
func initProvider(p Params, provider Provider, avatarProxy *avatar.Proxy) Provider {
log.Printf("[INFO] create %s auth, id=%s, redir: %s", provider.Name, p.Cid, provider.RedirectURL)
conf := oauth2.Config{
@@ -66,6 +69,7 @@ func initProvider(p Params, provider Provider) Provider {
provider.conf = &conf
provider.Store = p.SessionStore
provider.AvatarProxy = avatarProxy
return provider
}
@@ -161,7 +165,14 @@ func (p Provider) authHandler(w http.ResponseWriter, r *http.Request) {
}
log.Printf("[DEBUG] got raw user info %+v", jData)
session.Values["uinfo"] = p.MapUser(jData)
u := p.MapUser(jData)
if avatarURL, e := p.AvatarProxy.Put(u); e == nil {
u.Picture = avatarURL
} else {
log.Printf("[WARN] failed to proxy avatar, %s", e)
}
session.Values["uinfo"] = u
if err = session.Save(r, w); err != nil {
common.SendErrorJSON(w, r, http.StatusInternalServerError, err, "failed to save user info")
return
+1 -10
View File
@@ -6,9 +6,6 @@ import (
"github.com/gorilla/sessions"
"log"
"github.com/umputun/remark/app/rest/avatar"
"github.com/umputun/remark/app/rest/common"
"github.com/umputun/remark/app/store"
)
@@ -32,7 +29,7 @@ var devUser = store.User{
}
// Auth middleware adds auth from session and populates user info
func Auth(sessionStore sessions.Store, avatarProxy avatar.Proxy, admins []string, modes []Mode) func(http.Handler) http.Handler {
func Auth(sessionStore sessions.Store, admins []string, modes []Mode) func(http.Handler) http.Handler {
inModes := func(mode Mode) bool {
for _, m := range modes {
@@ -82,12 +79,6 @@ func Auth(sessionStore sessions.Store, avatarProxy avatar.Proxy, admins []string
}
}
if avatarURL, e := avatarProxy.Put(user); e == nil {
user.Picture = avatarURL
} else {
log.Printf("[WARN] failed to proxy avatar, %s", e)
}
ctx := r.Context()
ctx = context.WithValue(ctx, common.ContextKey("user"), user)
r = r.WithContext(ctx)
+3 -3
View File
@@ -39,7 +39,7 @@ type Server struct {
Exporter migrator.Exporter
Cache common.LoadingCache
DevMode bool
AvatarProxy avatar.Proxy
AvatarProxy *avatar.Proxy
httpServer *http.Server
mod admin
@@ -68,7 +68,7 @@ func (s *Server) Run(port int) {
router.Use(tollbooth_chi.LimitHandler(tollbooth.NewLimiter(10, nil)))
// all request by default allow anonymous access
router.Use(auth.Auth(s.SessionStore, s.AvatarProxy, s.Admins, maybeWithDevMode(auth.Anonymous)))
router.Use(auth.Auth(s.SessionStore, s.Admins, maybeWithDevMode(auth.Anonymous)))
router.Use(AppInfo("remark42", s.Version), Ping, Logger(LogAll))
router.Use(context.ClearHandler) // if you aren't using gorilla/mux, you need to wrap your handlers with context.ClearHandler
@@ -99,7 +99,7 @@ func (s *Server) Run(port int) {
rapi.Get("/config", s.configCtrl)
// protected routes, require auth
rapi.With(auth.Auth(s.SessionStore, s.AvatarProxy, s.Admins, maybeWithDevMode(auth.Full))).Group(func(rauth chi.Router) {
rapi.With(auth.Auth(s.SessionStore, s.Admins, maybeWithDevMode(auth.Full))).Group(func(rauth chi.Router) {
rauth.Post("/comment", s.createCommentCtrl)
rauth.Put("/comment/{id}", s.updateCommentCtrl)
rauth.Get("/user", s.userInfoCtrl)