diff --git a/client/galaxy/scripts/components/login/Login.vue b/client/galaxy/scripts/components/login/Login.vue index e7c37e369d6..b52e46ca6a3 100644 --- a/client/galaxy/scripts/components/login/Login.vue +++ b/client/galaxy/scripts/components/login/Login.vue @@ -84,6 +84,7 @@ export default { const oidc_idps_icons = { google: "https://developers.google.com/identity/images/btn_google_signin_light_normal_web.png", elixir: "https://elixir-europe.org/sites/default/files/images/login-button-orange.png", + okta: "https://www.okta.com/sites/all/themes/Okta/images/blog/Logos/Okta_Logo_BrightBlue_Medium.png", }; return { login: null, diff --git a/doc/source/admin/authentication.md b/doc/source/admin/authentication.md index bae80da8d92..bf43f79b982 100644 --- a/doc/source/admin/authentication.md +++ b/doc/source/admin/authentication.md @@ -18,7 +18,7 @@ If deploying Galaxy using the default authentication option, user activation can ## OIDC and OAuth2.0 Leveraging OpenID Connect (OIDC) protocol, we enable login to Galaxy without explicitly creating a Galaxy user. This feature is disabled by default. In short, to enable this feature, a Galaxy server admin has to take the following two steps: -1. Define the Galaxy instance on an OIDC identity provider. At the moment, we support Google. To set a Galaxy instance on Google, go to _credentials_ section at [developers console](https://console.developers.google.com/), and configure the instance. At the end, you'll receive _client ID_ and _client secret_ take a note of these two tokens. +1. Define the Galaxy instance on an OIDC identity provider. At the moment, we support Google and Okta. To set a Galaxy instance on Google, go to _credentials_ section at [developers console](https://console.developers.google.com/), and configure the instance. At the end, you'll receive _client ID_ and _client secret_ take a note of these two tokens. For Okta, create a new application in Okta, type _web_. At the end you should take note of the _client ID_ and _client secret_ tokens. 2. Configure Galaxy. In the `galaxy.yml` file enable the OIDC service using the `enable_oidc` key and set the two configuration files (i.e., `oidc_config_file` and `oidc_backends_config_file`), based on the IdP information. diff --git a/lib/galaxy/authnz/managers.py b/lib/galaxy/authnz/managers.py index 1876bdb82bd..ddaff5decd2 100644 --- a/lib/galaxy/authnz/managers.py +++ b/lib/galaxy/authnz/managers.py @@ -121,6 +121,11 @@ class AuthnzManager(object): 'enable_idp_logout': asbool(config_xml.findtext('enable_idp_logout', 'false'))} if config_xml.find('prompt') is not None: rtv['prompt'] = config_xml.find('prompt').text + if config_xml.find('api_url') is not None: + rtv['api_url'] = config_xml.find('api_url').text + if config_xml.find('url') is not None: + rtv['url'] = config_xml.find('url').text + return rtv def _parse_custos_config(self, config_xml): diff --git a/lib/galaxy/authnz/psa_authnz.py b/lib/galaxy/authnz/psa_authnz.py index 61c12f54ff0..75a7f4a72cf 100644 --- a/lib/galaxy/authnz/psa_authnz.py +++ b/lib/galaxy/authnz/psa_authnz.py @@ -22,14 +22,16 @@ DEFAULTS = { BACKENDS = { 'google': 'social_core.backends.google_openidconnect.GoogleOpenIdConnect', - "globus": "social_core.backends.globus.GlobusOpenIdConnect", - 'elixir': 'social_core.backends.elixir.ElixirOpenIdConnect' + 'globus': 'social_core.backends.globus.GlobusOpenIdConnect', + 'elixir': 'social_core.backends.elixir.ElixirOpenIdConnect', + 'okta': 'social_core.backends.okta_openidconnect.OktaOpenIdConnect' } BACKENDS_NAME = { 'google': 'google-openidconnect', - "globus": "globus", - 'elixir': 'elixir' + 'globus': 'globus', + 'elixir': 'elixir', + 'okta': 'okta-openidconnect' } AUTH_PIPELINE = ( @@ -126,6 +128,10 @@ class PSAAuthnz(IdentityProvider): self.config['redirect_uri'] = oidc_backend_config.get('redirect_uri') if oidc_backend_config.get('prompt') is not None: self.config[setting_name('AUTH_EXTRA_ARGUMENTS')]['prompt'] = oidc_backend_config.get('prompt') + if oidc_backend_config.get('api_url') is not None: + self.config[setting_name('API_URL')] = oidc_backend_config.get('api_url') + if oidc_backend_config.get('url') is not None: + self.config[setting_name('URL')] = oidc_backend_config.get('url') def _get_helper(self, name, do_import=False): this_config = self.config.get(setting_name(name), DEFAULTS.get(name, None)) diff --git a/lib/galaxy/config/sample/oidc_backends_config.xml.sample b/lib/galaxy/config/sample/oidc_backends_config.xml.sample index 6cb60e61193..35af5c0a5d6 100644 --- a/lib/galaxy/config/sample/oidc_backends_config.xml.sample +++ b/lib/galaxy/config/sample/oidc_backends_config.xml.sample @@ -110,4 +110,25 @@ Please mind `http` and `https`. consent + + ... + ... + http://localhost:8080/authnz/okta/callback + + ... + diff --git a/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt b/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt index ba38a4adb57..948a30e797e 100644 --- a/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt +++ b/lib/galaxy/dependencies/pipfiles/default/pinned-requirements.txt @@ -170,7 +170,7 @@ setuptools-scm==3.5.0 shellescape==3.4.1 simplejson==3.17.0 six==1.11.0 -social-auth-core[openidconnect]==3.1.0+gx0 +social-auth-core[openidconnect]==3.3.0 sqlalchemy-migrate==0.13.0 sqlalchemy-utils==0.36.3 sqlalchemy==1.3.16