Spaces:
Sleeping
Sleeping
import streamlit as st | |
import firebase_admin | |
from firebase_admin import credentials, auth, db | |
import os | |
import json | |
# Load Firebase credentials from Hugging Face Secrets | |
firebase_creds = os.getenv("FIREBASE_CREDENTIALS") | |
FIREBASE_API_KEY = os.getenv("FIREBASE_API_KEY") | |
if firebase_creds: | |
firebase_creds = json.loads(firebase_creds) | |
else: | |
st.error("Firebase credentials not found. Please check your secrets.") | |
# Initialize Firebase (only once) | |
if not firebase_admin._apps: | |
cred = credentials.Certificate(firebase_creds) # Replace with your Firebase service account key | |
firebase_admin.initialize_app(cred, { | |
'databaseURL': 'https://creative-623ef-default-rtdb.firebaseio.com/' # Replace with your Firebase Realtime Database URL | |
}) | |
# Initialize session state | |
if "logged_in" not in st.session_state: | |
st.session_state.logged_in = False | |
if "current_user" not in st.session_state: | |
st.session_state.current_user = None | |
def send_verification_email(id_token): | |
url = f'https://identitytoolkit.googleapis.com/v1/accounts:sendOobCode?key={FIREBASE_API_KEY}' | |
headers = {'Content-Type': 'application/json'} | |
data = { | |
'requestType': 'VERIFY_EMAIL', | |
'idToken': id_token | |
} | |
response = requests.post(url, headers=headers, json=data) | |
result = response.json() | |
if 'error' in result: | |
return {'status': 'error', 'message': result['error']['message']} | |
else: | |
return {'status': 'success', 'email': result['email']} | |
# Callback for registration | |
def register_callback(): | |
email = st.session_state.reg_email | |
password = st.session_state.reg_password | |
try: | |
# Step 1: Create a new user in Firebase | |
user = auth.create_user(email=email, password=password) | |
st.success("Registration successful! Sending verification email...") | |
# Step 2: Sign in the user programmatically to get the id_token | |
url = f'https://identitytoolkit.googleapis.com/v1/accounts:signInWithPassword?key={FIREBASE_API_KEY}' | |
data = { | |
'email': email, | |
'password': password, | |
'returnSecureToken': True | |
} | |
response = requests.post(url, json=data) | |
result = response.json() | |
if 'idToken' in result: | |
id_token = result['idToken'] # Retrieve the id_token | |
st.session_state.id_token = id_token # Store the id_token in session state | |
# Step 3: Send the verification email | |
verification_result = send_verification_email(id_token) | |
if verification_result['status'] == 'success': | |
st.success(f"Verification email sent to {email}.") | |
else: | |
st.error(f"Failed to send verification email: {verification_result['message']}") | |
else: | |
st.error(f"Failed to retrieve id_token: {result['error']['message']}") | |
except Exception as e: | |
st.error(f"Registration failed: {e}") | |
# Callback for login | |
def login_callback(): | |
email = st.session_state.login_email | |
password = st.session_state.login_password | |
try: | |
# Authenticate user with Firebase | |
user = auth.get_user_by_email(email) | |
st.session_state.logged_in = True | |
st.session_state.current_user = user.uid # Store the user UID in session state | |
st.success("Logged in successfully!") | |
except Exception as e: | |
st.error(f"Login failed: {e}") | |
# Callback for logout | |
def logout_callback(): | |
st.session_state.logged_in = False | |
st.session_state.current_user = None | |
st.info("Logged out successfully!") | |
# Function to store text in Firebase Realtime Database | |
def store_text_in_db(user_id, text): | |
try: | |
ref = db.reference(f'users/{user_id}/texts') | |
new_text_ref = ref.push() | |
new_text_ref.set({ | |
'text': text, | |
'timestamp': firebase_admin.db.ServerValue.TIMESTAMP | |
}) | |
st.success("Text saved successfully!") | |
except Exception as e: | |
st.error(f"Failed to save text: {e}") | |
# Registration form | |
def registration_form(): | |
with st.form("Registration"): | |
st.subheader("Register") | |
email = st.text_input("Email", key="reg_email") | |
password = st.text_input("Password (min 6 characters)", type="password", key="reg_password") | |
submit_button = st.form_submit_button("Register", on_click=register_callback) | |
# Login form | |
def login_form(): | |
with st.form("Login"): | |
st.subheader("Login") | |
email = st.text_input("Email", key="login_email") | |
password = st.text_input("Password", type="password", key="login_password") | |
submit_button = st.form_submit_button("Login", on_click=login_callback) | |
# Main app screen (after login) | |
def main_app(): | |
st.subheader(f"Welcome, {st.session_state.current_user}!") | |
st.write("Enter a name below to get a greeting.") | |
# Input field for name | |
name = st.text_input("Enter a name", key="name_input") | |
# Display greeting in real-time | |
if name: | |
st.write(f"Hello {name}!") | |
# Store the entered text in Firebase Realtime Database | |
store_text_in_db(st.session_state.current_user, name) | |
# Logout button | |
if st.button("Logout", on_click=logout_callback): | |
pass | |
# Render the appropriate screen based on login status | |
if st.session_state.logged_in: | |
main_app() | |
else: | |
registration_form() | |
login_form() |