Skip to content

Add api support for external authentication management #34234

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 20 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
17bd1e0
Add api support support for OAuth2 authentication
uvulpos Apr 18, 2025
c2f5544
Add OAuth2 provider listing and conversion functions
uvulpos Apr 18, 2025
c830bc1
Refactor AuthOauth2Option structure and improve error handling in Cre…
uvulpos Apr 18, 2025
25425ad
Implement DeleteOauthAuth API and refactor source deletion logic
uvulpos Apr 18, 2025
91247d6
Merge branch 'main' into feat/add-oauth-management-to-api-for-iac-too…
uvulpos Apr 18, 2025
62dc4c2
Add PUT endpoint for creating new OAuth2 authentication and clean up …
uvulpos Apr 18, 2025
c3fc57b
Merge branch 'feat/add-oauth-management-to-api-for-iac-tooling' of gi…
uvulpos Apr 18, 2025
4787ea4
Refactor SearchOauthAuth to use auth_model for source retrieval
uvulpos Apr 19, 2025
cb0e0ce
Refactor OAuth authentication methods for improved error handling and…
uvulpos Apr 19, 2025
c31df25
Implement update patch method for api
uvulpos Apr 20, 2025
cf3d746
Merge branch 'main' into feat/add-oauth-management-to-api-for-iac-too…
uvulpos Apr 20, 2025
6a27fbe
Add Swagger documentation for OAuth2 authentication endpoints
uvulpos Apr 20, 2025
0646881
Merge branch 'main' into feat/add-oauth-management-to-api-for-iac-too…
uvulpos Apr 20, 2025
2de3030
Remove generateScopes function and set Scopes to an empty array in OA…
uvulpos Apr 21, 2025
8377386
Merge branch 'feat/add-oauth-management-to-api-for-iac-tooling' of gi…
uvulpos Apr 21, 2025
f4ab93c
Merge branch 'main' into feat/add-oauth-management-to-api-for-iac-too…
uvulpos Apr 21, 2025
cb7b359
Update copyright year to 2025 in OAuth2 related files
uvulpos Apr 21, 2025
983e648
Merge branch 'feat/add-oauth-management-to-api-for-iac-tooling' of gi…
uvulpos Apr 21, 2025
098de09
Refactor OAuth authentication structures and endpoints to unify AuthS…
uvulpos Apr 21, 2025
b58f94a
Add api route for searching identity authentication in admin panel
uvulpos Apr 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion models/auth/source.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,13 +235,18 @@ func CreateSource(ctx context.Context, source *Source) error {
err = registerableSource.RegisterSource()
if err != nil {
// remove the AuthSource in case of errors while registering configuration
if _, err := db.GetEngine(ctx).ID(source.ID).Delete(new(Source)); err != nil {
if err := DeleteSource(ctx, source.ID); err != nil {
log.Error("CreateSource: Error while wrapOpenIDConnectInitializeError: %v", err)
}
}
return err
}

func DeleteSource(ctx context.Context, id int64) error {
_, err := db.GetEngine(ctx).ID(id).Delete(new(Source))
return err
}

type FindSourcesOptions struct {
db.ListOptions
IsActive optional.Option[bool]
Expand Down
13 changes: 13 additions & 0 deletions modules/structs/auth.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package structs

type AuthSourceOption struct {
ID int64 `json:"id"`
AuthenticationName string `json:"authentication_name" binding:"Required"`
TypeName string `json:"type_name"`

IsActive bool `json:"is_active"`
IsSyncEnabled bool `json:"is_sync_enabled"`
}
50 changes: 50 additions & 0 deletions modules/structs/auth_oauth2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package structs

// CreateUserOption create user options
type CreateAuthOauth2Option struct {
AuthenticationName string `json:"authentication_name" binding:"Required"`
ProviderIconURL string `json:"provider_icon_url"`
ProviderClientID string `json:"provider_client_id" binding:"Required"`
ProviderClientSecret string `json:"provider_client_secret" binding:"Required"`
ProviderAutoDiscoveryURL string `json:"provider_auto_discovery_url" binding:"Required"`

SkipLocal2FA bool `json:"skip_local_2fa"`
AdditionalScopes string `json:"additional_scopes"`
RequiredClaimName string `json:"required_claim_name"`
RequiredClaimValue string `json:"required_claim_value"`

ClaimNameProvidingGroupNameForSource string `json:"claim_name_providingGroupNameForSource"`
GroupClaimValueForAdministratorUsers string `json:"group_claim_value_for_administrator_users"`
GroupClaimValueForRestrictedUsers string `json:"group_claim_value_for_restricted_users"`
MapClaimedGroupsToOrganizationTeams string `json:"map_claimed_groups_to_organization_teams"`

RemoveUsersFromSyncronizedTeams bool `json:"RemoveUsersFromSyncronizedTeams"`
EnableUserSyncronization bool `json:"EnableUserSyncronization"`
AuthenticationSourceIsActive bool `json:"AuthenticationSourceIsActive"`
}

// EditUserOption edit user options
type EditAuthOauth2Option struct {
AuthenticationName string `json:"authentication_name" binding:"Required"`
ProviderIconURL string `json:"provider_icon_url"`
ProviderClientID string `json:"provider_client_id" binding:"Required"`
ProviderClientSecret string `json:"provider_client_secret" binding:"Required"`
ProviderAutoDiscoveryURL string `json:"provider_auto_discovery_url" binding:"Required"`

SkipLocal2FA bool `json:"skip_local_2fa"`
AdditionalScopes string `json:"additional_scopes"`
RequiredClaimName string `json:"required_claim_name"`
RequiredClaimValue string `json:"required_claim_value"`

ClaimNameProvidingGroupNameForSource string `json:"claim_name_providingGroupNameForSource"`
GroupClaimValueForAdministratorUsers string `json:"group_claim_value_for_administrator_users"`
GroupClaimValueForRestrictedUsers string `json:"group_claim_value_for_restricted_users"`
MapClaimedGroupsToOrganizationTeams string `json:"map_claimed_groups_to_organization_teams"`

RemoveUsersFromSyncronizedTeams bool `json:"RemoveUsersFromSyncronizedTeams"`
EnableUserSyncronization bool `json:"EnableUserSyncronization"`
AuthenticationSourceIsActive bool `json:"AuthenticationSourceIsActive"`
}
59 changes: 59 additions & 0 deletions routers/api/v1/admin/auth.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
// Copyright 2025 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package admin

import (
"net/http"

auth_model "code.gitea.io/gitea/models/auth"
"code.gitea.io/gitea/models/db"
api "code.gitea.io/gitea/modules/structs"
"code.gitea.io/gitea/routers/api/v1/utils"
"code.gitea.io/gitea/services/context"
"code.gitea.io/gitea/services/convert"
)

// SearchAuth API for getting information of the configured authentication methods according the filter conditions
func SearchAuth(ctx *context.APIContext) {
// swagger:operation GET /admin/identity-auth admin adminSearchAuth
// ---
// summary: Search authentication sources
// produces:
// - application/json
// parameters:
// - name: page
// in: query
// description: page number of results to return (1-based)
// type: integer
// - name: limit
// in: query
// description: page size of results
// type: integer
// responses:
// "200":
// description: "SearchResults of authentication sources"
// schema:
// type: array
// items:
// "$ref": "#/definitions/AuthOauth2Option"
// "403":
// "$ref": "#/responses/forbidden"

listOptions := utils.GetListOptions(ctx)

authSources, maxResults, err := db.FindAndCount[auth_model.Source](ctx, auth_model.FindSourcesOptions{})
if err != nil {
ctx.APIErrorInternal(err)
return
}

results := make([]*api.AuthSourceOption, len(authSources))
for i := range authSources {
results[i] = convert.ToOauthProvider(ctx, authSources[i])
}

ctx.SetLinkHeader(int(maxResults), listOptions.PageSize)
ctx.SetTotalCountHeader(maxResults)
ctx.JSON(http.StatusOK, &results)
}
Loading
Loading