Use authn.Cookie for SAML SSO
Signed-off-by: Émile Ré <emile@getprobo.com>
This commit is contained in:
@@ -34,8 +34,8 @@ func (c *Cookie) Set(w http.ResponseWriter, session *coredata.Session) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cookie) Clear(w http.ResponseWriter, session *coredata.Session) {
|
func (c *Cookie) Clear(w http.ResponseWriter) {
|
||||||
securecookie.Clear(w, c.sessionCookieConfig(time.Until(session.ExpiredAt)))
|
securecookie.Clear(w, c.sessionCookieConfig(-1*time.Second))
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCookie(config *securecookie.Config) *Cookie {
|
func NewCookie(config *securecookie.Config) *Cookie {
|
||||||
|
|||||||
@@ -16,14 +16,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type SAMLHandler struct {
|
type SAMLHandler struct {
|
||||||
iam *iam.Service
|
iam *iam.Service
|
||||||
cookieConfig securecookie.Config
|
sessionCookie *authn.Cookie
|
||||||
baseURL *baseurl.BaseURL
|
baseURL *baseurl.BaseURL
|
||||||
logger *log.Logger
|
logger *log.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSAMLHandler(iam *iam.Service, cookieConfig securecookie.Config, baseURL *baseurl.BaseURL, logger *log.Logger) *SAMLHandler {
|
func NewSAMLHandler(iam *iam.Service, cookieConfig securecookie.Config, baseURL *baseurl.BaseURL, logger *log.Logger) *SAMLHandler {
|
||||||
return &SAMLHandler{iam: iam, cookieConfig: cookieConfig, baseURL: baseURL, logger: logger}
|
return &SAMLHandler{
|
||||||
|
iam: iam,
|
||||||
|
sessionCookie: authn.NewCookie(&cookieConfig),
|
||||||
|
baseURL: baseURL,
|
||||||
|
logger: logger,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *SAMLHandler) renderInternalServerError(w http.ResponseWriter, r *http.Request) {
|
func (h *SAMLHandler) renderInternalServerError(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -98,11 +103,8 @@ func (h *SAMLHandler) ConsumeHandler(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := securecookie.Set(w, h.cookieConfig, rootSession.ID.String()); err != nil {
|
h.sessionCookie.Set(w, rootSession)
|
||||||
h.logger.ErrorCtx(ctx, "cannot set cookie", log.Error(err))
|
|
||||||
h.renderInternalServerError(w, r)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
redirectURL := h.baseURL.WithPath("/organizations/" + membership.OrganizationID.String()).MustString()
|
redirectURL := h.baseURL.WithPath("/organizations/" + membership.OrganizationID.String()).MustString()
|
||||||
http.Redirect(w, r, redirectURL, http.StatusFound)
|
http.Redirect(w, r, redirectURL, http.StatusFound)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ type Query {
|
|||||||
viewer: Identity @session(required: PRESENT)
|
viewer: Identity @session(required: PRESENT)
|
||||||
ssoLoginURL(email: EmailAddr!): String
|
ssoLoginURL(email: EmailAddr!): String
|
||||||
@goField(forceResolver: true)
|
@goField(forceResolver: true)
|
||||||
@session(required: NONE)
|
@session(required: OPTIONAL)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Mutation {
|
type Mutation {
|
||||||
|
|||||||
@@ -2321,7 +2321,7 @@ type Query {
|
|||||||
viewer: Identity @session(required: PRESENT)
|
viewer: Identity @session(required: PRESENT)
|
||||||
ssoLoginURL(email: EmailAddr!): String
|
ssoLoginURL(email: EmailAddr!): String
|
||||||
@goField(forceResolver: true)
|
@goField(forceResolver: true)
|
||||||
@session(required: NONE)
|
@session(required: OPTIONAL)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Mutation {
|
type Mutation {
|
||||||
@@ -9540,7 +9540,7 @@ func (ec *executionContext) _Query_ssoLoginURL(ctx context.Context, field graphq
|
|||||||
directive0 := next
|
directive0 := next
|
||||||
|
|
||||||
directive1 := func(ctx context.Context) (any, error) {
|
directive1 := func(ctx context.Context) (any, error) {
|
||||||
required, err := ec.unmarshalNSessionRequirement2goᚗproboᚗincᚋproboᚋpkgᚋserverᚋgqlutilsᚋdirectivesᚋsessionᚐSessionRequirement(ctx, "NONE")
|
required, err := ec.unmarshalNSessionRequirement2goᚗproboᚗincᚋproboᚋpkgᚋserverᚋgqlutilsᚋdirectivesᚋsessionᚐSessionRequirement(ctx, "OPTIONAL")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
var zeroVal *string
|
var zeroVal *string
|
||||||
return zeroVal, err
|
return zeroVal, err
|
||||||
|
|||||||
@@ -427,7 +427,7 @@ func (r *mutationResolver) SignOut(ctx context.Context) (*types.SignOutPayload,
|
|||||||
}
|
}
|
||||||
|
|
||||||
w := gqlutils.HTTPResponseWriterFromContext(ctx)
|
w := gqlutils.HTTPResponseWriterFromContext(ctx)
|
||||||
r.sessionCookie.Clear(w, session)
|
r.sessionCookie.Clear(w)
|
||||||
|
|
||||||
return &types.SignOutPayload{Success: true}, nil
|
return &types.SignOutPayload{Success: true}, nil
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user