Skip to content

Commit

Permalink
feat: use oidc well-known url (#2077)
Browse files Browse the repository at this point in the history
  • Loading branch information
muhlba91 committed May 2, 2024
1 parent 80c8bc8 commit b6004f3
Show file tree
Hide file tree
Showing 5 changed files with 219 additions and 73 deletions.
32 changes: 18 additions & 14 deletions app/auth/views/oidc.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,29 @@
from flask import request, session, redirect, flash, url_for
from requests_oauthlib import OAuth2Session

import requests

from app import config
from app.auth.base import auth_bp
from app.auth.views.login_utils import after_login
from app.config import (
URL,
OIDC_AUTHORIZATION_URL,
OIDC_USER_INFO_URL,
OIDC_TOKEN_URL,
OIDC_SCOPES,
OIDC_NAME_FIELD,
)
from app.db import Session
from app.email_utils import send_welcome_email
from app.log import LOG
from app.models import User, SocialAuth
from app.utils import encode_url, sanitize_email, sanitize_next_url
from app.utils import sanitize_email, sanitize_next_url


# need to set explicitly redirect_uri instead of leaving the lib to pre-fill redirect_uri
# when served behind nginx, the redirect_uri is localhost... and not the real url
_redirect_uri = URL + "/auth/oidc/callback"
redirect_uri = URL + "/auth/oidc/callback"

SESSION_STATE_KEY = "oauth_state"
SESSION_NEXT_KEY = "oauth_redirect_next"


@auth_bp.route("/oidc/login")
Expand All @@ -32,18 +32,17 @@ def oidc_login():
return redirect(url_for("auth.login"))

next_url = sanitize_next_url(request.args.get("next"))
if next_url:
redirect_uri = _redirect_uri + "?next=" + encode_url(next_url)
else:
redirect_uri = _redirect_uri

auth_url = requests.get(config.OIDC_WELL_KNOWN_URL).json()["authorization_endpoint"]

oidc = OAuth2Session(
config.OIDC_CLIENT_ID, scope=[OIDC_SCOPES], redirect_uri=redirect_uri
)
authorization_url, state = oidc.authorization_url(OIDC_AUTHORIZATION_URL)
authorization_url, state = oidc.authorization_url(auth_url)

# State is used to prevent CSRF, keep this for later.
session[SESSION_STATE_KEY] = state
session[SESSION_NEXT_KEY] = next_url
return redirect(authorization_url)


Expand All @@ -60,19 +59,23 @@ def oidc_callback():
flash("Please use another sign in method then", "warning")
return redirect("/")

oidc_configuration = requests.get(config.OIDC_WELL_KNOWN_URL).json()
user_info_url = oidc_configuration["userinfo_endpoint"]
token_url = oidc_configuration["token_endpoint"]

oidc = OAuth2Session(
config.OIDC_CLIENT_ID,
state=session[SESSION_STATE_KEY],
scope=[OIDC_SCOPES],
redirect_uri=_redirect_uri,
redirect_uri=redirect_uri,
)
oidc.fetch_token(
OIDC_TOKEN_URL,
token_url,
client_secret=config.OIDC_CLIENT_SECRET,
authorization_response=request.url,
)

oidc_user_data = oidc.get(OIDC_USER_INFO_URL)
oidc_user_data = oidc.get(user_info_url)
if oidc_user_data.status_code != 200:
LOG.e(
f"cannot get oidc user data {oidc_user_data.status_code} {oidc_user_data.text}"
Expand Down Expand Up @@ -111,7 +114,8 @@ def oidc_callback():
Session.commit()

# The activation link contains the original page, for ex authorize page
next_url = sanitize_next_url(request.args.get("next")) if request.args else None
next_url = session[SESSION_NEXT_KEY]
session[SESSION_NEXT_KEY] = None

return after_login(user, next_url)

Expand Down
4 changes: 1 addition & 3 deletions app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -245,9 +245,7 @@ def sl_getenv(env_var: str, default_factory: Callable = None):
FACEBOOK_CLIENT_SECRET = os.environ.get("FACEBOOK_CLIENT_SECRET")

CONNECT_WITH_OIDC_ICON = os.environ.get("CONNECT_WITH_OIDC_ICON")
OIDC_AUTHORIZATION_URL = os.environ.get("OIDC_AUTHORIZATION_URL")
OIDC_USER_INFO_URL = os.environ.get("OIDC_USER_INFO_URL")
OIDC_TOKEN_URL = os.environ.get("OIDC_TOKEN_URL")
OIDC_WELL_KNOWN_URL = os.environ.get("OIDC_WELL_KNOWN_URL")
OIDC_CLIENT_ID = os.environ.get("OIDC_CLIENT_ID")
OIDC_CLIENT_SECRET = os.environ.get("OIDC_CLIENT_SECRET")
OIDC_SCOPES = os.environ.get("OIDC_SCOPES")
Expand Down
4 changes: 1 addition & 3 deletions example.env
Original file line number Diff line number Diff line change
Expand Up @@ -118,9 +118,7 @@ WORDS_FILE_PATH=local_data/test_words.txt

# Login with OIDC
# CONNECT_WITH_OIDC_ICON=fa-github
# OIDC_AUTHORIZATION_URL=to_fill
# OIDC_USER_INFO_URL=to_fill
# OIDC_TOKEN_URL=to_fill
# OIDC_WELL_KNOWN_URL=to_fill
# OIDC_SCOPES=openid email profile
# OIDC_NAME_FIELD=name
# OIDC_CLIENT_ID=to_fill
Expand Down

0 comments on commit b6004f3

Please sign in to comment.