@@ -162,7 +162,7 @@ def __init__(
162
162
if eventsub_secret and not 10 <= len (eventsub_secret ) <= 100 :
163
163
raise ValueError ("Eventsub Secret must be between 10 and 100 characters long." )
164
164
165
- self ._domain : str | None = None
165
+ self ._domain : str
166
166
self ._proto = "https" if (ssl_keyfile or domain ) else "http"
167
167
168
168
if domain :
@@ -358,10 +358,12 @@ async def fetch_token(self, request: Request) -> FetchTokenPayload:
358
358
if "code" not in request .query_params :
359
359
return FetchTokenPayload (400 , response = Response (status_code = 400 , content = "No 'code' parameter provided." ))
360
360
361
+ redirect = self ._find_redirect (request )
362
+
361
363
try :
362
364
resp : UserTokenPayload = await self .client ._http .user_access_token (
363
365
request .query_params ["code" ],
364
- redirect_uri = self . redirect_url ,
366
+ redirect_uri = redirect ,
365
367
)
366
368
except HTTPException as e :
367
369
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:
380
382
payload = resp ,
381
383
)
382
384
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
+
383
404
async def oauth_callback (self , request : Request ) -> Response :
384
405
"""Default route callback for the OAuth Authentication redirect URL.
385
406
@@ -423,6 +444,7 @@ async def oauth_callback(self, request: Request) -> Response:
423
444
async def oauth_redirect (self , request : Request ) -> Response :
424
445
scopes : str | None = request .query_params .get ("scopes" , None )
425
446
force_verify : bool = request .query_params .get ("force_verify" , "false" ).lower () == "true"
447
+ redirect = self ._find_redirect (request )
426
448
427
449
if not scopes :
428
450
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:
439
461
try :
440
462
payload : AuthorizationURLPayload = self .client ._http .get_authorization_url (
441
463
scopes = scopes_ ,
442
- redirect_uri = self . redirect_url ,
464
+ redirect_uri = redirect ,
443
465
force_verify = force_verify ,
444
466
)
445
467
except Exception as e :
0 commit comments