Spaces:
Sleeping
Sleeping
import streamlit as st | |
from google_auth_oauthlib.flow import InstalledAppFlow | |
from googleapiclient.discovery import build | |
from google.auth.transport.requests import Request | |
from googleapiclient.errors import HttpError | |
import pickle | |
import os | |
import hashlib | |
# Constants | |
CREDS_FILE = 'token.pickle' | |
CREDENTIALS_FILE = 'details.json' | |
SCOPES = ['https://www.googleapis.com/auth/spreadsheets'] | |
SPREADSHEET_ID = "17KIBySu21Oh0ajtyo4A9jUTjnwOIl69KlqNlTfszrXQ" | |
RANGE_NAME = "Sheet1!A:C" | |
# Google Sheets API setup with OAuth | |
def get_gsheet_service(creds): | |
try: | |
service = build('sheets', 'v4', credentials=creds) | |
return service | |
except HttpError as err: | |
st.error(f"Failed to create service: {err}") | |
return None | |
def append_data_to_sheet(service, spreadsheet_id, range_name, values): | |
try: | |
body = { | |
'values': values | |
} | |
result = service.spreadsheets().values().append( | |
spreadsheetId=spreadsheet_id, | |
range=range_name, | |
valueInputOption="RAW", | |
body=body | |
).execute() | |
return result | |
except HttpError as err: | |
st.error(f"Failed to append data: {err}") | |
return None | |
def read_data_from_sheet(service, spreadsheet_id, range_name): | |
try: | |
result = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range_name).execute() | |
return result.get('values', []) | |
except HttpError as err: | |
st.error(f"Failed to read data: {err}") | |
return [] | |
# Function to hash passwords | |
def hash_password(password): | |
return hashlib.sha256(password.encode()).hexdigest() | |
# OAuth flow setup | |
def get_credentials(): | |
if os.path.exists(CREDS_FILE): | |
with open(CREDS_FILE, 'rb') as token: | |
creds = pickle.load(token) | |
if creds and creds.valid: | |
return creds | |
if creds and creds.expired and creds.refresh_token: | |
creds.refresh(Request()) | |
with open(CREDS_FILE, 'wb') as token: | |
pickle.dump(creds, token) | |
return creds | |
flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES) | |
creds = flow.run_local_server(port=0) | |
with open(CREDS_FILE, 'wb') as token: | |
pickle.dump(creds, token) | |
return creds | |
# Sign Up Page | |
def signup(service): | |
st.subheader("Sign Up") | |
with st.form(key='signup_form'): | |
new_username = st.text_input("Username") | |
new_password = st.text_input("Password", type="password") | |
signup_button = st.form_submit_button("Sign Up") | |
if signup_button: | |
if new_username and new_password: | |
# Check if username already exists | |
user_data = read_data_from_sheet(service, SPREADSHEET_ID, RANGE_NAME) | |
for user in user_data: | |
if user[0] == new_username: | |
st.error("Username already exists. Please choose a different username.") | |
return | |
# Hash the password | |
hashed_password = hash_password(new_password) | |
# Store the username and hashed password | |
values = [[new_username, hashed_password]] | |
result = append_data_to_sheet(service, SPREADSHEET_ID, RANGE_NAME, values) | |
if result: | |
st.success("Signup successful! Please go to the login page.") | |
else: | |
st.error("Failed to sign up.") | |
else: | |
st.error("Please provide both a username and password.") | |
# Login Page | |
def login(service): | |
st.subheader("Login") | |
with st.form(key='login_form'): | |
username = st.text_input("Username") | |
password = st.text_input("Password", type="password") | |
login_button = st.form_submit_button("Login") | |
if login_button: | |
if username and password: | |
# Hash the password | |
hashed_password = hash_password(password) | |
# Read data from Google Sheets | |
user_data = read_data_from_sheet(service, SPREADSHEET_ID, RANGE_NAME) | |
# Verify login credentials | |
for user in user_data: | |
if user[0] == username and user[1] == hashed_password: | |
st.success("Login successful!") | |
return True | |
st.error("Invalid username or password.") | |
else: | |
st.error("Please enter both username and password.") | |
return False | |
# Streamlit app | |
def main(): | |
st.title("Google Sheets Authentication System") | |
# Get OAuth credentials | |
creds = get_credentials() | |
# Create a service object | |
service = get_gsheet_service(creds) | |
if service: | |
# Choose between login and signup | |
page = st.sidebar.selectbox("Choose a page", ["Login", "Signup"]) | |
if page == "Login": | |
logged_in = login(service) | |
if logged_in: | |
st.write("You are logged in! You can add more functionality here.") | |
elif page == "Signup": | |
signup(service) | |
else: | |
st.error("Failed to create the service.") | |
if __name__ == "__main__": | |
main() | |