mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-30 22:26:42 +00:00
Compare commits
4 Commits
v0.67.2
...
fix/gettin
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e32ad68f98 | ||
|
|
9d1a37c644 | ||
|
|
5bf2372c4d | ||
|
|
c2c6396a04 |
@@ -221,6 +221,7 @@ func (a *Auth) getPKCEFlow(client *mgm.GrpcClient) (*PKCEAuthorizationFlow, erro
|
|||||||
config := &PKCEAuthProviderConfig{
|
config := &PKCEAuthProviderConfig{
|
||||||
Audience: protoConfig.GetAudience(),
|
Audience: protoConfig.GetAudience(),
|
||||||
ClientID: protoConfig.GetClientID(),
|
ClientID: protoConfig.GetClientID(),
|
||||||
|
ClientSecret: protoConfig.GetClientSecret(), //nolint:staticcheck
|
||||||
TokenEndpoint: protoConfig.GetTokenEndpoint(),
|
TokenEndpoint: protoConfig.GetTokenEndpoint(),
|
||||||
AuthorizationEndpoint: protoConfig.GetAuthorizationEndpoint(),
|
AuthorizationEndpoint: protoConfig.GetAuthorizationEndpoint(),
|
||||||
Scope: protoConfig.GetScope(),
|
Scope: protoConfig.GetScope(),
|
||||||
@@ -265,6 +266,7 @@ func (a *Auth) getDeviceFlow(client *mgm.GrpcClient) (*DeviceAuthorizationFlow,
|
|||||||
config := &DeviceAuthProviderConfig{
|
config := &DeviceAuthProviderConfig{
|
||||||
Audience: protoConfig.GetAudience(),
|
Audience: protoConfig.GetAudience(),
|
||||||
ClientID: protoConfig.GetClientID(),
|
ClientID: protoConfig.GetClientID(),
|
||||||
|
ClientSecret: protoConfig.GetClientSecret(), //nolint:staticcheck
|
||||||
Domain: protoConfig.Domain,
|
Domain: protoConfig.Domain,
|
||||||
TokenEndpoint: protoConfig.GetTokenEndpoint(),
|
TokenEndpoint: protoConfig.GetTokenEndpoint(),
|
||||||
DeviceAuthEndpoint: protoConfig.GetDeviceAuthEndpoint(),
|
DeviceAuthEndpoint: protoConfig.GetDeviceAuthEndpoint(),
|
||||||
|
|||||||
@@ -29,6 +29,8 @@ var _ OAuthFlow = &DeviceAuthorizationFlow{}
|
|||||||
type DeviceAuthProviderConfig struct {
|
type DeviceAuthProviderConfig struct {
|
||||||
// ClientID An IDP application client id
|
// ClientID An IDP application client id
|
||||||
ClientID string
|
ClientID string
|
||||||
|
// ClientSecret An IDP application client secret
|
||||||
|
ClientSecret string
|
||||||
// Domain An IDP API domain
|
// Domain An IDP API domain
|
||||||
// Deprecated. Use OIDCConfigEndpoint instead
|
// Deprecated. Use OIDCConfigEndpoint instead
|
||||||
Domain string
|
Domain string
|
||||||
|
|||||||
@@ -38,6 +38,8 @@ const (
|
|||||||
type PKCEAuthProviderConfig struct {
|
type PKCEAuthProviderConfig struct {
|
||||||
// ClientID An IDP application client id
|
// ClientID An IDP application client id
|
||||||
ClientID string
|
ClientID string
|
||||||
|
// ClientSecret An IDP application client secret
|
||||||
|
ClientSecret string
|
||||||
// Audience An Audience for to authorization validation
|
// Audience An Audience for to authorization validation
|
||||||
Audience string
|
Audience string
|
||||||
// TokenEndpoint is the endpoint of an IDP manager where clients can obtain access token
|
// TokenEndpoint is the endpoint of an IDP manager where clients can obtain access token
|
||||||
@@ -110,6 +112,7 @@ func NewPKCEAuthorizationFlow(config PKCEAuthProviderConfig) (*PKCEAuthorization
|
|||||||
|
|
||||||
cfg := &oauth2.Config{
|
cfg := &oauth2.Config{
|
||||||
ClientID: config.ClientID,
|
ClientID: config.ClientID,
|
||||||
|
ClientSecret: config.ClientSecret,
|
||||||
Endpoint: oauth2.Endpoint{
|
Endpoint: oauth2.Endpoint{
|
||||||
AuthURL: config.AuthorizationEndpoint,
|
AuthURL: config.AuthorizationEndpoint,
|
||||||
TokenURL: config.TokenEndpoint,
|
TokenURL: config.TokenEndpoint,
|
||||||
|
|||||||
@@ -532,13 +532,14 @@ render_docker_compose_traefik_builtin() {
|
|||||||
traefik_dynamic_volume=" - ./traefik-dynamic.yaml:/etc/traefik/dynamic.yaml:ro"
|
traefik_dynamic_volume=" - ./traefik-dynamic.yaml:/etc/traefik/dynamic.yaml:ro"
|
||||||
proxy_service="
|
proxy_service="
|
||||||
# NetBird Proxy - exposes internal resources to the internet
|
# NetBird Proxy - exposes internal resources to the internet
|
||||||
|
# Uses host network so it can listen on arbitrary ports for TCP/UDP services
|
||||||
proxy:
|
proxy:
|
||||||
image: $NETBIRD_PROXY_IMAGE
|
image: $NETBIRD_PROXY_IMAGE
|
||||||
container_name: netbird-proxy
|
container_name: netbird-proxy
|
||||||
ports:
|
ports:
|
||||||
- 51820:51820/udp
|
- 51820:51820/udp
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks: [netbird]
|
network_mode: host
|
||||||
depends_on:
|
depends_on:
|
||||||
- netbird-server
|
- netbird-server
|
||||||
env_file:
|
env_file:
|
||||||
@@ -646,6 +647,7 @@ $traefik_dynamic_volume
|
|||||||
networks: [netbird]
|
networks: [netbird]
|
||||||
ports:
|
ports:
|
||||||
- '$NETBIRD_STUN_PORT:$NETBIRD_STUN_PORT/udp'
|
- '$NETBIRD_STUN_PORT:$NETBIRD_STUN_PORT/udp'
|
||||||
|
$(if [[ "$ENABLE_PROXY" == "true" ]]; then echo " - '$MANAGEMENT_HOST_PORT:80'"; fi)
|
||||||
volumes:
|
volumes:
|
||||||
- netbird_data:/var/lib/netbird
|
- netbird_data:/var/lib/netbird
|
||||||
- ./config.yaml:/etc/netbird/config.yaml
|
- ./config.yaml:/etc/netbird/config.yaml
|
||||||
@@ -766,8 +768,8 @@ render_proxy_env() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
# NetBird Proxy Configuration
|
# NetBird Proxy Configuration
|
||||||
NB_PROXY_DEBUG_LOGS=false
|
NB_PROXY_DEBUG_LOGS=false
|
||||||
# Use internal Docker network to connect to management (avoids hairpin NAT issues)
|
# Proxy runs in host network mode for L4 port binding, connect to management via localhost
|
||||||
NB_PROXY_MANAGEMENT_ADDRESS=http://netbird-server:80
|
NB_PROXY_MANAGEMENT_ADDRESS=http://localhost:$MANAGEMENT_HOST_PORT
|
||||||
# Allow insecure gRPC connection to management (required for internal Docker network)
|
# Allow insecure gRPC connection to management (required for internal Docker network)
|
||||||
NB_PROXY_ALLOW_INSECURE=true
|
NB_PROXY_ALLOW_INSECURE=true
|
||||||
# Public URL where this proxy is reachable (used for cluster registration)
|
# Public URL where this proxy is reachable (used for cluster registration)
|
||||||
|
|||||||
@@ -288,6 +288,8 @@ func (m *Manager) validateSubdomainRequirement(ctx context.Context, domain, clus
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) persistNewService(ctx context.Context, accountID string, svc *service.Service) error {
|
func (m *Manager) persistNewService(ctx context.Context, accountID string, svc *service.Service) error {
|
||||||
|
customPorts := m.clusterCustomPorts(ctx, svc)
|
||||||
|
|
||||||
return m.store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
return m.store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
||||||
if svc.Domain != "" {
|
if svc.Domain != "" {
|
||||||
if err := m.checkDomainAvailable(ctx, transaction, svc.Domain, ""); err != nil {
|
if err := m.checkDomainAvailable(ctx, transaction, svc.Domain, ""); err != nil {
|
||||||
@@ -295,7 +297,7 @@ func (m *Manager) persistNewService(ctx context.Context, accountID string, svc *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := m.ensureL4Port(ctx, transaction, svc); err != nil {
|
if err := m.ensureL4Port(ctx, transaction, svc, customPorts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,12 +317,23 @@ func (m *Manager) persistNewService(ctx context.Context, accountID string, svc *
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// ensureL4Port auto-assigns a listen port when needed and validates cluster support.
|
// clusterCustomPorts queries whether the cluster supports custom ports.
|
||||||
func (m *Manager) ensureL4Port(ctx context.Context, tx store.Store, svc *service.Service) error {
|
// Must be called before entering a transaction: the underlying query uses
|
||||||
|
// the main DB handle, which deadlocks when called inside a transaction
|
||||||
|
// that already holds the connection.
|
||||||
|
func (m *Manager) clusterCustomPorts(ctx context.Context, svc *service.Service) *bool {
|
||||||
|
if !service.IsL4Protocol(svc.Mode) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return m.capabilities.ClusterSupportsCustomPorts(ctx, svc.ProxyCluster)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensureL4Port auto-assigns a listen port when needed and validates cluster support.
|
||||||
|
// customPorts must be pre-computed via clusterCustomPorts before entering a transaction.
|
||||||
|
func (m *Manager) ensureL4Port(ctx context.Context, tx store.Store, svc *service.Service, customPorts *bool) error {
|
||||||
if !service.IsL4Protocol(svc.Mode) {
|
if !service.IsL4Protocol(svc.Mode) {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
customPorts := m.capabilities.ClusterSupportsCustomPorts(ctx, svc.ProxyCluster)
|
|
||||||
if service.IsPortBasedProtocol(svc.Mode) && svc.ListenPort > 0 && (customPorts == nil || !*customPorts) {
|
if service.IsPortBasedProtocol(svc.Mode) && svc.ListenPort > 0 && (customPorts == nil || !*customPorts) {
|
||||||
if svc.Source != service.SourceEphemeral {
|
if svc.Source != service.SourceEphemeral {
|
||||||
return status.Errorf(status.InvalidArgument, "custom ports not supported on cluster %s", svc.ProxyCluster)
|
return status.Errorf(status.InvalidArgument, "custom ports not supported on cluster %s", svc.ProxyCluster)
|
||||||
@@ -404,12 +417,14 @@ func (m *Manager) assignPort(ctx context.Context, tx store.Store, cluster string
|
|||||||
// The count and exists queries use FOR UPDATE locking to serialize concurrent creates
|
// The count and exists queries use FOR UPDATE locking to serialize concurrent creates
|
||||||
// for the same peer, preventing the per-peer limit from being bypassed.
|
// for the same peer, preventing the per-peer limit from being bypassed.
|
||||||
func (m *Manager) persistNewEphemeralService(ctx context.Context, accountID, peerID string, svc *service.Service) error {
|
func (m *Manager) persistNewEphemeralService(ctx context.Context, accountID, peerID string, svc *service.Service) error {
|
||||||
|
customPorts := m.clusterCustomPorts(ctx, svc)
|
||||||
|
|
||||||
return m.store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
return m.store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
||||||
if err := m.validateEphemeralPreconditions(ctx, transaction, accountID, peerID, svc); err != nil {
|
if err := m.validateEphemeralPreconditions(ctx, transaction, accountID, peerID, svc); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := m.ensureL4Port(ctx, transaction, svc); err != nil {
|
if err := m.ensureL4Port(ctx, transaction, svc, customPorts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -512,16 +527,49 @@ type serviceUpdateInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) persistServiceUpdate(ctx context.Context, accountID string, service *service.Service) (*serviceUpdateInfo, error) {
|
func (m *Manager) persistServiceUpdate(ctx context.Context, accountID string, service *service.Service) (*serviceUpdateInfo, error) {
|
||||||
|
effectiveCluster, err := m.resolveEffectiveCluster(ctx, accountID, service)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
svcForCaps := *service
|
||||||
|
svcForCaps.ProxyCluster = effectiveCluster
|
||||||
|
customPorts := m.clusterCustomPorts(ctx, &svcForCaps)
|
||||||
|
|
||||||
var updateInfo serviceUpdateInfo
|
var updateInfo serviceUpdateInfo
|
||||||
|
|
||||||
err := m.store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
err = m.store.ExecuteInTransaction(ctx, func(transaction store.Store) error {
|
||||||
return m.executeServiceUpdate(ctx, transaction, accountID, service, &updateInfo)
|
return m.executeServiceUpdate(ctx, transaction, accountID, service, &updateInfo, customPorts)
|
||||||
})
|
})
|
||||||
|
|
||||||
return &updateInfo, err
|
return &updateInfo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Manager) executeServiceUpdate(ctx context.Context, transaction store.Store, accountID string, service *service.Service, updateInfo *serviceUpdateInfo) error {
|
// resolveEffectiveCluster determines the cluster that will be used after the update.
|
||||||
|
// It reads the existing service without locking and derives the new cluster if the domain changed.
|
||||||
|
func (m *Manager) resolveEffectiveCluster(ctx context.Context, accountID string, svc *service.Service) (string, error) {
|
||||||
|
existing, err := m.store.GetServiceByID(ctx, store.LockingStrengthNone, accountID, svc.ID)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
if existing.Domain == svc.Domain {
|
||||||
|
return existing.ProxyCluster, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.clusterDeriver != nil {
|
||||||
|
derived, err := m.clusterDeriver.DeriveClusterFromDomain(ctx, accountID, svc.Domain)
|
||||||
|
if err != nil {
|
||||||
|
log.WithError(err).Warnf("could not derive cluster from domain %s", svc.Domain)
|
||||||
|
} else {
|
||||||
|
return derived, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return existing.ProxyCluster, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Manager) executeServiceUpdate(ctx context.Context, transaction store.Store, accountID string, service *service.Service, updateInfo *serviceUpdateInfo, customPorts *bool) error {
|
||||||
existingService, err := transaction.GetServiceByID(ctx, store.LockingStrengthUpdate, accountID, service.ID)
|
existingService, err := transaction.GetServiceByID(ctx, store.LockingStrengthUpdate, accountID, service.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -558,7 +606,7 @@ func (m *Manager) executeServiceUpdate(ctx context.Context, transaction store.St
|
|||||||
m.preserveListenPort(service, existingService)
|
m.preserveListenPort(service, existingService)
|
||||||
updateInfo.serviceEnabledChanged = existingService.Enabled != service.Enabled
|
updateInfo.serviceEnabledChanged = existingService.Enabled != service.Enabled
|
||||||
|
|
||||||
if err := m.ensureL4Port(ctx, transaction, service); err != nil {
|
if err := m.ensureL4Port(ctx, transaction, service, customPorts); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := m.checkPortConflict(ctx, transaction, service); err != nil {
|
if err := m.checkPortConflict(ctx, transaction, service); err != nil {
|
||||||
|
|||||||
@@ -787,6 +787,11 @@ func (s *Service) validateHTTPTargets() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Service) validateL4Target(target *Target) error {
|
func (s *Service) validateL4Target(target *Target) error {
|
||||||
|
// L4 services have a single target; per-target disable is meaningless
|
||||||
|
// (use the service-level Enabled flag instead). Force it on so that
|
||||||
|
// buildPathMappings always includes the target in the proto.
|
||||||
|
target.Enabled = true
|
||||||
|
|
||||||
if target.Port == 0 {
|
if target.Port == 0 {
|
||||||
return errors.New("target port is required for L4 services")
|
return errors.New("target port is required for L4 services")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -966,6 +966,7 @@ func (s *Server) GetDeviceAuthorizationFlow(ctx context.Context, req *proto.Encr
|
|||||||
Provider: proto.DeviceAuthorizationFlowProvider(provider),
|
Provider: proto.DeviceAuthorizationFlowProvider(provider),
|
||||||
ProviderConfig: &proto.ProviderConfig{
|
ProviderConfig: &proto.ProviderConfig{
|
||||||
ClientID: s.config.DeviceAuthorizationFlow.ProviderConfig.ClientID,
|
ClientID: s.config.DeviceAuthorizationFlow.ProviderConfig.ClientID,
|
||||||
|
ClientSecret: s.config.DeviceAuthorizationFlow.ProviderConfig.ClientSecret,
|
||||||
Domain: s.config.DeviceAuthorizationFlow.ProviderConfig.Domain,
|
Domain: s.config.DeviceAuthorizationFlow.ProviderConfig.Domain,
|
||||||
Audience: s.config.DeviceAuthorizationFlow.ProviderConfig.Audience,
|
Audience: s.config.DeviceAuthorizationFlow.ProviderConfig.Audience,
|
||||||
DeviceAuthEndpoint: s.config.DeviceAuthorizationFlow.ProviderConfig.DeviceAuthEndpoint,
|
DeviceAuthEndpoint: s.config.DeviceAuthorizationFlow.ProviderConfig.DeviceAuthEndpoint,
|
||||||
@@ -1036,6 +1037,7 @@ func (s *Server) GetPKCEAuthorizationFlow(ctx context.Context, req *proto.Encryp
|
|||||||
ProviderConfig: &proto.ProviderConfig{
|
ProviderConfig: &proto.ProviderConfig{
|
||||||
Audience: s.config.PKCEAuthorizationFlow.ProviderConfig.Audience,
|
Audience: s.config.PKCEAuthorizationFlow.ProviderConfig.Audience,
|
||||||
ClientID: s.config.PKCEAuthorizationFlow.ProviderConfig.ClientID,
|
ClientID: s.config.PKCEAuthorizationFlow.ProviderConfig.ClientID,
|
||||||
|
ClientSecret: s.config.PKCEAuthorizationFlow.ProviderConfig.ClientSecret,
|
||||||
TokenEndpoint: s.config.PKCEAuthorizationFlow.ProviderConfig.TokenEndpoint,
|
TokenEndpoint: s.config.PKCEAuthorizationFlow.ProviderConfig.TokenEndpoint,
|
||||||
AuthorizationEndpoint: s.config.PKCEAuthorizationFlow.ProviderConfig.AuthorizationEndpoint,
|
AuthorizationEndpoint: s.config.PKCEAuthorizationFlow.ProviderConfig.AuthorizationEndpoint,
|
||||||
Scope: s.config.PKCEAuthorizationFlow.ProviderConfig.Scope,
|
Scope: s.config.PKCEAuthorizationFlow.ProviderConfig.Scope,
|
||||||
|
|||||||
@@ -780,9 +780,15 @@ func (am *DefaultAccountManager) processUserUpdate(ctx context.Context, transact
|
|||||||
updatedUser.Role = update.Role
|
updatedUser.Role = update.Role
|
||||||
updatedUser.Blocked = update.Blocked
|
updatedUser.Blocked = update.Blocked
|
||||||
updatedUser.AutoGroups = update.AutoGroups
|
updatedUser.AutoGroups = update.AutoGroups
|
||||||
// these two fields can't be set via API, only via direct call to the method
|
// these fields can't be set via API, only via direct call to the method
|
||||||
updatedUser.Issued = update.Issued
|
updatedUser.Issued = update.Issued
|
||||||
updatedUser.IntegrationReference = update.IntegrationReference
|
updatedUser.IntegrationReference = update.IntegrationReference
|
||||||
|
if update.Name != "" {
|
||||||
|
updatedUser.Name = update.Name
|
||||||
|
}
|
||||||
|
if update.Email != "" {
|
||||||
|
updatedUser.Email = update.Email
|
||||||
|
}
|
||||||
|
|
||||||
var transferredOwnerRole bool
|
var transferredOwnerRole bool
|
||||||
result, err := handleOwnerRoleTransfer(ctx, transaction, initiatorUser, update)
|
result, err := handleOwnerRoleTransfer(ctx, transaction, initiatorUser, update)
|
||||||
|
|||||||
@@ -546,6 +546,7 @@ func Test_GetPKCEAuthorizationFlow(t *testing.T) {
|
|||||||
expectedFlowInfo := &mgmtProto.PKCEAuthorizationFlow{
|
expectedFlowInfo := &mgmtProto.PKCEAuthorizationFlow{
|
||||||
ProviderConfig: &mgmtProto.ProviderConfig{
|
ProviderConfig: &mgmtProto.ProviderConfig{
|
||||||
ClientID: "client",
|
ClientID: "client",
|
||||||
|
ClientSecret: "secret",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,4 +569,5 @@ func Test_GetPKCEAuthorizationFlow(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
assert.Equal(t, expectedFlowInfo.ProviderConfig.ClientID, flowInfo.ProviderConfig.ClientID, "provider configured client ID should match")
|
assert.Equal(t, expectedFlowInfo.ProviderConfig.ClientID, flowInfo.ProviderConfig.ClientID, "provider configured client ID should match")
|
||||||
|
assert.Equal(t, expectedFlowInfo.ProviderConfig.ClientSecret, flowInfo.ProviderConfig.ClientSecret, "provider configured client secret should match") //nolint:staticcheck
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4414,6 +4414,9 @@ components:
|
|||||||
items:
|
items:
|
||||||
type: string
|
type: string
|
||||||
example: [ "Users" ]
|
example: [ "Users" ]
|
||||||
|
connector_id:
|
||||||
|
type: string
|
||||||
|
description: DEX connector ID for embedded IDP setups
|
||||||
IntegrationEnabled:
|
IntegrationEnabled:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
|
|||||||
@@ -1492,6 +1492,9 @@ type AzureIntegration struct {
|
|||||||
// ClientId Azure AD application (client) ID
|
// ClientId Azure AD application (client) ID
|
||||||
ClientId string `json:"client_id"`
|
ClientId string `json:"client_id"`
|
||||||
|
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// Enabled Whether the integration is enabled
|
// Enabled Whether the integration is enabled
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
@@ -1632,6 +1635,9 @@ type CreateAzureIntegrationRequest struct {
|
|||||||
// ClientSecret Base64-encoded Azure AD client secret
|
// ClientSecret Base64-encoded Azure AD client secret
|
||||||
ClientSecret string `json:"client_secret"`
|
ClientSecret string `json:"client_secret"`
|
||||||
|
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// GroupPrefixes List of start_with string patterns for groups to sync
|
// GroupPrefixes List of start_with string patterns for groups to sync
|
||||||
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
||||||
|
|
||||||
@@ -1653,6 +1659,9 @@ type CreateAzureIntegrationRequestHost string
|
|||||||
|
|
||||||
// CreateGoogleIntegrationRequest defines model for CreateGoogleIntegrationRequest.
|
// CreateGoogleIntegrationRequest defines model for CreateGoogleIntegrationRequest.
|
||||||
type CreateGoogleIntegrationRequest struct {
|
type CreateGoogleIntegrationRequest struct {
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// CustomerId Customer ID from Google Workspace Account Settings
|
// CustomerId Customer ID from Google Workspace Account Settings
|
||||||
CustomerId string `json:"customer_id"`
|
CustomerId string `json:"customer_id"`
|
||||||
|
|
||||||
@@ -1689,6 +1698,9 @@ type CreateOktaScimIntegrationRequest struct {
|
|||||||
// ConnectionName The Okta enterprise connection name on Auth0
|
// ConnectionName The Okta enterprise connection name on Auth0
|
||||||
ConnectionName string `json:"connection_name"`
|
ConnectionName string `json:"connection_name"`
|
||||||
|
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// GroupPrefixes List of start_with string patterns for groups to sync
|
// GroupPrefixes List of start_with string patterns for groups to sync
|
||||||
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
||||||
|
|
||||||
@@ -1698,6 +1710,9 @@ type CreateOktaScimIntegrationRequest struct {
|
|||||||
|
|
||||||
// CreateScimIntegrationRequest defines model for CreateScimIntegrationRequest.
|
// CreateScimIntegrationRequest defines model for CreateScimIntegrationRequest.
|
||||||
type CreateScimIntegrationRequest struct {
|
type CreateScimIntegrationRequest struct {
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// GroupPrefixes List of start_with string patterns for groups to sync
|
// GroupPrefixes List of start_with string patterns for groups to sync
|
||||||
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
||||||
|
|
||||||
@@ -2154,6 +2169,9 @@ type GetTenantsResponse = []TenantResponse
|
|||||||
|
|
||||||
// GoogleIntegration defines model for GoogleIntegration.
|
// GoogleIntegration defines model for GoogleIntegration.
|
||||||
type GoogleIntegration struct {
|
type GoogleIntegration struct {
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// CustomerId Customer ID from Google Workspace
|
// CustomerId Customer ID from Google Workspace
|
||||||
CustomerId string `json:"customer_id"`
|
CustomerId string `json:"customer_id"`
|
||||||
|
|
||||||
@@ -2502,6 +2520,9 @@ type IntegrationResponsePlatform string
|
|||||||
|
|
||||||
// IntegrationSyncFilters defines model for IntegrationSyncFilters.
|
// IntegrationSyncFilters defines model for IntegrationSyncFilters.
|
||||||
type IntegrationSyncFilters struct {
|
type IntegrationSyncFilters struct {
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// GroupPrefixes List of start_with string patterns for groups to sync
|
// GroupPrefixes List of start_with string patterns for groups to sync
|
||||||
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
GroupPrefixes *[]string `json:"group_prefixes,omitempty"`
|
||||||
|
|
||||||
@@ -2994,6 +3015,9 @@ type OktaScimIntegration struct {
|
|||||||
// AuthToken SCIM API token (full on creation/regeneration, masked on retrieval)
|
// AuthToken SCIM API token (full on creation/regeneration, masked on retrieval)
|
||||||
AuthToken string `json:"auth_token"`
|
AuthToken string `json:"auth_token"`
|
||||||
|
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// Enabled Whether the integration is enabled
|
// Enabled Whether the integration is enabled
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
@@ -3864,6 +3888,9 @@ type ScimIntegration struct {
|
|||||||
// AuthToken SCIM API token (full on creation, masked otherwise)
|
// AuthToken SCIM API token (full on creation, masked otherwise)
|
||||||
AuthToken string `json:"auth_token"`
|
AuthToken string `json:"auth_token"`
|
||||||
|
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// Enabled Whether the integration is enabled
|
// Enabled Whether the integration is enabled
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
|
|
||||||
@@ -4341,6 +4368,9 @@ type UpdateAzureIntegrationRequest struct {
|
|||||||
// ClientSecret Base64-encoded Azure AD client secret
|
// ClientSecret Base64-encoded Azure AD client secret
|
||||||
ClientSecret *string `json:"client_secret,omitempty"`
|
ClientSecret *string `json:"client_secret,omitempty"`
|
||||||
|
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// Enabled Whether the integration is enabled
|
// Enabled Whether the integration is enabled
|
||||||
Enabled *bool `json:"enabled,omitempty"`
|
Enabled *bool `json:"enabled,omitempty"`
|
||||||
|
|
||||||
@@ -4359,6 +4389,9 @@ type UpdateAzureIntegrationRequest struct {
|
|||||||
|
|
||||||
// UpdateGoogleIntegrationRequest defines model for UpdateGoogleIntegrationRequest.
|
// UpdateGoogleIntegrationRequest defines model for UpdateGoogleIntegrationRequest.
|
||||||
type UpdateGoogleIntegrationRequest struct {
|
type UpdateGoogleIntegrationRequest struct {
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// CustomerId Customer ID from Google Workspace Account Settings
|
// CustomerId Customer ID from Google Workspace Account Settings
|
||||||
CustomerId *string `json:"customer_id,omitempty"`
|
CustomerId *string `json:"customer_id,omitempty"`
|
||||||
|
|
||||||
@@ -4380,6 +4413,9 @@ type UpdateGoogleIntegrationRequest struct {
|
|||||||
|
|
||||||
// UpdateOktaScimIntegrationRequest defines model for UpdateOktaScimIntegrationRequest.
|
// UpdateOktaScimIntegrationRequest defines model for UpdateOktaScimIntegrationRequest.
|
||||||
type UpdateOktaScimIntegrationRequest struct {
|
type UpdateOktaScimIntegrationRequest struct {
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// Enabled Whether the integration is enabled
|
// Enabled Whether the integration is enabled
|
||||||
Enabled *bool `json:"enabled,omitempty"`
|
Enabled *bool `json:"enabled,omitempty"`
|
||||||
|
|
||||||
@@ -4392,6 +4428,9 @@ type UpdateOktaScimIntegrationRequest struct {
|
|||||||
|
|
||||||
// UpdateScimIntegrationRequest defines model for UpdateScimIntegrationRequest.
|
// UpdateScimIntegrationRequest defines model for UpdateScimIntegrationRequest.
|
||||||
type UpdateScimIntegrationRequest struct {
|
type UpdateScimIntegrationRequest struct {
|
||||||
|
// ConnectorId DEX connector ID for embedded IDP setups
|
||||||
|
ConnectorId *string `json:"connector_id,omitempty"`
|
||||||
|
|
||||||
// Enabled Whether the integration is enabled
|
// Enabled Whether the integration is enabled
|
||||||
Enabled *bool `json:"enabled,omitempty"`
|
Enabled *bool `json:"enabled,omitempty"`
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user