Skip to content

Commit

Permalink
wip: auth complete and logout
Browse files Browse the repository at this point in the history
  • Loading branch information
katallaxie committed Jan 28, 2024
1 parent dc368cb commit 615d7ce
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 13 deletions.
12 changes: 3 additions & 9 deletions examples/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,21 +234,15 @@ func main() {
}

app.Get("/login/:provider", fiber_goth.NewBeginAuthHandler())

app.Get("/auth/:provider/callback/", func(c *fiber.Ctx) error {
return nil
})

app.Get("/logout/", func(c *fiber.Ctx) error {
return nil
})
app.Get("/auth/:provider/callback/", fiber_goth.NewCompleteAuthHandler())
app.Get("/logout", fiber_goth.NewLogoutHandler())

app.Get("/", func(c *fiber.Ctx) error {
c.Set(fiber.HeaderContentType, fiber.MIMETextHTML)
return t.Execute(c.Response().BodyWriter(), providerIndex)
})

if err := app.Listen(":3000"); err != nil {
if err := app.Listen("0.0.0.0:3000"); err != nil {
log.Fatal(err)
}
}
Expand Down
139 changes: 135 additions & 4 deletions goth.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,18 @@ const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

var seededRand *rand.Rand = rand.New(rand.NewSource(time.Now().UnixNano()))

// Params ...
type Params struct {
ctx *fiber.Ctx
}

// Get ...
func (p *Params) Get(key string) string {
return p.ctx.Query(key)
}

var _ goth.Params = (*Params)(nil)

// The contextKey type is unexported to prevent collisions with context keys defined in
// other packages.
type contextKey int
Expand All @@ -48,6 +60,7 @@ const (
type SessionStore interface {
Get(c *fiber.Ctx, key string) (string, error)
Update(c *fiber.Ctx, key, value string) error
Destroy(c *fiber.Ctx) error
}

var _ SessionStore = (*sessionStore)(nil)
Expand Down Expand Up @@ -89,6 +102,21 @@ func (s *sessionStore) Get(c *fiber.Ctx, key string) (string, error) {
return string(v), nil
}

// Destroy ...
func (s *sessionStore) Destroy(c *fiber.Ctx) error {
session, err := s.store.Get(c)
if err != nil {
return err
}

err = session.Destroy()
if err != nil {
return err
}

return nil
}

// Update updates session data.
func (s *sessionStore) Update(c *fiber.Ctx, key, value string) error {
session, err := s.store.Get(c)
Expand Down Expand Up @@ -125,7 +153,7 @@ func (s *sessionStore) Update(c *fiber.Ctx, key, value string) error {
func ProviderFromContext(c *fiber.Ctx) {
}

// BeginAuthHandler
// BeginAuthHandler ...
type BeginAuthHandler struct{}

// New creates a new handler to begin authentication.
Expand Down Expand Up @@ -156,6 +184,93 @@ func NewBeginAuthHandler(config ...Config) fiber.Handler {
return cfg.BeginAuthHandler.New(cfg)
}

// CompleteAuthComplete ...
type CompleteAuthCompleteHandler struct{}

// New creates a new handler to complete authentication.
func (CompleteAuthCompleteHandler) New(cfg Config) fiber.Handler {
return func(c *fiber.Ctx) error {
if cfg.Next != nil && cfg.Next(c) {
return c.Next()
}

p := c.Params(provider)
if p == "" {
return ErrMissingProviderName
}

provider, err := goth.GetProvider(p)
if err != nil {
return err
}

v, err := cfg.Session.Get(c, p)
if err != nil {
return err
}

sess, err := provider.UnmarshalSession(v)
if err != nil {
return err
}

user, err := provider.FetchUser(sess)
if err == nil {
return c.SendString(user.Email)
}

_, err = sess.Authorize(provider, &Params{ctx: c})
if err != nil {
return err
}

err = cfg.Session.Update(c, p, sess.Marshal())
if err != nil {
return err
}

user, err = provider.FetchUser(sess)
if err != nil {
return err
}

return c.SendString(user.Email)
}
}

// NewBeginCompleteAuthHandler creates a new middleware handler to complete authentication.
func NewCompleteAuthHandler(config ...Config) fiber.Handler {
cfg := configDefault(config...)

return cfg.CompleteAuthHandler.New(cfg)
}

// LogoutHandler ...
type LogoutHandler struct{}

// NewLogoutHandler ...
func NewLogoutHandler(config ...Config) fiber.Handler {
cfg := configDefault(config...)

return cfg.LogoutHandler.New(cfg)
}

// New creates a new handler to logout.
func (LogoutHandler) New(cfg Config) fiber.Handler {
return func(c *fiber.Ctx) error {
if cfg.Next != nil && cfg.Next(c) {
return c.Next()
}

err := cfg.Session.Destroy(c)
if err != nil {
return cfg.ErrorHandler(c, err)
}

return nil
}
}

// GetAuthURLFromContext returns the provider specific authentication URL.
func GetAuthURLFromContext(c *fiber.Ctx, session SessionStore) (string, error) {
p := c.Params(provider)
Expand Down Expand Up @@ -199,6 +314,12 @@ type Config struct {
// BeginAuthHandler ...
BeginAuthHandler GothHandler

// CompleteAuthHandler ...
CompleteAuthHandler GothHandler

// LogoutHandler ...
LogoutHandler GothHandler

// Session ...
Session SessionStore

Expand All @@ -210,9 +331,11 @@ type Config struct {

// ConfigDefault is the default config.
var ConfigDefault = Config{
ErrorHandler: defaultErrorHandler,
BeginAuthHandler: BeginAuthHandler{},
Session: NewSessionStore(session.New(defaultSessionConfig)),
ErrorHandler: defaultErrorHandler,
BeginAuthHandler: BeginAuthHandler{},
CompleteAuthHandler: CompleteAuthCompleteHandler{},
LogoutHandler: LogoutHandler{},
Session: NewSessionStore(session.New(defaultSessionConfig)),
}

// default ErrorHandler that process return error from fiber.Handler
Expand Down Expand Up @@ -246,6 +369,14 @@ func configDefault(config ...Config) Config {
cfg.BeginAuthHandler = ConfigDefault.BeginAuthHandler
}

if cfg.CompleteAuthHandler == nil {
cfg.CompleteAuthHandler = ConfigDefault.CompleteAuthHandler
}

if cfg.LogoutHandler == nil {
cfg.LogoutHandler = ConfigDefault.LogoutHandler
}

return cfg
}

Expand Down

0 comments on commit 615d7ce

Please sign in to comment.