creative2 / app.py
artintel235's picture
Update app.py
11f08dd verified
raw
history blame
5.4 kB
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()