mirror of
https://github.com/fastapi-users/fastapi-users.git
synced 2025-11-07 00:19:10 +08:00
* 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:
@ -1,3 +1,4 @@
|
|||||||
|
import enum
|
||||||
import re
|
import re
|
||||||
from inspect import Parameter, Signature
|
from inspect import Parameter, Signature
|
||||||
from typing import Callable, Optional, Sequence
|
from typing import Callable, Optional, Sequence
|
||||||
@ -42,6 +43,7 @@ class Authenticator:
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
backends: Sequence[BaseAuthentication]
|
backends: Sequence[BaseAuthentication]
|
||||||
|
backends_enum: enum.Enum
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
@ -49,6 +51,10 @@ class Authenticator:
|
|||||||
get_user_manager: UserManagerDependency[models.UC, models.UD],
|
get_user_manager: UserManagerDependency[models.UC, models.UD],
|
||||||
):
|
):
|
||||||
self.backends = backends
|
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
|
self.get_user_manager = get_user_manager
|
||||||
|
|
||||||
def current_user(
|
def current_user(
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import enum
|
|
||||||
from typing import Dict, List
|
from typing import Dict, List
|
||||||
|
|
||||||
import jwt
|
import jwt
|
||||||
@ -44,11 +43,6 @@ def get_oauth_router(
|
|||||||
route_name=callback_route_name,
|
route_name=callback_route_name,
|
||||||
)
|
)
|
||||||
|
|
||||||
AuthenticationBackendName: enum.EnumMeta = enum.Enum(
|
|
||||||
"AuthenticationBackendName",
|
|
||||||
{backend.name: backend.name for backend in authenticator.backends},
|
|
||||||
)
|
|
||||||
|
|
||||||
@router.get(
|
@router.get(
|
||||||
"/authorize",
|
"/authorize",
|
||||||
name="oauth:authorize",
|
name="oauth:authorize",
|
||||||
@ -56,7 +50,7 @@ def get_oauth_router(
|
|||||||
)
|
)
|
||||||
async def authorize(
|
async def authorize(
|
||||||
request: Request,
|
request: Request,
|
||||||
authentication_backend: AuthenticationBackendName,
|
authentication_backend: authenticator.backends_enum, # type: ignore
|
||||||
scopes: List[str] = Query(None),
|
scopes: List[str] = Query(None),
|
||||||
):
|
):
|
||||||
if redirect_url is not None:
|
if redirect_url is not None:
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
import pytest
|
import pytest
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
from fastapi.testclient import TestClient
|
from fastapi.testclient import TestClient
|
||||||
|
from httpx_oauth.clients.facebook import FacebookOAuth2
|
||||||
from httpx_oauth.clients.google import GoogleOAuth2
|
from httpx_oauth.clients.google import GoogleOAuth2
|
||||||
|
|
||||||
import fastapi_users.authentication
|
import fastapi_users.authentication
|
||||||
@ -134,3 +135,21 @@ class TestOAuth2:
|
|||||||
def test_google_callback_status_codes(self, get_openapi_dict):
|
def test_google_callback_status_codes(self, get_openapi_dict):
|
||||||
route = get_openapi_dict["paths"]["/callback"]["get"]
|
route = get_openapi_dict["paths"]["/callback"]["get"]
|
||||||
assert list(route["responses"].keys()) == ["200", "400", "422"]
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user