about summary refs log tree commit diff
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2023-01-04 06:53:16 +0300
committerFrederick Muriuki Muriithi2023-01-04 06:53:16 +0300
commitc86e31aa617c7386fe7f8aee8aafa21e904a07ea (patch)
treeec27d6fce8fe83dd61597dc024c4e58eb07bcbcb
parentbb19d605c30a3dd473c4a6e11a8b2022aca66b3f (diff)
downloadgenenetwork2-c86e31aa617c7386fe7f8aee8aafa21e904a07ea.tar.gz
auth: Add `/user-profile` endpoint
Display some details for the currently logged in user at the
`/user-profile` endpoint.
-rw-r--r--wqflask/wqflask/oauth2/routes.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/wqflask/wqflask/oauth2/routes.py b/wqflask/wqflask/oauth2/routes.py
index a94d919b..deb540e8 100644
--- a/wqflask/wqflask/oauth2/routes.py
+++ b/wqflask/wqflask/oauth2/routes.py
@@ -1,6 +1,7 @@
 """Routes for the OAuth2 auth system in GN3"""
 from urllib.parse import urljoin
 
+from pymonad.maybe import Just, Maybe, Nothing
 from authlib.integrations.requests_client import OAuth2Session
 from authlib.integrations.base_client.errors import OAuthError
 from flask import (
@@ -11,6 +12,27 @@ from .checks import require_oauth2, user_logged_in
 
 oauth2 = Blueprint("oauth2", __name__)
 
+def get_endpoint(uri_path: str) -> Maybe:
+    token = session.get("oauth2_token", False)
+    if token and not bool(session.get("user_details", False)):
+        config = app.config
+        client = OAuth2Session(
+            config["OAUTH2_CLIENT_ID"], config["OAUTH2_CLIENT_SECRET"],
+            token=token)
+        resp = client.get(
+            urljoin(config["GN_SERVER_URL"], uri_path))
+        resp_json = resp.json()
+
+        if resp_json.get("error") == "invalid_token":
+            flash(resp_json["error_description"], "alert-danger")
+            flash("You are now logged out.", "alert-info")
+            session.pop("oauth2_token", None)
+            return Nothing
+
+        return Just(resp_json)
+
+    return Nothing
+
 @oauth2.route("/login", methods=["GET", "POST"])
 def login():
     """Route to allow users to sign up."""
@@ -55,3 +77,15 @@ def logout():
 def register_client():
     """Register an OAuth2 client."""
     return "USER IS LOGGED IN AND SUCCESSFULLY ACCESSED THIS ENDPOINT!"
+
+@oauth2.route("/user-profile", methods=["GET"])
+@require_oauth2
+def user_profile():
+    __id__ = lambda the_val: the_val
+    user_details = session.get("user_details", False) or get_endpoint(
+        "oauth2/user").maybe(False, __id__)
+    roles = get_endpoint("oauth/user-roles").maybe([], __id__)
+    resources = []
+    return render_template(
+        "oauth2/view-user.html", user_details=user_details, roles=roles,
+        resources=resources)