sources/oauth: add gitlab type [AUTH-323] (#8195)
* sources/oauth: add gitlab type * Use correct username field Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space> * format Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space> * lint-fix Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space> * web: add gitlab Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space> Signed-off-by: Jens Langhammer <jens@goauthentik.io> --------- Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space> Signed-off-by: Jens Langhammer <jens@goauthentik.io> Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
This commit is contained in:
		| @ -12,6 +12,7 @@ AUTHENTIK_SOURCES_OAUTH_TYPES = [ | ||||
|     "authentik.sources.oauth.types.discord", | ||||
|     "authentik.sources.oauth.types.facebook", | ||||
|     "authentik.sources.oauth.types.github", | ||||
|     "authentik.sources.oauth.types.gitlab", | ||||
|     "authentik.sources.oauth.types.google", | ||||
|     "authentik.sources.oauth.types.mailcow", | ||||
|     "authentik.sources.oauth.types.oidc", | ||||
|  | ||||
| @ -118,6 +118,15 @@ class GitHubOAuthSource(OAuthSource): | ||||
|         verbose_name_plural = _("GitHub OAuth Sources") | ||||
|  | ||||
|  | ||||
| class GitLabOAuthSource(OAuthSource): | ||||
|     """Social Login using GitLab.com or a GitLab Instance.""" | ||||
|  | ||||
|     class Meta: | ||||
|         abstract = True | ||||
|         verbose_name = _("GitLab OAuth Source") | ||||
|         verbose_name_plural = _("GitLab OAuth Sources") | ||||
|  | ||||
|  | ||||
| class TwitchOAuthSource(OAuthSource): | ||||
|     """Social Login using Twitch.""" | ||||
|  | ||||
|  | ||||
							
								
								
									
										30
									
								
								authentik/sources/oauth/tests/test_type_gitlab.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								authentik/sources/oauth/tests/test_type_gitlab.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| """GitLab Type tests""" | ||||
|  | ||||
| from django.test import TestCase | ||||
|  | ||||
| from authentik.sources.oauth.models import OAuthSource | ||||
| from authentik.sources.oauth.types.gitlab import GitLabOAuthCallback | ||||
|  | ||||
| GITLAB_USER = { | ||||
|     "preferred_username": "dev_gitlab", | ||||
|     "email": "dev@gitlab.com", | ||||
|     "name": "Dev", | ||||
| } | ||||
|  | ||||
|  | ||||
| class TestTypeGitLab(TestCase): | ||||
|     """OAuth Source tests for GitLab""" | ||||
|  | ||||
|     def setUp(self): | ||||
|         self.source = OAuthSource.objects.create( | ||||
|             name="gitlab_test", | ||||
|             slug="gitlab_test", | ||||
|             provider_type="gitlab", | ||||
|         ) | ||||
|  | ||||
|     def test_enroll_context(self): | ||||
|         """Test GitLab Enrollment context""" | ||||
|         ak_context = GitLabOAuthCallback().get_user_enroll_context(GITLAB_USER) | ||||
|         self.assertEqual(ak_context["username"], GITLAB_USER["preferred_username"]) | ||||
|         self.assertEqual(ak_context["email"], GITLAB_USER["email"]) | ||||
|         self.assertEqual(ak_context["name"], GITLAB_USER["name"]) | ||||
							
								
								
									
										54
									
								
								authentik/sources/oauth/types/gitlab.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								authentik/sources/oauth/types/gitlab.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| """ | ||||
| GitLab OAuth Views | ||||
|  | ||||
| See https://docs.gitlab.com/ee/integration/oauth_provider.html | ||||
| and https://docs.gitlab.com/ee/integration/openid_connect_provider.html | ||||
| """ | ||||
|  | ||||
| from typing import Any | ||||
|  | ||||
| from authentik.sources.oauth.models import OAuthSource | ||||
| from authentik.sources.oauth.types.registry import SourceType, registry | ||||
| from authentik.sources.oauth.views.callback import OAuthCallback | ||||
| from authentik.sources.oauth.views.redirect import OAuthRedirect | ||||
|  | ||||
|  | ||||
| class GitLabOAuthRedirect(OAuthRedirect): | ||||
|     """GitLab OAuth2 Redirect""" | ||||
|  | ||||
|     def get_additional_parameters(self, source: OAuthSource): | ||||
|         return { | ||||
|             "scope": ["read_user", "openid", "profile", "email"], | ||||
|         } | ||||
|  | ||||
|  | ||||
| class GitLabOAuthCallback(OAuthCallback): | ||||
|     """GitLab OAuth2 Callback""" | ||||
|  | ||||
|     def get_user_enroll_context( | ||||
|         self, | ||||
|         info: dict[str, Any], | ||||
|     ) -> dict[str, Any]: | ||||
|         return { | ||||
|             "username": info.get("preferred_username"), | ||||
|             "email": info.get("email"), | ||||
|             "name": info.get("name"), | ||||
|         } | ||||
|  | ||||
|  | ||||
| @registry.register() | ||||
| class GitLabType(SourceType): | ||||
|     """GitLab Type definition""" | ||||
|  | ||||
|     callback_view = GitLabOAuthCallback | ||||
|     redirect_view = GitLabOAuthRedirect | ||||
|     verbose_name = "GitLab" | ||||
|     name = "gitlab" | ||||
|  | ||||
|     urls_customizable = True | ||||
|  | ||||
|     authorization_url = "https://gitlab.com/oauth/authorize" | ||||
|     access_token_url = "https://gitlab.com/oauth/token"  # nosec | ||||
|     profile_url = "https://gitlab.com/oauth/userinfo" | ||||
|     oidc_well_known_url = "https://gitlab.com/.well-known/openid-configuration" | ||||
|     oidc_jwks_url = "https://gitlab.com/oauth/discovery/keys" | ||||
| @ -4444,6 +4444,7 @@ | ||||
|                         "discord", | ||||
|                         "facebook", | ||||
|                         "github", | ||||
|                         "gitlab", | ||||
|                         "google", | ||||
|                         "mailcow", | ||||
|                         "okta", | ||||
|  | ||||
| @ -29699,7 +29699,7 @@ components: | ||||
|         * `authentik.events` - authentik Events | ||||
|     AppleChallengeResponseRequest: | ||||
|       type: object | ||||
|       description: Pseudo class for plex response | ||||
|       description: Pseudo class for apple response | ||||
|       properties: | ||||
|         component: | ||||
|           type: string | ||||
| @ -41406,6 +41406,7 @@ components: | ||||
|       - discord | ||||
|       - facebook | ||||
|       - github | ||||
|       - gitlab | ||||
|       - google | ||||
|       - mailcow | ||||
|       - okta | ||||
| @ -41421,6 +41422,7 @@ components: | ||||
|         * `discord` - Discord | ||||
|         * `facebook` - Facebook | ||||
|         * `github` - GitHub | ||||
|         * `gitlab` - GitLab | ||||
|         * `google` - Google | ||||
|         * `mailcow` - Mailcow | ||||
|         * `okta` - Okta | ||||
|  | ||||
| @ -44,6 +44,8 @@ export function ProviderToLabel(provider?: ProviderTypeEnum): string { | ||||
|             return "Facebook"; | ||||
|         case ProviderTypeEnum.Github: | ||||
|             return "GitHub"; | ||||
|         case ProviderTypeEnum.Gitlab: | ||||
|             return "GitLab"; | ||||
|         case ProviderTypeEnum.Google: | ||||
|             return "Google"; | ||||
|         case ProviderTypeEnum.Mailcow: | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 Samir Musali
					Samir Musali