From 43e4a51ccf59b6018b1a5eee71f3142fb4b91567 Mon Sep 17 00:00:00 2001 From: Sergey Beryozkin Date: Tue, 19 Sep 2023 18:25:39 +0100 Subject: [PATCH] Add OIDC Mastodon provider --- .../images/oidc-mastodon-register-app.png | Bin 0 -> 73290 bytes .../images/oidc-mastodon-registered-apps.png | Bin 0 -> 13470 bytes ...idc-code-flow-authentication-tutorial.adoc | 2 +- .../security-openid-connect-providers.adoc | 33 +++++++++++ .../io/quarkus/oidc/OidcTenantConfig.java | 1 + .../runtime/providers/KnownOidcProviders.java | 21 +++++++ .../quarkus/oidc/runtime/OidcUtilsTest.java | 53 ++++++++++++++++++ 7 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 docs/src/main/asciidoc/images/oidc-mastodon-register-app.png create mode 100644 docs/src/main/asciidoc/images/oidc-mastodon-registered-apps.png diff --git a/docs/src/main/asciidoc/images/oidc-mastodon-register-app.png b/docs/src/main/asciidoc/images/oidc-mastodon-register-app.png new file mode 100644 index 0000000000000000000000000000000000000000..7ed1fa8879b7ee79a721b3dcc09af0ad5ec2d7cb GIT binary patch literal 73290 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 z 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 ANdN!< literal 0 HcmV?d00001 diff --git a/docs/src/main/asciidoc/images/oidc-mastodon-registered-apps.png b/docs/src/main/asciidoc/images/oidc-mastodon-registered-apps.png new file mode 100644 index 0000000000000000000000000000000000000000..a0205a4ceca3a258b019aaeca6f86c28d144e676 GIT binary patch literal 13470 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 literal 0 HcmV?d00001 diff --git a/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc b/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc index 296d4a8f2a07a..3babb1e0bcdd1 100644 --- a/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc +++ b/docs/src/main/asciidoc/security-oidc-code-flow-authentication-tutorial.adoc @@ -8,7 +8,7 @@ With the Quarkus OpenID Connect (OIDC) extension, you can protect application HT To learn more about the OIDC authorization code flow mechanism, see xref:security-oidc-code-flow-authentication.adoc[OIDC code flow mechanism for protecting web applications]. -To learn about how well-known social providers such as Google, GitHub, Microsoft, Twitter, Apple, Facebook, and Spotify can be used with Quarkus OIDC, see xref:security-openid-connect-providers.adoc[Configuring Well-Known OpenID Connect Providers]. +To learn about how well-known social providers such as Apple, Facebook, GitHub, Google, Mastodon, Microsoft, Twitch, Twitter (X), and Spotify can be used with Quarkus OIDC, see xref:security-openid-connect-providers.adoc[Configuring Well-Known OpenID Connect Providers]. See also, xref:security-authentication-mechanisms.adoc#other-supported-authentication-mechanisms[Authentication mechanisms in Quarkus]. If you want to protect your service applications by using OIDC Bearer token authentication, see xref:security-oidc-bearer-token-authentication-concept.adoc[OIDC Bearer token authentication]. diff --git a/docs/src/main/asciidoc/security-openid-connect-providers.adoc b/docs/src/main/asciidoc/security-openid-connect-providers.adoc index 8b7b24c82ea5a..1301972cdb04f 100644 --- a/docs/src/main/asciidoc/security-openid-connect-providers.adoc +++ b/docs/src/main/asciidoc/security-openid-connect-providers.adoc @@ -114,6 +114,39 @@ quarkus.oidc.credentials.secret= TIP: You can also send access tokens issued by `Google` to `quarkus.oidc.application-type=service` or `quarkus.oidc.application-type=hybrid` Quarkus applications. +[[mastodon]] +=== Mastodon + +Create a https://joinmastodon.org/[Mastodon account]. You must https://joinmastodon.org/servers[pick a server], for example, `mastodon.social`. +Select a `Development` option in you account and register an application, for example: + +image::oidc-mastodon-registere-app.png[role="thumb"] + +Select the registered application: + +image::oidc-mastodon-registered-apps.png[role="thumb"] + +and note its client id and client secret properties, use them to configure your `application.properties`: + +[source,properties] +---- +quarkus.oidc.provider=mastodon +quarkus.oidc.client-id= +quarkus.oidc.credentials.client-secret.value= +---- + +By default, `quarkus.oidc.provider=mastodon` sets `quarkus.oidc.auth-server-url` to the `https://mastodon.social` Mastodon server address. + +You can override `quarkus.oidc.auth-server-url` if you have created your account in another Mastodon server, for example: + +[source,properties] +---- +quarkus.oidc.provider=mastodon +quarkus.oidc.auth-server-url=https://infosec.exchange +quarkus.oidc.client-id= +quarkus.oidc.credentials.client-secret.value= +---- + [[microsoft]] === Microsoft diff --git a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java index 093d45fcdb238..c98d7b23cf2d6 100644 --- a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java +++ b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/OidcTenantConfig.java @@ -1658,6 +1658,7 @@ public static enum Provider { FACEBOOK, GITHUB, GOOGLE, + MASTODON, MICROSOFT, SPOTIFY, TWITCH, diff --git a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java index 13aab4cc933dc..667bf3a54467c 100644 --- a/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java +++ b/extensions/oidc/runtime/src/main/java/io/quarkus/oidc/runtime/providers/KnownOidcProviders.java @@ -19,6 +19,8 @@ public static OidcTenantConfig provider(OidcTenantConfig.Provider provider) { return github(); case GOOGLE: return google(); + case MASTODON: + return mastodon(); case MICROSOFT: return microsoft(); case SPOTIFY: @@ -75,6 +77,25 @@ private static OidcTenantConfig google() { return ret; } + private static OidcTenantConfig mastodon() { + OidcTenantConfig ret = new OidcTenantConfig(); + ret.setDiscoveryEnabled(false); + ret.setAuthServerUrl("https://mastodon.social"); + ret.setApplicationType(OidcTenantConfig.ApplicationType.WEB_APP); + ret.setAuthorizationPath("/oauth/authorize"); + ret.setTokenPath("/oauth/token"); + + ret.setUserInfoPath("/api/v1/accounts/verify_credentials"); + + OidcTenantConfig.Authentication authentication = ret.getAuthentication(); + authentication.setAddOpenidScope(false); + authentication.setScopes(List.of("read")); + authentication.setUserInfoRequired(true); + authentication.setIdTokenRequired(false); + + return ret; + } + private static OidcTenantConfig microsoft() { OidcTenantConfig ret = new OidcTenantConfig(); ret.setAuthServerUrl("https://login.microsoftonline.com/common/v2.0"); diff --git a/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java b/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java index 54fbc68e12d5f..52105a54e974d 100644 --- a/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java +++ b/extensions/oidc/runtime/src/test/java/io/quarkus/oidc/runtime/OidcUtilsTest.java @@ -145,6 +145,59 @@ public void testOverrideTwitterProperties() throws Exception { assertFalse(config.authentication.pkceRequired.get()); } + @Test + public void testAcceptMastodonProperties() throws Exception { + OidcTenantConfig tenant = new OidcTenantConfig(); + tenant.setTenantId(OidcUtils.DEFAULT_TENANT_ID); + OidcTenantConfig config = OidcUtils.mergeTenantConfig(tenant, KnownOidcProviders.provider(Provider.MASTODON)); + + assertEquals(OidcUtils.DEFAULT_TENANT_ID, config.getTenantId().get()); + assertEquals(ApplicationType.WEB_APP, config.getApplicationType().get()); + assertFalse(config.isDiscoveryEnabled().get()); + assertEquals("https://mastodon.social", config.getAuthServerUrl().get()); + assertEquals("/oauth/authorize", config.getAuthorizationPath().get()); + assertEquals("/oauth/token", config.getTokenPath().get()); + assertEquals("/api/v1/accounts/verify_credentials", config.getUserInfoPath().get()); + + assertFalse(config.authentication.idTokenRequired.get()); + assertTrue(config.authentication.userInfoRequired.get()); + assertFalse(config.authentication.addOpenidScope.get()); + assertEquals(List.of("read"), config.authentication.scopes.get()); + } + + @Test + public void testOverrideMastodonProperties() throws Exception { + OidcTenantConfig tenant = new OidcTenantConfig(); + tenant.setTenantId(OidcUtils.DEFAULT_TENANT_ID); + + tenant.setApplicationType(ApplicationType.HYBRID); + tenant.setDiscoveryEnabled(true); + tenant.setAuthServerUrl("http://localhost/wiremock"); + tenant.setAuthorizationPath("authorization"); + tenant.setTokenPath("tokens"); + tenant.setUserInfoPath("userinfo"); + + tenant.authentication.setIdTokenRequired(true); + tenant.authentication.setUserInfoRequired(false); + tenant.authentication.setAddOpenidScope(true); + tenant.authentication.setScopes(List.of("write")); + + OidcTenantConfig config = OidcUtils.mergeTenantConfig(tenant, KnownOidcProviders.provider(Provider.MASTODON)); + + assertEquals(OidcUtils.DEFAULT_TENANT_ID, config.getTenantId().get()); + assertEquals(ApplicationType.HYBRID, config.getApplicationType().get()); + assertTrue(config.isDiscoveryEnabled().get()); + assertEquals("http://localhost/wiremock", config.getAuthServerUrl().get()); + assertEquals("authorization", config.getAuthorizationPath().get()); + assertEquals("tokens", config.getTokenPath().get()); + assertEquals("userinfo", config.getUserInfoPath().get()); + + assertTrue(config.authentication.idTokenRequired.get()); + assertFalse(config.authentication.userInfoRequired.get()); + assertEquals(List.of("write"), config.authentication.scopes.get()); + assertTrue(config.authentication.addOpenidScope.get()); + } + @Test public void testAcceptXProperties() throws Exception { OidcTenantConfig tenant = new OidcTenantConfig();