Skip to content

Commit 8bb4e4f

Browse files
committed
feat: new api for auth0 connector
1 parent ded80b5 commit 8bb4e4f

File tree

3 files changed

+130
-4
lines changed

3 files changed

+130
-4
lines changed

services/auth/api/connector.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,14 @@ type CreateConnectorRequest struct {
1313
ID string `json:"id,omitempty"` // Optional
1414
Name string `json:"name,omitempty"` // Optional
1515
}
16+
type CreateAuth0ConnectorRequest struct {
17+
18+
19+
Issuer string `json:"issuer,omitempty" validate:"omitempty,url"`
20+
ClientID string `json:"client_id" validate:"required"`
21+
ClientSecret string `json:"client_secret" validate:"required"`
22+
Domain string `json:"domain" validate:"required"`
23+
}
1624
type UpdateConnectorRequest struct {
1725
ConnectorID string `json:"connector_id" validate:"required"`
1826
ConnectorType string `json:"connector_type" validate:"required,oneof=oidc"` // 'oidc' is supported for now

services/auth/http.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,8 @@ func (r *httpRoutes) Register(e *echo.Echo) {
7070
v1.GET("/connectors/supported-connector-types", httpserver.AuthorizeHandler(r.GetSupportedType, api2.AdminRole))
7171
v1.GET("/connector/:type", httpserver.AuthorizeHandler(r.GetConnectors, api2.AdminRole))
7272
v1.POST("/connector", httpserver.AuthorizeHandler(r.CreateConnector, api2.AdminRole))
73+
v1.POST("/connector/auth0", httpserver.AuthorizeHandler(r.CreateAuth0Connector, api2.AdminRole))
74+
7375
v1.PUT("/connector", httpserver.AuthorizeHandler(r.UpdateConnector, api2.AdminRole))
7476
v1.DELETE("/connector/:id", httpserver.AuthorizeHandler(r.DeleteConnector, api2.AdminRole))
7577

@@ -1104,6 +1106,76 @@ func (r *httpRoutes) CreateConnector(ctx echo.Context) error {
11041106
return ctx.JSON(http.StatusCreated, res)
11051107
}
11061108

1109+
// CreateConnector godoc
1110+
//
1111+
// @Summary Create Connector
1112+
// @Description Creates new OIDC connector.
1113+
// @Security BearerToken
1114+
// @Tags connectors
1115+
// @Produce json
1116+
// @Success 200
1117+
// @Router /auth/api/v1/connector/supported-connector-types [post]
1118+
func (r *httpRoutes) CreateAuth0Connector(ctx echo.Context) error {
1119+
var req api.CreateAuth0ConnectorRequest
1120+
if err := bindValidate(ctx, &req); err != nil {
1121+
return echo.NewHTTPError(http.StatusBadRequest, err)
1122+
}
1123+
1124+
creator := utils.CreateAuth0Connector
1125+
1126+
1127+
dexRequest := utils.CreateAuth0ConnectorRequest{
1128+
Issuer: req.Issuer,
1129+
ClientID: req.ClientID,
1130+
ClientSecret: req.ClientSecret,
1131+
Domain: req.Domain,
1132+
}
1133+
dexreq, err := creator(dexRequest)
1134+
if err != nil {
1135+
r.logger.Error("Error on Creating dex request", zap.Error(err))
1136+
return echo.NewHTTPError(http.StatusBadRequest, err)
1137+
}
1138+
dexClient, err := newDexClient(dexGrpcAddress)
1139+
if err != nil {
1140+
r.logger.Error("failed to create dex client", zap.Error(err))
1141+
return echo.NewHTTPError(http.StatusBadRequest, "failed to create dex client")
1142+
}
1143+
res, err := dexClient.CreateConnector(context.TODO(), dexreq)
1144+
if err != nil {
1145+
r.logger.Error("failed to create dex connector", zap.Error(err))
1146+
return echo.NewHTTPError(http.StatusBadRequest, "failed to create dex connector")
1147+
}
1148+
if res.AlreadyExists {
1149+
return echo.NewHTTPError(http.StatusBadRequest, "connector already exists")
1150+
}
1151+
err = r.db.CreateConnector(&db.Connector{
1152+
LastUpdate: time.Now(),
1153+
ConnectorID: "auth0",
1154+
ConnectorType: "oidc",
1155+
ConnectorSubType: "auth0",
1156+
})
1157+
if err != nil {
1158+
r.logger.Error("failed to create connector", zap.Error(err))
1159+
return echo.NewHTTPError(http.StatusBadRequest, "failed to create connector")
1160+
}
1161+
// restart dex pod on connector creation
1162+
err = utils.RestartDexPod()
1163+
if err != nil {
1164+
r.logger.Error("failed to restart dex pod", zap.Error(err))
1165+
return echo.NewHTTPError(http.StatusBadRequest, "failed to restart dex pod")
1166+
}
1167+
1168+
return ctx.JSON(http.StatusCreated, res)
1169+
}
1170+
1171+
1172+
1173+
1174+
1175+
1176+
1177+
1178+
11071179
// UpdateConnector godoc
11081180
//
11091181
// @Summary Update Connector

services/auth/utils/connectors.go

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ type CreateConnectorRequest struct {
2525
ID string `json:"id,omitempty"` // Optional
2626
Name string `json:"name,omitempty"` // Optional
2727
}
28+
type CreateAuth0ConnectorRequest struct {
29+
30+
Issuer string `json:"issuer,omitempty" validate:"omitempty,url"`
31+
ClientID string `json:"client_id" validate:"required"`
32+
ClientSecret string `json:"client_secret" validate:"required"`
33+
Domain string `json:"domain" validate:"required"`
34+
}
2835
type UpdateConnectorRequest struct {
2936
ConnectorID string `json:"connector_id" validate:"required"`
3037
ConnectorType string `json:"connector_type" validate:"required,oneof=oidc"` // 'oidc' is supported for now
@@ -88,10 +95,6 @@ func CreateOIDCConnector(params CreateConnectorRequest) (*dexapi.CreateConnecto
8895

8996

9097
}
91-
92-
93-
94-
9598
case "entraid":
9699
// Required: tenantID, clientID, clientSecret
97100
if params.TenantID != "" && params.Issuer == "" {
@@ -158,6 +161,49 @@ func CreateOIDCConnector(params CreateConnectorRequest) (*dexapi.CreateConnecto
158161

159162

160163

164+
// Execute the CreateConnector RPC.
165+
166+
167+
return req, nil
168+
}
169+
170+
func CreateAuth0Connector(params CreateAuth0ConnectorRequest) (*dexapi.CreateConnectorReq, error) {
171+
172+
173+
var oidcConfig OIDCConfig
174+
var connectorID, connectorName string
175+
connectorID = "auth0"
176+
connectorName = "Auth0"
177+
oidcConfig = OIDCConfig{
178+
Issuer: params.Issuer,
179+
ClientID: params.ClientID,
180+
ClientSecret: params.ClientSecret,
181+
RedirectURIs: []string{params.Domain},
182+
RedirectURI: params.Domain,
183+
InsecureEnableGroups: true,
184+
InsecureSkipEmailVerified: true,
185+
186+
187+
}
188+
// Serialize the OIDCConfig to JSON.
189+
configBytes, err := json.Marshal(oidcConfig)
190+
if err != nil {
191+
return nil, fmt.Errorf("failed to marshal OIDC config: %w", err)
192+
}
193+
194+
// Construct the Connector message.
195+
connector := &dexapi.Connector{
196+
Id: connectorID,
197+
Type: "oidc",
198+
Name: connectorName,
199+
Config: configBytes,
200+
}
201+
// Create the CreateConnectorReq message.
202+
req := &dexapi.CreateConnectorReq{
203+
Connector: connector,
204+
}
205+
206+
161207
// Execute the CreateConnector RPC.
162208

163209

0 commit comments

Comments
 (0)