mirror of
https://github.com/gravitational/teleport.git
synced 2026-11-02 23:31:08 +08:00
This starts separating the lib/auth client and server code into distinct packages to reduce the dependency tree of client tools. For the time being aliases were left to all things moved into lib/auth/authclient to reduce the changeset and ensure code still compiles. Future changes will be built off this to convert code to use lib/auth/authclient where applicable, this was intentionally left to a minimum amount of changes to facilitate backports.
159 lines
5.4 KiB
Go
159 lines
5.4 KiB
Go
/*
|
|
* Teleport
|
|
* Copyright (C) 2023 Gravitational, Inc.
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
package auth
|
|
|
|
import (
|
|
"context"
|
|
"net/url"
|
|
|
|
"github.com/gravitational/trace"
|
|
|
|
"github.com/gravitational/teleport/api/types"
|
|
apievents "github.com/gravitational/teleport/api/types/events"
|
|
"github.com/gravitational/teleport/lib/auth/authclient"
|
|
"github.com/gravitational/teleport/lib/authz"
|
|
"github.com/gravitational/teleport/lib/events"
|
|
)
|
|
|
|
type OIDCService interface {
|
|
CreateOIDCAuthRequest(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error)
|
|
ValidateOIDCAuthCallback(ctx context.Context, q url.Values) (*OIDCAuthResponse, error)
|
|
}
|
|
|
|
var errOIDCNotImplemented = &trace.AccessDeniedError{Message: "OIDC is only available in enterprise subscriptions"}
|
|
|
|
// UpsertOIDCConnector creates or updates an OIDC connector.
|
|
func (a *Server) UpsertOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) {
|
|
upserted, err := a.Services.UpsertOIDCConnector(ctx, connector)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
if err := a.emitter.EmitAuditEvent(ctx, &apievents.OIDCConnectorCreate{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.OIDCConnectorCreatedEvent,
|
|
Code: events.OIDCConnectorCreatedCode,
|
|
},
|
|
UserMetadata: authz.ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: connector.GetName(),
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warn("Failed to emit OIDC connector create event.")
|
|
}
|
|
|
|
return upserted, nil
|
|
}
|
|
|
|
// UpdateOIDCConnector updates an existing OIDC connector.
|
|
func (a *Server) UpdateOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) {
|
|
updated, err := a.Services.UpdateOIDCConnector(ctx, connector)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
if err := a.emitter.EmitAuditEvent(ctx, &apievents.OIDCConnectorUpdate{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.OIDCConnectorUpdatedEvent,
|
|
Code: events.OIDCConnectorUpdatedCode,
|
|
},
|
|
UserMetadata: authz.ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: connector.GetName(),
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warn("Failed to emit OIDC connector update event.")
|
|
}
|
|
|
|
return updated, nil
|
|
}
|
|
|
|
// CreateOIDCConnector creates a new OIDC connector.
|
|
func (a *Server) CreateOIDCConnector(ctx context.Context, connector types.OIDCConnector) (types.OIDCConnector, error) {
|
|
created, err := a.Services.CreateOIDCConnector(ctx, connector)
|
|
if err != nil {
|
|
return nil, trace.Wrap(err)
|
|
}
|
|
if err := a.emitter.EmitAuditEvent(ctx, &apievents.OIDCConnectorCreate{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.OIDCConnectorCreatedEvent,
|
|
Code: events.OIDCConnectorCreatedCode,
|
|
},
|
|
UserMetadata: authz.ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: connector.GetName(),
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warn("Failed to emit OIDC connector create event.")
|
|
}
|
|
|
|
return created, nil
|
|
}
|
|
|
|
// DeleteOIDCConnector deletes an OIDC connector by name.
|
|
func (a *Server) DeleteOIDCConnector(ctx context.Context, connectorName string) error {
|
|
if err := a.Services.DeleteOIDCConnector(ctx, connectorName); err != nil {
|
|
return trace.Wrap(err)
|
|
}
|
|
if err := a.emitter.EmitAuditEvent(ctx, &apievents.OIDCConnectorDelete{
|
|
Metadata: apievents.Metadata{
|
|
Type: events.OIDCConnectorDeletedEvent,
|
|
Code: events.OIDCConnectorDeletedCode,
|
|
},
|
|
UserMetadata: authz.ClientUserMetadata(ctx),
|
|
ResourceMetadata: apievents.ResourceMetadata{
|
|
Name: connectorName,
|
|
},
|
|
}); err != nil {
|
|
log.WithError(err).Warn("Failed to emit OIDC connector delete event.")
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (a *Server) CreateOIDCAuthRequest(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) {
|
|
if a.oidcAuthService == nil {
|
|
return nil, errOIDCNotImplemented
|
|
}
|
|
|
|
rq, err := a.oidcAuthService.CreateOIDCAuthRequest(ctx, req)
|
|
return rq, trace.Wrap(err)
|
|
}
|
|
|
|
func (a *Server) ValidateOIDCAuthCallback(ctx context.Context, q url.Values) (*OIDCAuthResponse, error) {
|
|
if a.oidcAuthService == nil {
|
|
return nil, errOIDCNotImplemented
|
|
}
|
|
|
|
resp, err := a.oidcAuthService.ValidateOIDCAuthCallback(ctx, q)
|
|
return resp, trace.Wrap(err)
|
|
}
|
|
|
|
// OIDCAuthResponse is returned when auth server validated callback parameters
|
|
// returned from OIDC provider
|
|
type OIDCAuthResponse = authclient.OIDCAuthResponse
|
|
|
|
// OIDCAuthRequest is an OIDC auth request that supports standard json marshaling.
|
|
type OIDCAuthRequest = authclient.OIDCAuthRequest
|
|
|
|
// ValidateOIDCAuthCallbackReq is the request made by the proxy to validate
|
|
// and activate a login via OIDC.
|
|
type ValidateOIDCAuthCallbackReq = authclient.ValidateOIDCAuthCallbackReq
|
|
|
|
// OIDCAuthRawResponse is returned when auth server validated callback parameters
|
|
// returned from OIDC provider
|
|
type OIDCAuthRawResponse = authclient.OIDCAuthRawResponse
|