mirror of
				https://github.com/fastapi-users/fastapi-users.git
				synced 2025-11-04 06:37:51 +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