Spaces:
Sleeping
Sleeping
File size: 5,395 Bytes
10dce96 580c204 43b2fb8 5c827eb 580c204 32ba94f 11f08dd 32ba94f 580c204 0f68bb2 580c204 10dce96 924e5d5 10dce96 11f08dd 924e5d5 10dce96 11f08dd 924e5d5 11f08dd 924e5d5 10dce96 924e5d5 c29d33d 10dce96 924e5d5 10dce96 580c204 10dce96 924e5d5 10dce96 924e5d5 10dce96 924e5d5 10dce96 924e5d5 580c204 924e5d5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
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() |