Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import asyncio | |
| from httpx_oauth.clients.google import GoogleOAuth2 | |
| __version__ = "0.1" | |
| async def write_authorization_url(client, redirect_uri): | |
| authorization_url = await client.get_authorization_url( | |
| redirect_uri, | |
| scope=["profile", "email"], | |
| extras_params={"access_type": "offline"}, | |
| ) | |
| return authorization_url | |
| async def write_access_token(client, redirect_uri, code): | |
| token = await client.get_access_token(code, redirect_uri) | |
| return token | |
| async def get_user_info(client, token): | |
| user_id, user_email = await client.get_id_email(token) | |
| return user_id, user_email | |
| async def revoke_token(client, token): | |
| return await client.revoke_token(token) | |
| def login_button(authorization_url, app_name, app_desc): | |
| st.markdown('''<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" | |
| integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">''', | |
| unsafe_allow_html=True) | |
| container = f''' | |
| <div class="container-fluid border py-4 px-4 border-primary"> | |
| <h5><strong>{app_name}</strong></h5> | |
| <p>{app_desc}</p> | |
| <a target="_self" href="{authorization_url}"> | |
| <img class="img-fluid" src="https://i.imgur.com/YTxsnUl.png" alt="streamlit"> | |
| </a> | |
| </div> | |
| ''' | |
| st.markdown(container, unsafe_allow_html=True) | |
| def logout_button(button_text): | |
| if st.button(button_text): | |
| asyncio.run( | |
| revoke_token( | |
| client=st.session_state.client, | |
| token=st.session_state.token["access_token"], | |
| ) | |
| ) | |
| st.session_state.user_email = None | |
| st.session_state.user_id = None | |
| st.session_state.token = None | |
| st.experimental_rerun() | |
| def login( | |
| client_id, | |
| client_secret, | |
| redirect_uri, | |
| app_name="Continue with Google", | |
| app_desc="", | |
| logout_button_text="Logout", | |
| ): | |
| st.session_state.client = GoogleOAuth2(client_id, client_secret) | |
| authorization_url = asyncio.run( | |
| write_authorization_url( | |
| client=st.session_state.client, redirect_uri=redirect_uri | |
| ) | |
| ) | |
| app_desc | |
| if "token" not in st.session_state: | |
| st.session_state.token = None | |
| if st.session_state.token is None: | |
| try: | |
| code = st.experimental_get_query_params()["code"] | |
| except: | |
| login_button(authorization_url, app_name, app_desc) | |
| else: | |
| # Verify token is correct: | |
| try: | |
| token = asyncio.run( | |
| write_access_token( | |
| client=st.session_state.client, | |
| redirect_uri=redirect_uri, | |
| code=code, | |
| ) | |
| ) | |
| except: | |
| login_button(authorization_url, app_name, app_desc) | |
| else: | |
| # Check if token has expired: | |
| if token.is_expired(): | |
| login_button(authorization_url, app_name, app_desc) | |
| else: | |
| st.session_state.token = token | |
| st.session_state.user_id, st.session_state.user_email = asyncio.run( | |
| get_user_info( | |
| client=st.session_state.client, token=token["access_token"] | |
| ) | |
| ) | |
| logout_button(button_text=logout_button_text) | |
| return (st.session_state.user_id, st.session_state.user_email) | |
| else: | |
| logout_button(button_text=logout_button_text) | |
| return (st.session_state.user_id, st.session_state.user_email) | |