move avatar proxy to login handler
This commit is contained in:
+12
-10
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user