@@ -162,7 +162,7 @@ def __init__(
162162 if eventsub_secret and not 10 <= len (eventsub_secret ) <= 100 :
163163 raise ValueError ("Eventsub Secret must be between 10 and 100 characters long." )
164164
165- self ._domain : str | None = None
165+ self ._domain : str
166166 self ._proto = "https" if (ssl_keyfile or domain ) else "http"
167167
168168 if domain :
@@ -358,10 +358,12 @@ async def fetch_token(self, request: Request) -> FetchTokenPayload:
358358 if "code" not in request .query_params :
359359 return FetchTokenPayload (400 , response = Response (status_code = 400 , content = "No 'code' parameter provided." ))
360360
361+ redirect = self ._find_redirect (request )
362+
361363 try :
362364 resp : UserTokenPayload = await self .client ._http .user_access_token (
363365 request .query_params ["code" ],
364- redirect_uri = self . redirect_url ,
366+ redirect_uri = redirect ,
365367 )
366368 except HTTPException as e :
367369 logger .error ("Exception raised while fetching Token in <%s>: %s" , self .__class__ .__qualname__ , e )
@@ -380,6 +382,25 @@ async def fetch_token(self, request: Request) -> FetchTokenPayload:
380382 payload = resp ,
381383 )
382384
385+ def _find_redirect (self , request : Request ) -> str :
386+ stripped = self ._domain .removeprefix (f"{ self ._proto } ://" )
387+ local = f"{ self ._proto } ://{ self ._host } "
388+
389+ host = request .url .hostname
390+ scheme = request .url .scheme
391+
392+ if not host :
393+ return self .redirect_url
394+
395+ if host .startswith ((self ._domain , stripped )):
396+ redirect = self .redirect_url
397+ elif host .startswith ((self ._host , local )):
398+ redirect = f"{ local } :{ self ._port } /oauth/callback"
399+ else :
400+ redirect = f"{ scheme } ://{ host } /oauth/callback"
401+
402+ return redirect
403+
383404 async def oauth_callback (self , request : Request ) -> Response :
384405 """Default route callback for the OAuth Authentication redirect URL.
385406
@@ -423,6 +444,7 @@ async def oauth_callback(self, request: Request) -> Response:
423444 async def oauth_redirect (self , request : Request ) -> Response :
424445 scopes : str | None = request .query_params .get ("scopes" , None )
425446 force_verify : bool = request .query_params .get ("force_verify" , "false" ).lower () == "true"
447+ redirect = self ._find_redirect (request )
426448
427449 if not scopes :
428450 scopes = str (self .client ._http .scopes ) if self .client ._http .scopes else None
@@ -439,7 +461,7 @@ async def oauth_redirect(self, request: Request) -> Response:
439461 try :
440462 payload : AuthorizationURLPayload = self .client ._http .get_authorization_url (
441463 scopes = scopes_ ,
442- redirect_uri = self . redirect_url ,
464+ redirect_uri = redirect ,
443465 force_verify = force_verify ,
444466 )
445467 except Exception as e :
0 commit comments