* Added a failing test for the multi-oauth-router issue

* Fixed the #823 regression.

Using a regex for the backend name validation instead of an enum.

* Fixed formatting errors

* Moved the `AuthenticationBackendName` enum to `Authenticator`

This prevents an issue with OpenAPI schema generation caused by two
endpoints accepting a parameter with a duplicate name.
This commit is contained in:
Matyáš Richter
2021-12-29 13:25:15 +01:00
committed by GitHub
parent e0ae193848
commit 2e8f1f2eb2
3 changed files with 26 additions and 7 deletions

View File

@ -1,3 +1,4 @@
import enum
import re
from inspect import Parameter, Signature
from typing import Callable, Optional, Sequence
@ -42,6 +43,7 @@ class Authenticator:
"""
backends: Sequence[BaseAuthentication]
backends_enum: enum.Enum
def __init__(
self,
@ -49,6 +51,10 @@ class Authenticator:
get_user_manager: UserManagerDependency[models.UC, models.UD],
):
self.backends = backends
self.backends_enum = enum.Enum( # type: ignore
"AuthenticationBackendName",
{backend.name: backend.name for backend in backends}, # type: ignore
)
self.get_user_manager = get_user_manager
def current_user(

View File

@ -1,4 +1,3 @@
import enum
from typing import Dict, List
import jwt
@ -44,11 +43,6 @@ def get_oauth_router(
route_name=callback_route_name,
)
AuthenticationBackendName: enum.EnumMeta = enum.Enum(
"AuthenticationBackendName",
{backend.name: backend.name for backend in authenticator.backends},
)
@router.get(
"/authorize",
name="oauth:authorize",
@ -56,7 +50,7 @@ def get_oauth_router(
)
async def authorize(
request: Request,
authentication_backend: AuthenticationBackendName,
authentication_backend: authenticator.backends_enum, # type: ignore
scopes: List[str] = Query(None),
):
if redirect_url is not None:

View File

@ -1,6 +1,7 @@
import pytest
from fastapi import FastAPI
from fastapi.testclient import TestClient
from httpx_oauth.clients.facebook import FacebookOAuth2
from httpx_oauth.clients.google import GoogleOAuth2
import fastapi_users.authentication
@ -134,3 +135,21 @@ class TestOAuth2:
def test_google_callback_status_codes(self, get_openapi_dict):
route = get_openapi_dict["paths"]["/callback"]["get"]
assert list(route["responses"].keys()) == ["200", "400", "422"]
def test_two_oauth_routers(self):
a = FastAPI()
a.include_router(
users.get_oauth_router(
GoogleOAuth2(client_id="1234", client_secret="4321"),
state_secret="secret",
),
prefix="/google",
)
a.include_router(
users.get_oauth_router(
FacebookOAuth2(client_id="1234", client_secret="4321"),
state_secret="secret",
),
prefix="/facebook",
)
assert TestClient(a).get("/openapi.json").status_code == 200