Rahulk2197 commited on
Commit
85964d8
·
verified ·
1 Parent(s): 09d9057

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +164 -154
app.py CHANGED
@@ -1,154 +1,164 @@
1
- import streamlit as st
2
- from google_auth_oauthlib.flow import InstalledAppFlow
3
- from googleapiclient.discovery import build
4
- from googleapiclient.errors import HttpError
5
- import pickle
6
- import os
7
- import hashlib
8
-
9
- # Constants
10
- CREDS_FILE = 'token.pickle'
11
- CREDENTIALS_FILE = 'details.json'
12
- SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
13
- SPREADSHEET_ID = "17KIBySu21Oh0ajtyo4A9jUTjnwOIl69KlqNlTfszrXQ"
14
- RANGE_NAME = "Sheet1!A:C"
15
-
16
- # Google Sheets API setup with OAuth
17
- def get_gsheet_service(creds):
18
- try:
19
- service = build('sheets', 'v4', credentials=creds)
20
- return service
21
- except HttpError as err:
22
- st.error(f"Failed to create service: {err}")
23
- return None
24
-
25
- def append_data_to_sheet(service, spreadsheet_id, range_name, values):
26
- try:
27
- body = {
28
- 'values': values
29
- }
30
- result = service.spreadsheets().values().append(
31
- spreadsheetId=spreadsheet_id,
32
- range=range_name,
33
- valueInputOption="RAW",
34
- body=body
35
- ).execute()
36
- return result
37
- except HttpError as err:
38
- st.error(f"Failed to append data: {err}")
39
- return None
40
-
41
- def read_data_from_sheet(service, spreadsheet_id, range_name):
42
- try:
43
- result = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range_name).execute()
44
- return result.get('values', [])
45
- except HttpError as err:
46
- st.error(f"Failed to read data: {err}")
47
- return []
48
-
49
- # Function to hash passwords
50
- def hash_password(password):
51
- return hashlib.sha256(password.encode()).hexdigest()
52
-
53
- # OAuth flow setup
54
- def get_credentials():
55
- if os.path.exists(CREDS_FILE):
56
- with open(CREDS_FILE, 'rb') as token:
57
- creds = pickle.load(token)
58
- if creds and creds.valid:
59
- return creds
60
- if creds and creds.expired and creds.refresh_token:
61
- creds.refresh(Request())
62
- with open(CREDS_FILE, 'wb') as token:
63
- pickle.dump(creds, token)
64
- return creds
65
- flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES)
66
- creds = flow.run_local_server(port=0)
67
- with open(CREDS_FILE, 'wb') as token:
68
- pickle.dump(creds, token)
69
- return creds
70
-
71
- # Sign Up Page
72
- def signup(service):
73
- st.subheader("Sign Up")
74
-
75
- with st.form(key='signup_form'):
76
- new_username = st.text_input("Username")
77
- new_password = st.text_input("Password", type="password")
78
- signup_button = st.form_submit_button("Sign Up")
79
-
80
- if signup_button:
81
- if new_username and new_password:
82
- # Check if username already exists
83
- user_data = read_data_from_sheet(service, SPREADSHEET_ID, RANGE_NAME)
84
- for user in user_data:
85
- if user[0] == new_username:
86
- st.error("Username already exists. Please choose a different username.")
87
- return
88
-
89
- # Hash the password
90
- hashed_password = hash_password(new_password)
91
-
92
- # Store the username and hashed password
93
- values = [[new_username, hashed_password]]
94
- result = append_data_to_sheet(service, SPREADSHEET_ID, RANGE_NAME, values)
95
-
96
- if result:
97
- st.success("Signup successful! Please go to the login page.")
98
- else:
99
- st.error("Failed to sign up.")
100
- else:
101
- st.error("Please provide both a username and password.")
102
-
103
- # Login Page
104
- def login(service):
105
- st.subheader("Login")
106
-
107
- with st.form(key='login_form'):
108
- username = st.text_input("Username")
109
- password = st.text_input("Password", type="password")
110
- login_button = st.form_submit_button("Login")
111
-
112
- if login_button:
113
- if username and password:
114
- # Hash the password
115
- hashed_password = hash_password(password)
116
-
117
- # Read data from Google Sheets
118
- user_data = read_data_from_sheet(service, SPREADSHEET_ID, RANGE_NAME)
119
-
120
- # Verify login credentials
121
- for user in user_data:
122
- if user[0] == username and user[1] == hashed_password:
123
- st.success("Login successful!")
124
- return True
125
- st.error("Invalid username or password.")
126
- else:
127
- st.error("Please enter both username and password.")
128
- return False
129
-
130
- # Streamlit app
131
- def main():
132
- st.title("Google Sheets Authentication System")
133
-
134
- # Get OAuth credentials
135
- creds = get_credentials()
136
-
137
- # Create a service object
138
- service = get_gsheet_service(creds)
139
-
140
- if service:
141
- # Choose between login and signup
142
- page = st.sidebar.selectbox("Choose a page", ["Login", "Signup"])
143
-
144
- if page == "Login":
145
- logged_in = login(service)
146
- if logged_in:
147
- st.write("You are logged in! You can add more functionality here.")
148
- elif page == "Signup":
149
- signup(service)
150
- else:
151
- st.error("Failed to create the service.")
152
-
153
- if __name__ == "__main__":
154
- main()
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pickle
3
+ from google_auth_oauthlib.flow import InstalledAppFlow
4
+ from google.auth.transport.requests import Request
5
+ import streamlit as st
6
+ import hashlib
7
+ from googleapiclient.discovery import build
8
+ from googleapiclient.errors import HttpError
9
+
10
+ # Constants
11
+ CREDS_FILE = 'token.pickle'
12
+ CREDENTIALS_FILE = 'details.json'
13
+ SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
14
+ SPREADSHEET_ID = "17KIBySu21Oh0ajtyo4A9jUTjnwOIl69KlqNlTfszrXQ"
15
+ RANGE_NAME = "Sheet1!A:C"
16
+
17
+ # Google Sheets API setup with OAuth
18
+ def get_gsheet_service(creds):
19
+ try:
20
+ service = build('sheets', 'v4', credentials=creds)
21
+ return service
22
+ except HttpError as err:
23
+ st.error(f"Failed to create service: {err}")
24
+ return None
25
+
26
+ def append_data_to_sheet(service, spreadsheet_id, range_name, values):
27
+ try:
28
+ body = {
29
+ 'values': values
30
+ }
31
+ result = service.spreadsheets().values().append(
32
+ spreadsheetId=spreadsheet_id,
33
+ range=range_name,
34
+ valueInputOption="RAW",
35
+ body=body
36
+ ).execute()
37
+ return result
38
+ except HttpError as err:
39
+ st.error(f"Failed to append data: {err}")
40
+ return None
41
+
42
+ def read_data_from_sheet(service, spreadsheet_id, range_name):
43
+ try:
44
+ result = service.spreadsheets().values().get(spreadsheetId=spreadsheet_id, range=range_name).execute()
45
+ return result.get('values', [])
46
+ except HttpError as err:
47
+ st.error(f"Failed to read data: {err}")
48
+ return []
49
+
50
+ # Function to hash passwords
51
+ def hash_password(password):
52
+ return hashlib.sha256(password.encode()).hexdigest()
53
+
54
+ # OAuth flow setup
55
+ def get_credentials():
56
+ if os.path.exists(CREDS_FILE):
57
+ with open(CREDS_FILE, 'rb') as token:
58
+ creds = pickle.load(token)
59
+ if creds and creds.valid:
60
+ return creds
61
+ if creds and creds.expired and creds.refresh_token:
62
+ creds.refresh(Request())
63
+ with open(CREDS_FILE, 'wb') as token:
64
+ pickle.dump(creds, token)
65
+ return creds
66
+
67
+ flow = InstalledAppFlow.from_client_secrets_file(CREDENTIALS_FILE, SCOPES)
68
+ auth_url, _ = flow.authorization_url(prompt='consent') # Generate authorization URL
69
+ st.write(f"Please go to this URL to authorize: [Authorize URL]({auth_url})")
70
+
71
+ # Prompt the user to input the authorization code
72
+ code = st.text_input("Enter the authorization code")
73
+
74
+ if code:
75
+ creds = flow.fetch_token(code=code) # Exchange authorization code for tokens
76
+ with open(CREDS_FILE, 'wb') as token:
77
+ pickle.dump(creds, token)
78
+ return creds
79
+ return None
80
+
81
+ # Sign Up Page
82
+ def signup(service):
83
+ st.subheader("Sign Up")
84
+
85
+ with st.form(key='signup_form'):
86
+ new_username = st.text_input("Username")
87
+ new_password = st.text_input("Password", type="password")
88
+ signup_button = st.form_submit_button("Sign Up")
89
+
90
+ if signup_button:
91
+ if new_username and new_password:
92
+ # Check if username already exists
93
+ user_data = read_data_from_sheet(service, SPREADSHEET_ID, RANGE_NAME)
94
+ for user in user_data:
95
+ if user[0] == new_username:
96
+ st.error("Username already exists. Please choose a different username.")
97
+ return
98
+
99
+ # Hash the password
100
+ hashed_password = hash_password(new_password)
101
+
102
+ # Store the username and hashed password
103
+ values = [[new_username, hashed_password]]
104
+ result = append_data_to_sheet(service, SPREADSHEET_ID, RANGE_NAME, values)
105
+
106
+ if result:
107
+ st.success("Signup successful! Please go to the login page.")
108
+ else:
109
+ st.error("Failed to sign up.")
110
+ else:
111
+ st.error("Please provide both a username and password.")
112
+
113
+ # Login Page
114
+ def login(service):
115
+ st.subheader("Login")
116
+
117
+ with st.form(key='login_form'):
118
+ username = st.text_input("Username")
119
+ password = st.text_input("Password", type="password")
120
+ login_button = st.form_submit_button("Login")
121
+
122
+ if login_button:
123
+ if username and password:
124
+ # Hash the password
125
+ hashed_password = hash_password(password)
126
+
127
+ # Read data from Google Sheets
128
+ user_data = read_data_from_sheet(service, SPREADSHEET_ID, RANGE_NAME)
129
+
130
+ # Verify login credentials
131
+ for user in user_data:
132
+ if user[0] == username and user[1] == hashed_password:
133
+ st.success("Login successful!")
134
+ return True
135
+ st.error("Invalid username or password.")
136
+ else:
137
+ st.error("Please enter both username and password.")
138
+ return False
139
+
140
+ # Streamlit app
141
+ def main():
142
+ st.title("Google Sheets Authentication System")
143
+
144
+ # Get OAuth credentials
145
+ creds = get_credentials()
146
+
147
+ # Create a service object
148
+ service = get_gsheet_service(creds)
149
+
150
+ if service:
151
+ # Choose between login and signup
152
+ page = st.sidebar.selectbox("Choose a page", ["Login", "Signup"])
153
+
154
+ if page == "Login":
155
+ logged_in = login(service)
156
+ if logged_in:
157
+ st.write("You are logged in! You can add more functionality here.")
158
+ elif page == "Signup":
159
+ signup(service)
160
+ else:
161
+ st.error("Failed to create the service.")
162
+
163
+ if __name__ == "__main__":
164
+ main()