Skip to content

Commit 17bd1e0

Browse files
committed
Add api support support for OAuth2 authentication
1 parent dd0caf7 commit 17bd1e0

File tree

3 files changed

+139
-0
lines changed

3 files changed

+139
-0
lines changed

modules/structs/auth_oauth2.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright 2015 The Gogs Authors. All rights reserved.
2+
// Copyright 2019 The Gitea Authors. All rights reserved.
3+
// SPDX-License-Identifier: MIT
4+
5+
package structs
6+
7+
// CreateUserOption create user options
8+
type CreateAuthOauth2Option struct {
9+
AuthenticationName string `json:"authentication_name" binding:"Required"`
10+
ProviderIconURL string `json:"provider_icon_url"`
11+
ProviderClientID string `json:"provider_client_id" binding:"Required"`
12+
ProviderClientSecret string `json:"provider_client_secret" binding:"Required"`
13+
ProviderAutoDiscoveryURL string `json:"provider_auto_discovery_url" binding:"Required"`
14+
15+
SkipLocal2FA bool `json:"skip_local_2fa"`
16+
AdditionalScopes string `json:"additional_scopes"`
17+
RequiredClaimName string `json:"required_claim_name"`
18+
RequiredClaimValue string `json:"required_claim_value"`
19+
20+
ClaimNameProvidingGroupNameForSource string `json:"claim_name_providingGroupNameForSource"`
21+
GroupClaimValueForAdministratorUsers string `json:"group_claim_value_for_administrator_users"`
22+
GroupClaimValueForRestrictedUsers string `json:"group_claim_value_for_restricted_users"`
23+
MapClaimedGroupsToOrganizationTeams string `json:"map_claimed_groups_to_organization_teams"`
24+
25+
RemoveUsersFromSyncronizedTeams bool `json:"RemoveUsersFromSyncronizedTeams"`
26+
EnableUserSyncronization bool `json:"EnableUserSyncronization"`
27+
AuthenticationSourceIsActive bool `json:"AuthenticationSourceIsActive"`
28+
}
29+
30+
// EditUserOption edit user options
31+
type EditAuthOauth2Option struct {
32+
// // required: true
33+
SourceID int64 `json:"source_id"`
34+
35+
AuthenticationName string `json:"authentication_name" binding:"Required"`
36+
ProviderIconURL string `json:"provider_icon_url"`
37+
ProviderClientID string `json:"provider_client_id" binding:"Required"`
38+
ProviderClientSecret string `json:"provider_client_secret" binding:"Required"`
39+
ProviderAutoDiscoveryURL string `json:"provider_auto_discovery_url" binding:"Required"`
40+
41+
SkipLocal2FA bool `json:"skip_local_2fa"`
42+
AdditionalScopes string `json:"additional_scopes"`
43+
RequiredClaimName string `json:"required_claim_name"`
44+
RequiredClaimValue string `json:"required_claim_value"`
45+
46+
ClaimNameProvidingGroupNameForSource string `json:"claim_name_providingGroupNameForSource"`
47+
GroupClaimValueForAdministratorUsers string `json:"group_claim_value_for_administrator_users"`
48+
GroupClaimValueForRestrictedUsers string `json:"group_claim_value_for_restricted_users"`
49+
MapClaimedGroupsToOrganizationTeams string `json:"map_claimed_groups_to_organization_teams"`
50+
51+
RemoveUsersFromSyncronizedTeams bool `json:"RemoveUsersFromSyncronizedTeams"`
52+
EnableUserSyncronization bool `json:"EnableUserSyncronization"`
53+
AuthenticationSourceIsActive bool `json:"AuthenticationSourceIsActive"`
54+
}

