Skip to content

Commit f1c6b36

Browse files
committed
Web3login OAuth2BearerOrSignature middleware
1 parent 42a3160 commit f1c6b36

3 files changed

Lines changed: 8 additions & 54 deletions

File tree

brood/actions.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from sqlalchemy.orm import Query
2020
from sqlalchemy.orm.exc import MultipleResultsFound
2121
from sqlalchemy.orm.session import Session
22-
from web3login.auth import MoonstreamRegistration, to_checksum_address, verify
22+
from web3login.auth import to_checksum_address, verify
2323
from web3login.exceptions import MoonstreamVerificationError
2424

2525
from . import data, exceptions, subscriptions
@@ -461,8 +461,7 @@ def create_user(
461461
if signature is not None:
462462
payload_json = base64.decodebytes(signature.encode()).decode("utf-8")
463463
payload = json.loads(payload_json)
464-
moonstream_schema: Any = MoonstreamRegistration # mypy hell
465-
verified = verify(authorization_payload=payload, schema=moonstream_schema)
464+
verified = verify(authorization_payload=payload, schema="registration")
466465
if not verified:
467466
logger.info("Moonstream registration verification error")
468467
raise MoonstreamVerificationError()

brood/middleware.py

Lines changed: 5 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
import base64
22
import json
33
import logging
4-
from typing import Any, Dict, Optional
4+
from typing import Any, Optional
55
from uuid import UUID
66

77
from fastapi import Depends, HTTPException, Request
88
from fastapi.exceptions import HTTPException
9-
from fastapi.openapi.models import OAuthFlows as OAuthFlowsModel
10-
from fastapi.security import OAuth2
119
from fastapi.security.utils import get_authorization_scheme_param
12-
from starlette.status import HTTP_401_UNAUTHORIZED
13-
from web3login.auth import MoonstreamRegistration, to_checksum_address, verify
10+
from web3login.auth import to_checksum_address, verify
1411
from web3login.exceptions import MoonstreamVerificationError
12+
from web3login.middlewares.fastapi import OAuth2BearerOrSignature
1513

1614
from . import actions, data
1715
from .db import yield_db_read_only_session
@@ -20,47 +18,6 @@
2018
logger = logging.getLogger(__name__)
2119

2220

23-
class OAuth2BearerOrSignature(OAuth2):
24-
"""
25-
Extended FastAPI OAuth2 middleware to support Bearer token
26-
and Moonstream Web3 base64 signature in one request.
27-
"""
28-
29-
def __init__(
30-
self,
31-
tokenUrl: str,
32-
scheme_name: Optional[str] = None,
33-
scopes: Optional[Dict[str, str]] = None,
34-
description: Optional[str] = None,
35-
auto_error: bool = True,
36-
):
37-
if not scopes:
38-
scopes = {}
39-
flows = OAuthFlowsModel(password={"tokenUrl": tokenUrl, "scopes": scopes})
40-
super().__init__(
41-
flows=flows,
42-
scheme_name=scheme_name,
43-
description=description,
44-
auto_error=auto_error,
45-
)
46-
47-
async def __call__(self, request: Request) -> Optional[str]:
48-
authorization: str = request.headers.get("Authorization")
49-
scheme, param = get_authorization_scheme_param(authorization)
50-
if not authorization or (
51-
scheme.lower() != "moonstream" and scheme.lower() != "bearer"
52-
):
53-
if self.auto_error:
54-
raise HTTPException(
55-
status_code=HTTP_401_UNAUTHORIZED,
56-
detail="Not authenticated",
57-
headers={"WWW-Authenticate": "moonstream/bearer"},
58-
)
59-
else:
60-
return None
61-
return param
62-
63-
6421
# Login implementation follows:
6522
# https://fastapi.tiangolo.com/tutorial/security/simple-oauth2/
6623
oauth2_scheme = OAuth2BearerOrSignature(tokenUrl="token")
@@ -85,8 +42,7 @@ async def get_current_user(
8542
if scheme == "moonstream":
8643
payload_json = base64.decodebytes(str(token).encode()).decode("utf-8")
8744
payload = json.loads(payload_json)
88-
moonstream_schema: Any = MoonstreamRegistration # mypy hell
89-
verified = verify(authorization_payload=payload, schema=moonstream_schema)
45+
verified = verify(authorization_payload=payload, schema="registration")
9046
if not verified:
9147
logger.info("Moonstream verification error")
9248
raise MoonstreamVerificationError()
@@ -159,8 +115,7 @@ async def get_current_user_with_groups(
159115
if scheme == "moonstream":
160116
payload_json = base64.decodebytes(str(token).encode()).decode("utf-8")
161117
payload = json.loads(payload_json)
162-
moonstream_schema: Any = MoonstreamRegistration # mypy hell
163-
verified = verify(authorization_payload=payload, schema=moonstream_schema)
118+
verified = verify(authorization_payload=payload, schema="registration")
164119
if not verified:
165120
logger.info("Moonstream authorization verification error")
166121
raise MoonstreamVerificationError()

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"sqlalchemy>=1.4.26",
2323
"stripe>=2.61.0",
2424
"uvicorn>=0.15.0",
25-
"web3login>=0.0.1",
25+
"web3login[fastapi]>=0.0.2",
2626
],
2727
extras_require={
2828
"dev": ["alembic>=1.7.4", "black", "isort", "mypy"],

0 commit comments

Comments
 (0)