https://github.com/antonlydell/streamlit-passwordless
A user for Streamlit applications using Bitwarden Passwordless.dev
https://github.com/antonlydell/streamlit-passwordless
passkeys streamlit streamlit-component
Last synced: 3 months ago
JSON representation
A user for Streamlit applications using Bitwarden Passwordless.dev
- Host: GitHub
- URL: https://github.com/antonlydell/streamlit-passwordless
- Owner: antonlydell
- License: mit
- Created: 2023-12-30T14:28:03.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-05-10T18:42:02.000Z (about 1 year ago)
- Last Synced: 2024-05-12T10:54:13.211Z (about 1 year ago)
- Topics: passkeys, streamlit, streamlit-component
- Language: Python
- Homepage: https://passwordless.streamlit.app/
- Size: 296 KB
- Stars: 1
- Watchers: 1
- Forks: 2
- Open Issues: 1
-
Metadata Files:
- Readme: README.rst
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
streamlit-passwordless
======================|PyPI| |conda-forge| |conda-forge-platform| |Python| |LICENSE|
streamlit-passwordless provides a user model for Streamlit applications based on the Bitwarden
passwordless.dev technology. It allows users to securely authenticate with a Streamlit application
using passkeys. The project is under development and not ready for production yet.A demo of the project is available at: https://passwordless.streamlit.app
Installation
------------streamlit-passwordless is available on `PyPI`_ and `conda-forge`_ and can be installed with `pip`_
or `conda`_... _conda: https://docs.conda.io/en/latest/
.. _conda-forge: https://anaconda.org/conda-forge/streamlit_passwordless
.. _pip: https://pip.pypa.io/en/stable/getting-started/
.. _PyPI: https://pypi.org/project/streamlit-passwordless/Install with pip:
.. code-block:: bash
$ pip install streamlit-passwordless
Install with conda:
.. code-block:: bash
$ conda install conda-forge::streamlit_passwordless
License
-------streamlit-passwordless is distributed under the `MIT-license`_.
.. _MIT-license: https://opensource.org/licenses/mit-license.php
Example
-------Let's create an example Streamlit app using streamlit-passwordless. First create an account with
`Bitwarden Passwordless.dev`_ and make your *public* and *private* key accessible to your
application. This can be accomplished through environment variables or the `Streamlit secrets`_.
Create a new virtual environment and install streamlit-passwordless... _Bitwarden Passwordless.dev: https://admin.passwordless.dev/Account/Login
.. _python-dotenv: https://pypi.org/project/python-dotenv/
.. _Streamlit secrets: https://docs.streamlit.io/develop/api-reference/connections/secrets.toml.. code-block:: bash
~ $ mkdir stp_demo && cd stp_demo
~/stp_demo $ python -m venv .venv
~/stp_demo $ source .venv/bin/activate
~/stp_demo (.venv) $ python -m pip install streamlit-passwordless
~/stp_demo (.venv) $ mkdir .streamlit && touch .streamlit/secrets.tomlOn Windows you should replace with ``source .venv/bin/activate`` with ``.venv/bin/Activate.ps1``.
The contents of the file *~/stp_demo/.streamlit/secrets.toml* is shown below. Replace ````
and ```` with your actual *public* and *private* key from Bitwarden Passwordless.dev. The
*private key* is called *secret key* in Bitwarden Passwordless.dev. Alternatively you can set the
environment variables `STP_BWP_PUBLIC_KEY` and `STP_BWP_PRIVATE_KEY` to the values of the *public*
and *private* keys respectively... code-block:: toml
[streamlit-passwordless]
STP_BWP_PUBLIC_KEY = ''
STP_BWP_PRIVATE_KEY = ''Copy the code of the example app below into a file called *app.py* and place it in your
working directory *stp_demo*... code-block:: python
# app.py
import streamlit as st
import streamlit_passwordless as stpdef main() -> None:
r"""The main function to run the app."""page_title = 'Streamlit Passwordless Minimal Example'
st.set_page_config(page_title=page_title)
st.title(page_title)client, session_factory, _ = stp.setup(create_database=True)
with session_factory() as session:
stp.db.init(_session=session)
register_tab, signin_in_tab = st.tabs(['Register', 'Sign in'])
with register_tab:
stp.bitwarden_register_form(client=client, db_session=session)
with signin_in_tab:
stp.bitwarden_sign_in_form(client=client, db_session=session)stp.sign_out_button(use_container_width=True)
if __name__ == '__main__':
main()The ``stp.setup`` function initializes the session state variables needed by streamlit-passwordless,
loads and validates the configuration, creates the ``client`` for communicating with Bitwarden
Passwordless.dev and finally creates the ``session_factory`` for interacting with the user database.
By setting ``create_database=True`` the tables of the database are created. By default a SQLite
database (*streamlit_passwordless.db*) located in the current working directory is used. The database
to use can be specified through the config key or environment variable ``STP_DB_URL``, which takes a
`SQLAlchemy database URL`_.The function ``stp.db.init`` initializes the database by creating the default user roles. This function
is cached with st.cache_resource_, which makes it only execute once. The database can also be initialized
through the streamlit-passwordless CLI by running the command ``stp run init``. It launches a Streamlit
app that initializes the database and lets you create an admin user for the application. Lastly the forms
to *register* and *sign in* are rendered in separate tabs, and finally the *sign out* button is rendered... _st.cache_resource : https://docs.streamlit.io/develop/api-reference/caching-and-state/st.cache_resource
.. _SQLAlchemy database URL : https://docs.sqlalchemy.org/en/20/core/engines.html#database-urlsRun the example app with the following command:
.. code-block:: bash
~/stp_demo (.venv) $ python -m streamlit run app.py
You can now view your Streamlit app in your browser.
Local URL: http://localhost:8501
Open the url in your favorite web browser and try it out!
.. |conda-forge| image:: https://img.shields.io/conda/vn/conda-forge/streamlit_passwordless?style=plastic
:alt: conda-forge - Version
:target: https://anaconda.org/conda-forge/streamlit_passwordless.. |conda-forge-platform| image:: https://img.shields.io/conda/pn/conda-forge/streamlit_passwordless?color=yellowgreen&style=plastic
:alt: conda-forge - Platform
:target: https://anaconda.org/conda-forge/streamlit_passwordless.. |LICENSE| image:: https://img.shields.io/pypi/l/streamlit-passwordless?style=plastic
:alt: PyPI - License
:target: https://github.com/antonlydell/streamlit-passwordless/blob/main/LICENSE.. |PyPI| image:: https://img.shields.io/pypi/v/streamlit-passwordless?style=plastic
:alt: PyPI
:target: https://pypi.org/project/streamlit-passwordless/.. |Python| image:: https://img.shields.io/pypi/pyversions/streamlit-passwordless?style=plastic
:alt: PyPI - Python Version
:target: https://pypi.org/project/streamlit-passwordless/