routers/api/v1/admin/auth_oauth.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// Copyright 2015 The Gogs Authors. All rights reserved.
2+
// Copyright 2019 The Gitea Authors. All rights reserved.
3+
// SPDX-License-Identifier: MIT
4+
5+
package admin
6+
7+
import (
8+
"fmt"
9+
"net/http"
10+
"net/url"
11+
12+
auth_model "code.gitea.io/gitea/models/auth"
13+
api "code.gitea.io/gitea/modules/structs"
14+
15+
"code.gitea.io/gitea/modules/web"
16+
"code.gitea.io/gitea/services/auth/source/oauth2"
17+
"code.gitea.io/gitea/services/context"
18+
)
19+
20+
// CreateOauthAuth create a new external authentication for oauth2
21+
func CreateOauthAuth(ctx *context.APIContext) {
22+
form := web.GetForm(ctx).(*api.CreateAuthOauth2Option)
23+
24+
var scopes []string
25+
// for _, s := range strings.Split(form.Oauth2Scopes, ",") {
26+
// s = strings.TrimSpace(s)
27+
// if s != "" {
28+
// scopes = append(scopes, s)
29+
// }
30+
// }
31+
32+
discoveryURL, err := url.Parse(form.ProviderAutoDiscoveryURL)
33+
if err != nil || (discoveryURL.Scheme != "http" && discoveryURL.Scheme != "https") {
34+
fmt.Errorf("invalid Auto Discovery URL: %s (this must be a valid URL starting with http:// or https://)", form.ProviderAutoDiscoveryURL)
35+
36+
// todo: implement handling
37+
}
38+
39+
config := &oauth2.Source{
40+
Provider: "openidConnect",
41+
ClientID: form.ProviderClientID,
42+
ClientSecret: form.ProviderClientSecret,
43+
OpenIDConnectAutoDiscoveryURL: form.ProviderAutoDiscoveryURL,
44+
CustomURLMapping: nil,
45+
IconURL: form.ProviderIconURL,
46+
Scopes: scopes,
47+
RequiredClaimName: form.RequiredClaimName,
48+
RequiredClaimValue: form.RequiredClaimValue,
49+
SkipLocalTwoFA: form.SkipLocal2FA,
50+
51+
GroupClaimName: form.ClaimNameProvidingGroupNameForSource,
52+
RestrictedGroup: form.GroupClaimValueForRestrictedUsers,
53+
AdminGroup: form.GroupClaimValueForAdministratorUsers,
54+
GroupTeamMap: form.MapClaimedGroupsToOrganizationTeams,
55+
GroupTeamMapRemoval: form.RemoveUsersFromSyncronizedTeams,
56+
}
57+
58+
auth_model.CreateSource(ctx, &auth_model.Source{
59+
Type: auth_model.OAuth2,
60+
Name: form.AuthenticationName,
61+
IsActive: true,
62+
Cfg: config,
63+
})
64+
65+
ctx.Status(http.StatusCreated)
66+
67+
// ctx.JSON(http.StatusCreated, convert.ToUser(ctx, u, ctx.Doer))
68+
}
69+
70+
// EditOauthAuth api for modifying a authentication method
71+
func EditOauthAuth(ctx *context.APIContext) {
72+
}
73+
74+
// DeleteOauthAuth api for deleting a authentication method
75+
func DeleteOauthAuth(ctx *context.APIContext) {
76+
}
77+
78+
// // SearchOauthAuth API for getting information of the configured authentication methods according the filter conditions
79+
func SearchOauthAuth(ctx *context.APIContext) {
80+
81+
}

routers/api/v1/api.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,6 +1649,10 @@ func Routes() *web.Router {
16491649
}, tokenRequiresScopes(auth_model.AccessTokenScopeCategoryOrganization), orgAssignment(false, true), reqToken(), reqTeamMembership(), checkTokenPublicOnly())
16501650

16511651
m.Group("/admin", func() {
1652+
m.Group("/identity-auth", func() {
1653+
m.Post("/new", admin.CreateOauthAuth)
1654+
})
1655+
16521656
m.Group("/cron", func() {
16531657
m.Get("", admin.ListCronTasks)
16541658
m.Post("/{task}", admin.PostCronTask)

0 commit comments

Comments
 (0)