Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion kinde_fastapi/framework/fastapi_framework.py
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,15 @@ async def get_current_user():
@self.app.get("/login")
async def login(request: Request):
"""Redirect to Kinde login page."""
url=await self._oauth.login()
# Build login options from query parameters
login_options = {}

# Check for invitation_code in query parameters
invitation_code = request.query_params.get('invitation_code')
if invitation_code:
login_options['invitation_code'] = invitation_code

url = await self._oauth.login(login_options)
self._logger.warning(f"[Login] Session is: {request.session}")
return RedirectResponse(url=url)

Expand Down
11 changes: 10 additions & 1 deletion kinde_flask/framework/flask_framework.py
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,16 @@ def _register_kinde_routes(self) -> None:
def login():
"""Redirect to Kinde login page."""
loop = asyncio.get_event_loop()
login_url = loop.run_until_complete(self._oauth.login())

# Build login options from query parameters
login_options = {}

# Check for invitation_code in query parameters
invitation_code = request.args.get('invitation_code')
if invitation_code:
login_options['invitation_code'] = invitation_code

login_url = loop.run_until_complete(self._oauth.login(login_options))
return redirect(login_url)

# Callback route
Expand Down
4 changes: 4 additions & 0 deletions kinde_sdk/auth/login_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ class LoginOptions:
PLAN_INTEREST = "plan_interest"
PRICING_TABLE_KEY = "pricing_table_key"

# Invitation parameters
INVITATION_CODE = "invitation_code"
IS_INVITATION = "is_invitation"

# Additional parameters container
AUTH_PARAMS = "auth_params"
SUPPORT_RE_AUTH = "supports_reauth"
12 changes: 12 additions & 0 deletions kinde_sdk/auth/oauth.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,9 @@ async def generate_auth_url(
# Registration params
LoginOptions.PLAN_INTEREST: "plan_interest",
LoginOptions.PRICING_TABLE_KEY: "pricing_table_key",
# Invitation params
LoginOptions.INVITATION_CODE: "invitation_code",
LoginOptions.IS_INVITATION: "is_invitation",
# Re-authentication support
LoginOptions.SUPPORT_RE_AUTH: "supports_reauth",
}
Expand Down Expand Up @@ -307,10 +310,19 @@ async def generate_auth_url(
# Handle boolean parameters
if option_key == LoginOptions.IS_CREATE_ORG or option_key == LoginOptions.HAS_SUCCESS_PAGE:
search_params[param_key] = "true" if login_options[option_key] else "false"
elif option_key == LoginOptions.IS_INVITATION:
# Only add is_invitation if it's truthy
if login_options[option_key]:
search_params[param_key] = "true"
else:
# Use string representation for query params
search_params[param_key] = str(login_options[option_key])

# Handle invitation code: automatically set is_invitation to "true" when invitation_code is present
if LoginOptions.INVITATION_CODE in login_options and login_options[LoginOptions.INVITATION_CODE]:
if LoginOptions.IS_INVITATION not in login_options or not login_options[LoginOptions.IS_INVITATION]:
search_params["is_invitation"] = "true"

# Add additional auth parameters
if LoginOptions.AUTH_PARAMS in login_options and isinstance(login_options[LoginOptions.AUTH_PARAMS], dict):
for key, value in login_options[LoginOptions.AUTH_PARAMS].items():
Expand Down