-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathlogin_server.go
More file actions
92 lines (81 loc) · 2.6 KB
/
login_server.go
File metadata and controls
92 lines (81 loc) · 2.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package login
import (
"fmt"
"github.com/SwissDataScienceCenter/renku-gateway/internal/config"
"github.com/SwissDataScienceCenter/renku-gateway/internal/models"
"github.com/SwissDataScienceCenter/renku-gateway/internal/oidc"
"github.com/SwissDataScienceCenter/renku-gateway/internal/sessions"
"github.com/labstack/echo/v4"
)
type LoginServer struct {
config *config.LoginConfig
providerStore oidc.ClientStore
sessions *sessions.SessionStore
tokenStore models.TokenStoreInterface
metricsClient models.MetricsClientInterface
}
func (l *LoginServer) RegisterHandlers(server *echo.Echo, commonMiddlewares ...echo.MiddlewareFunc) {
e := server.Group(l.config.LoginRoutesBasePath)
e.Use(commonMiddlewares...)
wrapper := ServerInterfaceWrapper{Handler: l}
e.GET("/login", wrapper.GetLogin, NoCaching)
e.GET("/callback", wrapper.GetCallback, NoCaching)
e.GET("/logout", wrapper.GetLogout, NoCaching)
e.GET("/user-profile", wrapper.GetUserProfile)
e.GET("/gitlab/exchange", l.GetGitLabToken, NoCaching)
e.GET("/gitlab/logout", l.GetGitLabLogout)
}
type LoginServerOption func(*LoginServer) error
func WithConfig(loginConfig config.LoginConfig) LoginServerOption {
return func(l *LoginServer) error {
l.config = &loginConfig
providerStore, err := oidc.NewClientStore(loginConfig.Providers)
if err != nil {
return err
}
l.providerStore = providerStore
return nil
}
}
func WithSessionStore(sessions *sessions.SessionStore) LoginServerOption {
return func(l *LoginServer) error {
l.sessions = sessions
return nil
}
}
func WithTokenStore(store models.TokenStoreInterface) LoginServerOption {
return func(l *LoginServer) error {
l.tokenStore = store
return nil
}
}
func WithMetricsClient(client models.MetricsClientInterface) LoginServerOption {
return func(l *LoginServer) error {
l.metricsClient = client
return nil
}
}
// NewLoginServer creates a new LoginServer that handles the callbacks from oauth2
// and initiates the login flow for users.
func NewLoginServer(options ...LoginServerOption) (*LoginServer, error) {
server := LoginServer{}
for _, opt := range options {
err := opt(&server)
if err != nil {
return &LoginServer{}, err
}
}
if server.config == nil {
return &LoginServer{}, fmt.Errorf("login server config not provided")
}
if server.providerStore == nil {
return &LoginServer{}, fmt.Errorf("OIDC providers not initialized")
}
if server.sessions == nil {
return &LoginServer{}, fmt.Errorf("session store not initialized")
}
if server.tokenStore == nil {
return &LoginServer{}, fmt.Errorf("token store is not initialized")
}
return &server, nil
}