Spaces:
Sleeping
Sleeping
import streamlit as st | |
import requests | |
import os | |
import json | |
import urllib.parse | |
from dotenv import load_dotenv | |
# Load environment variables (if using a .env file) | |
load_dotenv() | |
# Hugging Face OAuth Credentials | |
CLIENT_ID = os.getenv("HUGGINGFACE_CLIENT_ID") | |
CLIENT_SECRET = os.getenv("HUGGINGFACE_CLIENT_SECRET") | |
REDIRECT_URI = os.getenv("HUGGINGFACE_REDIRECT_URI") | |
# Hugging Face OAuth URLs | |
AUTHORIZATION_URL = "https://huggingface.co/oauth/authorize" | |
TOKEN_URL = "https://huggingface.co/oauth/token" | |
USER_INFO_URL = "https://huggingface.co/api/whoami-v2" | |
# Streamlit Session State to Track User | |
if "user" not in st.session_state: | |
st.session_state.user = None | |
def get_authorization_url(): | |
"""Generate the Hugging Face authorization URL.""" | |
params = { | |
"response_type": "code", | |
"client_id": CLIENT_ID, | |
"redirect_uri": REDIRECT_URI, | |
} | |
return f"{AUTHORIZATION_URL}?{urllib.parse.urlencode(params)}" | |
def exchange_code_for_token(auth_code): | |
"""Exchange authorization code for an access token.""" | |
data = { | |
"grant_type": "authorization_code", | |
"code": auth_code, | |
"client_id": CLIENT_ID, | |
"client_secret": CLIENT_SECRET, | |
"redirect_uri": REDIRECT_URI, | |
} | |
response = requests.post(TOKEN_URL, data=data) | |
return response.json() | |
def get_user_info(access_token): | |
"""Fetch user details from Hugging Face API.""" | |
headers = {"Authorization": f"Bearer {access_token}"} | |
response = requests.get(USER_INFO_URL, headers=headers) | |
return response.json() | |
def main(): | |
# Display App Title | |
st.title("Sign In with Hugging Face") | |
# Check if user is logged in | |
if st.session_state.user: | |
st.success(f"Logged in as **{st.session_state.user['name']}**") | |
st.image(st.session_state.user['avatar'], width=100) | |
if st.button("Logout"): | |
st.session_state.user = None | |
st.experimental_rerun() | |
else: | |
auth_url = get_authorization_url() | |
st.markdown(f"[![Sign in with Hugging Face](https://huggingface.co/front/assets/huggingface_logo-noborder.svg)]({auth_url})") | |
# Capture OAuth Redirect URL with Auth Code | |
query_params = st.query_params | |
if "code" in query_params: | |
auth_code = query_params["code"][0] | |
token_data = exchange_code_for_token(auth_code) | |
if "access_token" in token_data: | |
user_info = get_user_info(token_data["access_token"]) | |
st.session_state.user = { | |
"name": user_info.get("name", "Unknown User"), | |
"avatar": user_info.get("avatar", ""), | |
} | |
st.rerun() | |
else: | |
st.error("Failed to authenticate with Hugging Face.") | |
if __name__ == "__main__": | |
main() |