[3/3] Guard OAuth exceptions to provide better messages

Message ID 20200728143341.GA564600@tsubame.mg0.fr
State New
Headers show
Series
  • [1/3] Update last login information on SSO login
Related show

Commit Message

Frédéric Mangano-Tarumi July 28, 2020, 2:33 p.m. UTC
---
 aurweb/routers/sso.py | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

Patch

diff --git a/aurweb/routers/sso.py b/aurweb/routers/sso.py
index 817adadb..2e4fbacc 100644
--- a/aurweb/routers/sso.py
+++ b/aurweb/routers/sso.py
@@ -5,7 +5,7 @@  from urllib.parse import urlencode
 
 import fastapi
 
-from authlib.integrations.starlette_client import OAuth
+from authlib.integrations.starlette_client import OAuth, OAuthError
 from fastapi import Depends, HTTPException
 from fastapi.responses import RedirectResponse
 from sqlalchemy.sql import select
@@ -95,8 +95,18 @@  async def authenticate(request: Request, conn=Depends(aurweb.db.connect)):
             detail=_('The login form is currently disabled for your IP address, '
                      'probably due to sustained spam attacks. Sorry for the '
                      'inconvenience.'))
-    token = await oauth.sso.authorize_access_token(request)
-    user = await oauth.sso.parse_id_token(request, token)
+
+    try:
+        token = await oauth.sso.authorize_access_token(request)
+        user = await oauth.sso.parse_id_token(request, token)
+    except OAuthError:
+        # Here, most OAuth errors should be caused by forged or expired tokens.
+        # Let’s give attackers as little information as possible.
+        _ = get_translator_for_request(request)
+        raise HTTPException(
+            status_code=400,
+            detail=_('Bad OAuth token. Please retry logging in from the start.'))
+
     sub = user.get("sub")  # this is the SSO account ID in JWT terminology
     if not sub:
         _ = get_translator_for_request(request)