У меня есть логин с именем пользователя и паролем, который работает хорошо. Это означает, что после входа в систему пользователь перенаправляется в приложение.
Я пытался добавить единый вход с помощью Keycloak, но после входа пользователя снова перенаправляется для входа в систему.
Это код:
Код: Выделить всё
...
from keycloak import KeycloakOpenID
# Dummy user database
USER_DB = {
"admin": {"password": "admin_password", "role": "admin"},
"user": {"password": "user_password", "role": "user"}
}
# Configure Keycloak
keycloak_openid = KeycloakOpenID(
server_url="http://localhost:8081",
client_id="bot-app",
realm_name="my-bot",
client_secret_key="XXXX" # Keycloak client secret
)
def login_with_sso():
auth_url = keycloak_openid.auth_url(redirect_uri="http://localhost:8501")
st.markdown(f"[Login with SSO]({auth_url})")
query_params = st.query_params
if "code" in query_params:
token = keycloak_openid.token(
grant_type="authorization_code",
code=query_params["code"],
redirect_uri="http://localhost:8501"
)
user_info = keycloak_openid.userinfo(token["access_token"])
st.session_state["logged_in"] = True
st.session_state["username"] = user_info["preferred_username"]
st.session_state["access_token"] = token["access_token"]
# Redirect to Google after login
st.experimental_rerun()
def login():
st.title("Login")
choice = st.selectbox("Choose your login method:", ("Username and password", "SSO"))
if choice == "Username and password":
username = st.text_input("Username")
password = st.text_input("Password", type="password")
if st.button("Login"):
user = USER_DB.get(username)
if user and user["password"] == password:
st.session_state["logged_in"] = True
st.session_state["username"] = username
st.session_state["role"] = user["role"]
else:
st.error("Invalid username or password")
elif choice == "SSO":
if st.session_state.get("logged_in"):
st.write("Already logged in as ", st.session_state["username"])
else:
login_with_sso()
def chat_bot(controller1):
# Initialize variables
if "messages" not in st.session_state:
st.session_state.messages = []
if "first_conversation" not in st.session_state:
...
def main():
if "logged_in" not in st.session_state:
st.session_state["logged_in"] = False
if not st.session_state["logged_in"]:
st.image(logo_path, width=150)
login()
else:
#st.set_page_config(layout="wide")
st.title("Test Automation Tool")
controller1 = Controller()
with st.sidebar:
st.image(logo_path, width=150)
selected = option_menu(
menu_title="Menu",
options=["Chat Bot", "Handle Test Cases and Code", "Test Cases Table"],
icons=["robot", "floppy2", "table"],
menu_icon="list"
)
if selected == "Chat Bot":
chat_bot(controller1)
...
if __name__ == "__main__":
main()
Подробнее здесь: https://stackoverflow.com/questions/791 ... -main-view
Мобильная версия