Skip to content

Commit 336fc05

Browse files
author
Koman Rudden
committed
feat: add invitation code support to OAuth login flow
1 parent 7deb113 commit 336fc05

4 files changed

Lines changed: 35 additions & 2 deletions

File tree

kinde_fastapi/framework/fastapi_framework.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,15 @@ async def get_current_user():
131131
@self.app.get("/login")
132132
async def login(request: Request):
133133
"""Redirect to Kinde login page."""
134-
url=await self._oauth.login()
134+
# Build login options from query parameters
135+
login_options = {}
136+
137+
# Check for invitation_code in query parameters
138+
invitation_code = request.query_params.get('invitation_code')
139+
if invitation_code:
140+
login_options['invitation_code'] = invitation_code
141+
142+
url = await self._oauth.login(login_options)
135143
self._logger.warning(f"[Login] Session is: {request.session}")
136144
return RedirectResponse(url=url)
137145

kinde_flask/framework/flask_framework.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,16 @@ def _register_kinde_routes(self) -> None:
127127
def login():
128128
"""Redirect to Kinde login page."""
129129
loop = asyncio.get_event_loop()
130-
login_url = loop.run_until_complete(self._oauth.login())
130+
131+
# Build login options from query parameters
132+
login_options = {}
133+
134+
# Check for invitation_code in query parameters
135+
invitation_code = request.args.get('invitation_code')
136+
if invitation_code:
137+
login_options['invitation_code'] = invitation_code
138+
139+
login_url = loop.run_until_complete(self._oauth.login(login_options))
131140
return redirect(login_url)
132141

133142
# Callback route

kinde_sdk/auth/login_options.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class LoginOptions:
2727
PLAN_INTEREST = "plan_interest"
2828
PRICING_TABLE_KEY = "pricing_table_key"
2929

30+
# Invitation parameters
31+
INVITATION_CODE = "invitation_code"
32+
IS_INVITATION = "is_invitation"
33+
3034
# Additional parameters container
3135
AUTH_PARAMS = "auth_params"
3236
SUPPORT_RE_AUTH = "supports_reauth"

kinde_sdk/auth/oauth.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,9 @@ async def generate_auth_url(
280280
# Registration params
281281
LoginOptions.PLAN_INTEREST: "plan_interest",
282282
LoginOptions.PRICING_TABLE_KEY: "pricing_table_key",
283+
# Invitation params
284+
LoginOptions.INVITATION_CODE: "invitation_code",
285+
LoginOptions.IS_INVITATION: "is_invitation",
283286
# Re-authentication support
284287
LoginOptions.SUPPORT_RE_AUTH: "supports_reauth",
285288
}
@@ -307,10 +310,19 @@ async def generate_auth_url(
307310
# Handle boolean parameters
308311
if option_key == LoginOptions.IS_CREATE_ORG or option_key == LoginOptions.HAS_SUCCESS_PAGE:
309312
search_params[param_key] = "true" if login_options[option_key] else "false"
313+
elif option_key == LoginOptions.IS_INVITATION:
314+
# Only add is_invitation if it's truthy
315+
if login_options[option_key]:
316+
search_params[param_key] = "true"
310317
else:
311318
# Use string representation for query params
312319
search_params[param_key] = str(login_options[option_key])
313320

321+
# Handle invitation code: automatically set is_invitation to "true" when invitation_code is present
322+
if LoginOptions.INVITATION_CODE in login_options and login_options[LoginOptions.INVITATION_CODE]:
323+
if LoginOptions.IS_INVITATION not in login_options or not login_options[LoginOptions.IS_INVITATION]:
324+
search_params["is_invitation"] = "true"
325+
314326
# Add additional auth parameters
315327
if LoginOptions.AUTH_PARAMS in login_options and isinstance(login_options[LoginOptions.AUTH_PARAMS], dict):
316328
for key, value in login_options[LoginOptions.AUTH_PARAMS].items():

0 commit comments

Comments
 (0)