github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/clib/auth.go (about) 1 // Package clib - Content managed by Project Forge, see [projectforge.md] for details. 2 package clib 3 4 import ( 5 "fmt" 6 "net/http" 7 8 "github.com/pkg/errors" 9 10 "github.com/kyleu/dbaudit/app" 11 "github.com/kyleu/dbaudit/app/controller" 12 "github.com/kyleu/dbaudit/app/controller/cutil" 13 "github.com/kyleu/dbaudit/app/lib/auth" 14 "github.com/kyleu/dbaudit/app/util" 15 ) 16 17 const signinMsg = "signed in using %s as [%s]" 18 19 func AuthDetail(w http.ResponseWriter, r *http.Request) { 20 controller.Act("auth.detail", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 21 prv, err := getProvider(as, r, ps.Logger) 22 if err != nil { 23 return "", err 24 } 25 u, _, err := auth.CompleteUserAuth(prv, w, r, ps.Session, ps.Logger) 26 if err == nil { 27 msg := fmt.Sprintf(signinMsg, auth.AvailableProviderNames[prv.ID], u.Email) 28 return controller.ReturnToReferrer(msg, cutil.DefaultProfilePath, w, ps) 29 } 30 return auth.BeginAuthHandler(prv, w, r, ps.Session, ps.Logger) 31 }) 32 } 33 34 func AuthCallback(w http.ResponseWriter, r *http.Request) { 35 controller.Act("auth.callback", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 36 prv, err := getProvider(as, r, ps.Logger) 37 if err != nil { 38 return "", err 39 } 40 u, _, err := auth.CompleteUserAuth(prv, w, r, ps.Session, ps.Logger) 41 if err != nil { 42 return "", err 43 } 44 msg := fmt.Sprintf(signinMsg, auth.AvailableProviderNames[prv.ID], u.Email) 45 return controller.ReturnToReferrer(msg, cutil.DefaultProfilePath, w, ps) 46 }) 47 } 48 49 func AuthLogout(w http.ResponseWriter, r *http.Request) { 50 controller.Act("auth.logout", w, r, func(as *app.State, ps *cutil.PageState) (string, error) { 51 key, err := cutil.RCRequiredString(r, "key", false) 52 if err != nil { 53 return "", err 54 } 55 err = auth.Logout(w, r, ps.Session, ps.Logger, key) 56 if err != nil { 57 return "", err 58 } 59 60 return ps.ProfilePath, nil 61 }) 62 } 63 64 func getProvider(as *app.State, r *http.Request, logger util.Logger) (*auth.Provider, error) { 65 key, err := cutil.RCRequiredString(r, "key", false) 66 if err != nil { 67 return nil, err 68 } 69 prvs, err := as.Auth.Providers(logger) 70 if err != nil { 71 return nil, errors.Wrap(err, "can't load providers") 72 } 73 prv := prvs.Get(key) 74 if prv == nil { 75 return nil, errors.Errorf("no provider available with id [%s]", key) 76 } 77 return prv, nil 78 }