Skip to content

Commit

Permalink
[IMP] auth_oidc: prompt for account on AAD login
Browse files Browse the repository at this point in the history
  • Loading branch information
Christopher Rogos authored and CRogos committed Oct 9, 2024
1 parent e3d02aa commit 5519151
Show file tree
Hide file tree
Showing 8 changed files with 51 additions and 3 deletions.
7 changes: 7 additions & 0 deletions auth_oidc/controllers/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import hashlib
import logging
import secrets
from ast import literal_eval

from werkzeug.urls import url_decode, url_encode

Expand Down Expand Up @@ -43,6 +44,12 @@ def list_providers(self):
if "openid" not in provider["scope"].split():
_logger.error("openid connect scope must contain 'openid'")
params["scope"] = provider["scope"]

# append provider specific auth link params
if provider["auth_link_params"]:
params_upd = literal_eval(provider["auth_link_params"])
params.update(params_upd)

# auth link that the user will click
provider["auth_link"] = "{}?{}".format(
provider["auth_endpoint"], url_encode(params)
Expand Down
2 changes: 2 additions & 0 deletions auth_oidc/data/auth_oauth_data.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
>https://login.microsoftonline.com/organizations/discovery/v2.0/keys</field>
<field name="css_class">fa fa-fw fa-windows</field>
<field name="body">Log in with Microsoft</field>
<field name="auth_link_params">{'prompt':'select_account'}</field>
</record>
<record id="provider_azuread_single" model="auth.oauth.provider">
<field name="name">Azure AD Single Tenant</field>
Expand All @@ -35,5 +36,6 @@
>https://login.microsoftonline.com/{tenant_id}/discovery/v2.0/keys</field>
<field name="css_class">fa fa-fw fa-windows</field>
<field name="body">Log in with Microsoft</field>
<field name="auth_link_params">{'prompt':'select_account'}</field>
</record>
</odoo>
20 changes: 20 additions & 0 deletions auth_oidc/demo/local_keycloak.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,24 @@
name="jwks_uri"
>http://localhost:8080/auth/realms/master/protocol/openid-connect/certs</field>
</record>
<record id="provider_azuread_multi" model="auth.oauth.provider">
<field name="name">Azure AD Multitenant</field>
<field name="flow">id_token_code</field>
<field name="client_id">auth_oidc-test</field>
<field name="enabled">True</field>
<field name="token_map">upn:user_id upn:email</field>
<field
name="auth_endpoint"
>https://login.microsoftonline.com/organizations/oauth2/v2.0/authorize</field>
<field name="scope">profile openid</field>
<field
name="token_endpoint"
>https://login.microsoftonline.com/organizations/oauth2/v2.0/token</field>
<field
name="jwks_uri"
>https://login.microsoftonline.com/organizations/discovery/v2.0/keys</field>
<field name="css_class">fa fa-fw fa-windows</field>
<field name="body">Log in with Microsoft</field>
<field name="auth_link_params">{'prompt':'select_account'}</field>
</record>
</odoo>
3 changes: 3 additions & 0 deletions auth_oidc/models/auth_oauth_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,9 @@ class AuthOauthProvider(models.Model):
string="Token URL", help="Required for OpenID Connect authorization code flow."
)
jwks_uri = fields.Char(string="JWKS URL", help="Required for OpenID Connect.")
auth_link_params = fields.Char(
help="Additional parameters for the auth link. For example: {'prompt':'select_account'}"
)

@tools.ormcache("self.jwks_uri", "kid")
def _get_keys(self, kid):
Expand Down
4 changes: 4 additions & 0 deletions auth_oidc/readme/CONFIGURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ or

![image](../static/description/odoo-azure_ad_multitenant.png)

- Auth Link Params: Add {'prompt':'select_account'} to the auth link to get the account selection screen
![image](../static/description/oauth-microsoft_azure-select_account.png)


## Setup for Keycloak

Example configuration with OpenID Connect authorization code flow.
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
15 changes: 12 additions & 3 deletions auth_oidc/tests/test_auth_oidc_auth_code.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def setUp(self):
super().setUp()
# search our test provider and bind the demo user to it
self.provider_rec = self.env["auth.oauth.provider"].search(
[("client_id", "=", "auth_oidc-test")]
[("name", "=", "keycloak:8080 on localhost")]
)
self.assertEqual(len(self.provider_rec), 1)

Expand All @@ -83,8 +83,10 @@ def test_auth_link(self):
).write(dict(enabled=False))
with MockRequest(self.env):
providers = OpenIDLogin().list_providers()
self.assertEqual(len(providers), 1)
auth_link = providers[0]["auth_link"]
self.assertEqual(len(providers), 2)
auth_link = list(
filter(lambda p: p["name"] == "keycloak:8080 on localhost", providers)
)[0]["auth_link"]
assert auth_link.startswith(self.provider_rec.auth_endpoint)
params = parse_qs(urlparse(auth_link).query)
self.assertEqual(params["response_type"], ["code"])
Expand All @@ -95,6 +97,13 @@ def test_auth_link(self):
self.assertTrue(params["nonce"])
self.assertTrue(params["state"])
self.assertEqual(params["redirect_uri"], [BASE_URL + "/auth_oauth/signin"])
self.assertFalse("prompt" in params)

auth_link_ms = list(
filter(lambda p: p["name"] == "Azure AD Multitenant", providers)
)[0]["auth_link"]
params = parse_qs(urlparse(auth_link_ms).query)
self.assertEqual(params["prompt"], ["select_account"])

def _prepare_login_test_user(self):
user = self.env.ref("base.user_demo")
Expand Down
3 changes: 3 additions & 0 deletions auth_oidc/views/auth_oauth_provider.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
<field name="token_endpoint" />
<field name="jwks_uri" />
</field>
<field name="auth_endpoint" position="after">
<field name="auth_link_params" />
</field>
</field>
</record>
</odoo>

0 comments on commit 5519151

Please sign in to comment.