I Tried Adding Google Auth To a Python Web App | ft. Streamlit

Fanilo Andrianasolo
18 Aug 202418:16

Summary

TLDRIn this video, the creator shares a month-long journey of researching and building multiple Streamlit apps with Google authentication methods. Despite testing various solutions, none proved entirely satisfactory without delving into the authentication workflow. The video guides viewers through the Google authentication process, explaining how to create credentials, configure consent windows, and handle OAuth scopes. It explores different authentication techniques, including using Python libraries like Google-auth and FastAPI, and discusses the challenges of implementing these in Streamlit Cloud. The creator also touches on advanced topics like session-based authentication, token management, and the use of reverse proxies for production settings, offering insights into best practices for secure and efficient app development.

Takeaways

  • 🔍 The video discusses the process of researching and building streamlit apps with Google authentication, testing various methods to find a satisfying solution.
  • 🔑 It highlights the necessity of creating keys in a Google Cloud project to access Google APIs and user data.
  • 🛠️ The script guides through configuring the consent window to access resources like Gmail, profile pictures, and calendar events.
  • 📝 It mentions the importance of understanding OAuth 2.0 and OpenID Connect for securely accessing user data without handling passwords.
  • 💻 The video demonstrates using the Google OAuth library to authenticate and access user information through a local server.
  • 🚫 It points out limitations when deploying on streamlit cloud, such as the inability to spawn new processes or expose certain ports.
  • 🌐 The script explores using FastAPI to handle authentication callbacks and create a more flexible server-side solution.
  • 🔄 It discusses session-based authentication, the use of access tokens, and the importance of refresh tokens for maintaining user sessions.
  • 🍪 The video addresses the need for cookie management and user consent, especially regarding GDPR and privacy regulations.
  • 🔗 It suggests alternative authentication methods, such as using a reverse proxy or authentication-as-a-service providers for more robust solutions.

Q & A

  • What is the main challenge the video aims to address?

    -The video addresses the challenge of finding a satisfying, one-size-fits-all solution for Google authentication in streamlit apps without deep involvement in the authentication workflow.

  • Why is it necessary to create keys to access Google services?

    -Keys are necessary to access Google services because they act as credentials that grant your application permission to access user data like Gmail, profile pictures, and other Google resources.

  • What is the role of the consent screen in the Google authentication process?

    -The consent screen is where you configure the app's metadata and specify the resources (scopes) your app can access, such as user info, email, and profile. It also sets up the user consent flow for accessing these resources.

  • What are the limitations of using 'get_user_credentials' method in streamlit cloud?

    -The 'get_user_credentials' method cannot be used in streamlit cloud due to limitations like inability to spawn new processors, remote streamlit app's inability to access the local browser, and the non-exposure of port 9000 by the container.

  • What is the difference between OAuth and OpenID Connect mentioned in the script?

    -OAuth is a protocol for secure API access delegation, while OpenID Connect is a simple identity layer on top of OAuth 2.0. They are used for building clients that can securely access user data without handling passwords.

  • Why is the 'authorization code grant type flow' used in the video?

    -The 'authorization code grant type flow' is used because it is the most common authentication flow on the web, allowing the app to obtain an access token by presenting an authorization code received from the authorization server.

  • What is the significance of the 'state' parameter in the authentication flow?

    -The 'state' parameter is a randomly generated ID that helps prevent CSRF attacks by ensuring that the response from the authorization server matches the original request from the client.

  • How does the video suggest handling tokens after user authentication?

    -The video suggests using session-based authentication, where tokens are stored in a database and an HTTP-only secure cookie is used to manage user sessions without exposing sensitive tokens to the client-side.

  • What are the privacy considerations when using cookies for authentication?

    -Cookies are considered browser tracking under GDPR, so consent is required from users to store cookies. The video highlights the need to manage cookies carefully, especially when deploying apps for public use.

  • What alternative authentication techniques are mentioned in the video?

    -The video mentions using authentication as a service providers like Auth0 or Firebase, and using a reverse proxy like Nginx or Caddy to manage authentication and user sessions.

Outlines

00:00

🔑 Unlocking Google Authentication Workflow

The narrator discusses the challenges of creating a satisfying Google authentication solution after trying various methods. The main point is about understanding the Google authentication workflow by configuring a dedicated Google Cloud project. This involves setting up OAuth consent, choosing appropriate scopes for accessing user data, and the process of creating OAuth client credentials. The narrator emphasizes the importance of understanding the workflow rather than relying on a one-size-fits-all solution.

05:00

🖼️ Displaying Google User Info in a Streamlit App

The narrator explains how to display user information such as name, email, and profile picture in a Streamlit app after completing the authentication flow. They also demonstrate how the Google Calendar API can be accessed using an authorization token. The challenge with Streamlit Cloud is highlighted—limitations like the inability to spawn new Flask servers, open browser tabs, or expose certain ports. The narrator switches to FastAPI for local server operations, setting up a new callback URL and explaining how to capture and process the authorization flow.

10:01

🔄 Session Management and Token Handling with FastAPI

In this paragraph, the narrator discusses pushing their minimal viable product (MVP) further by integrating session-based authentication. They explain how to create new authorization URLs, store session states in a database, and handle secure cookies. The narrator describes the process of using FastAPI to manage session tokens and ensure that access and ID tokens are properly stored and reused in future interactions, emphasizing the importance of backend token management for security.

15:01

💡 Alternative Solutions and Front-End Google Widgets

The narrator introduces an alternative front-end approach to Google authentication using embedded Google sign-in buttons. This method reduces the need for FastAPI or backend token handling by utilizing Streamlit components to handle the Google token via JavaScript. They point out limitations, such as restrictions in Streamlit Cloud, and explain how to modify OAuth credentials for local testing. The narrator reflects on the pros and cons of different authentication techniques and promises to explore further solutions in future videos, including reverse proxies like NGINX for production environments.

Mindmap

Keywords

💡Google Authentication

Google Authentication refers to the process of verifying a user's identity using Google's services. In the video, the creator discusses various methods to implement Google Authentication in Streamlit apps. This is crucial for accessing user data like Gmail, profile pictures, and Google Calendar events securely.

💡OAuth

OAuth is an open standard for access delegation, commonly used as a way for Internet users to grant websites or applications access to their information on other websites without giving them the passwords. The script mentions OAuth 2.0 and OpenID Connect, which are protocols that enable this kind of secure authorization.

💡Client ID and Secret

Client ID and Secret are identifiers issued to the application by the authorization server, used to authenticate the application and establish a secure connection. In the video, the creator discusses creating these credentials in a Google Cloud project to access Google's services.

💡Scopes

Scopes define the level of access that the application is requesting from the user. The script mentions adding scopes like 'openid', 'email', and 'profile' to access user information, and 'Google Calendar events' to read calendar data. These are essential for determining what data the app can access.

💡Consent Screen

The Consent Screen is a user interface that allows users to review and grant permissions to an application. The video script describes configuring the consent screen to access resources and edit app metadata, which is a step in setting up OAuth for user data access.

💡Callback URL

A Callback URL is the endpoint to which the authorization server redirects the user-agent back to the client after an authorization flow. In the script, the creator configures a callback URL for the app to receive authorization codes from Google's authorization server.

💡Streamlit

Streamlit is an open-source app framework for machine learning and data science. The video focuses on integrating Google Authentication into Streamlit apps, which is essential for building interactive web apps that can securely access user data.

💡FastAPI

FastAPI is a modern, fast (high-performance) web framework for building APIs with Python. The script mentions using FastAPI to create a server that can handle authentication callbacks, demonstrating an alternative approach to handling OAuth flows.

💡Authorization Code Grant

Authorization Code Grant is a flow in OAuth 2.0 where the app obtains an authorization code from the authorization server and then exchanges it for an access token. The video script describes this flow in detail, showing how it's implemented in the context of Google Authentication.

💡Refresh Token

A Refresh Token is a special type of token used to obtain new access tokens once the existing ones expire. The script mentions the refresh token as part of the credentials object, which can be used to renew access tokens without requiring the user to re-authenticate.

💡Session-based Authentication

Session-based Authentication is a method where the server stores the user's session information and uses it to authenticate subsequent requests. The video script discusses implementing session-based authentication to manage user sessions and reuse tokens securely.

Highlights

The speaker has been researching and building streamlit apps with Google auth for a month.

No single solution for Google authentication in streamlit was found to be fully satisfying.

The necessity to understand the Google authentication workflow is emphasized.

A guide on creating Google Cloud credentials to access user data is provided.

The importance of configuring the consent window for accessing user resources is discussed.

The process of creating an OAuth client ID for a web application is explained.

The limitations of using Google authentication in streamlit cloud are highlighted.

The use of Python libraries like requests-oauthlib for authentication is mentioned.

The installation and use of the Google OAuth library in streamlit is described.

A detailed walkthrough of the Google authentication flow using 'get_user_credentials' is provided.

The concept of web application flow or authorization code grant type flow is introduced.

The challenges of using Google authentication in streamlit cloud due to Docker limitations are discussed.

An alternative method using FastAPI to handle Google authentication callbacks is presented.

The implementation of session-based authentication to manage user sessions is explained.

The use of refresh tokens to renew access tokens is mentioned.

The speaker discusses the implications of GDPR on cookie usage for authentication.

The exploration of using a front-end Google sign-in button within streamlit is described.

The speaker's personal preference for server-side solutions over front-end for authentication is shared.

The potential of using reverse proxies like Caddy for managing authentication in streamlit apps is mentioned.

The video concludes with a teaser for future content on hosting streamlit apps with Caddy.

Transcripts

play00:00

it's been a month since I started

play00:02

researching for this video and I built

play00:04

seven to eight different streamid apps

play00:06

with various Google art methods but

play00:08

after testing all of the solutions none

play00:11

felt truly satisfying data fans I find

play00:15

it hard to recommend a one- siize fitall

play00:17

solution that doesn't involve digging

play00:19

into the authentication workflow so

play00:21

instead let me walk you through the

play00:23

solutions I tried so you understand the

play00:26

Google authentication workflow and can

play00:28

confidently work you those libraries

play00:31

yourself but before trying any Google

play00:33

signin Technique we need to create the

play00:36

keys to access the Google Kingdom in a

play00:38

dedicated Google Cloud project head to

play00:40

the credentials page under apis and

play00:42

services to access user data like the

play00:45

name gmail profile picture and Google

play00:47

resources like calendar meetings you

play00:50

first need to configure the consent

play00:51

window to access the resources find the

play00:54

oot consent screen edit your apps

play00:57

metadata the name website developer

play00:59

email and logo on the next page click

play01:03

add Scopes and select the resources you

play01:05

want the app to access it would be the

play01:08

open ID user info email and profile

play01:11

Scopes and if you enable the calendar

play01:13

API beforehand you can also scroll to

play01:16

select the Google calendar events read

play01:19

only

play01:20

scope Scopes are categorized by

play01:23

sensitivity it doesn't matter for local

play01:25

testing but if you release your app to

play01:27

the world it needs to go through a

play01:29

Google very ification process first

play01:31

which will be more difficult depending

play01:34

on how many sensitive Scopes you are

play01:35

asking

play01:36

for while you are in testing mode you

play01:39

can add friends and family Google emails

play01:41

as beta testers to log your

play01:44

app next create a new o client ID

play01:47

credential for our web

play01:49

application the Google authorization

play01:51

server needs a path back to your

play01:53

extremely app to send back a code for

play01:56

now provide HTTP Local Host 9000 as a

play01:59

call back address we will think later

play02:01

about how to listen to it a new client

play02:04

ID and secret will be created copy those

play02:08

into streamlet secret TL file then

play02:11

download the Json secret file to the

play02:13

root of your project it will act as our

play02:16

passport to the Google Gates we are

play02:18

ready to

play02:22

authenticate four weeks ago I looked for

play02:25

python authentication libraries and I

play02:28

found options like request Quest o or

play02:31

off Li for building o 2/ open ID connect

play02:34

clients at this point I kept reading

play02:37

those two terms everywhere we just set o

play02:40

to keys with open ID Scopes platforms

play02:42

like GitHub Twitter and Google provide o

play02:44

to endpoints to let python apps securely

play02:47

access user data tools like Solara and

play02:50

panel simplify OD to configuration for

play02:52

their developers it's like if your

play02:54

python web app has to access user info

play02:57

from a website without manipulating p

play02:59

password you should look into o 2/ oidc

play03:04

documentation i p installed the Google o

play03:07

o Library it includes the get user

play03:09

credentials method taking as input the

play03:11

client ID client secret and a subset of

play03:14

access copes we defined in the consent

play03:16

screen earlier you can also indicate a

play03:19

minimum and maximum port for demo

play03:21

purposes I limited to Port

play03:24

9,000 I trust you remember where we

play03:27

configured local lost 9,000

play03:30

when I click the login button streamly

play03:33

calls get user credentials and opens a

play03:35

new browser tab for me there's the

play03:38

authorization URL it opened for me data

play03:41

fans we are not on my Stream app anymore

play03:44

we are interacting with Google's

play03:46

authorization server if I'm not signed

play03:48

in with a Google account it displays a

play03:50

new Google signin window let me enter my

play03:53

Gmail

play03:55

credentials I am the only test user that

play03:58

can authenticate with this clent ID

play04:00

anyway I added myself as the only beta

play04:02

tester while this app is not verified

play04:05

then on the next window the Google

play04:07

authorization server asks me the user to

play04:10

confirm the app can access the resources

play04:12

from the subset of Scopes like my name

play04:14

or my Google Calendar oh yes I I accept

play04:18

authentication flow

play04:21

successful and I receive a credentials

play04:23

object back in Python without ever

play04:26

handling Google passwords in my code I'm

play04:29

I am not a hacker who tries to steal

play04:31

your Google

play04:33

passwords the credential contains a few

play04:36

interesting objects but right now I only

play04:38

need user information provided by the

play04:40

open ID connect scope so I extract the

play04:43

ID token from the

play04:45

credentials there is a procedure to

play04:47

decode and verify the authenticity of

play04:49

the token just in case someone corrupted

play04:52

it with a scam

play04:54

email and now I have access to my user's

play04:57

name my verified Gmail address and my L

play05:00

to my profile picture which are pretty

play05:02

easy to display in My Stream app and

play05:04

store in a database for future

play05:07

usage since the Google Calendar read

play05:09

scope is included in the flow I can even

play05:12

use the access token in the credentials

play05:15

as an ID card to read the user's Google

play05:19

Calendar this is the easiest solution to

play05:22

authenticate with Google and access your

play05:24

Google resources from streamlet

play05:27

unfortunately it won't work on streamid

play05:31

cloud the process looks a bit opaque at

play05:34

first but under the hood get user

play05:36

credential runs a local flash server

play05:39

that listens on local

play05:42

9000 however the docker image for stream

play05:45

cloud has three limitations first I

play05:47

cannot spawn new processors to M Bitcoin

play05:50

I mean I cannot spawn a new flask server

play05:52

that listens to Port 9000 second the

play05:55

remote streamit app cannot access my

play05:57

local browser to open a new tab and

play06:00

third the port 9000 isn't exposed by the

play06:03

container if you really need this

play06:05

solution you're better off deploying

play06:07

your own Docker image in another cloud

play06:10

service can't I just use streamlets

play06:12

tornado server instead unfortunately as

play06:16

of this videoos released there is no

play06:18

native way to get the tornado instance

play06:21

and tell it to listen to another

play06:23

endpoint so maybe I should just spin you

play06:26

know my own python server to listen to

play06:28

Port 9,000

play06:33

right so I install fast API why fast API

play06:38

instead of flask no reason just because

play06:40

no reason fast API opens on Port 8,000

play06:43

by default I could have changed the

play06:45

command line to run on Port 9,000 but

play06:48

instead I added Local Host 8000 sl/ code

play06:51

as a new callback URL for my o clients I

play06:55

don't think it's a good practice to

play06:56

stuff many up callbacks in a o clients

play07:00

it could crumble under so many

play07:02

responsibilities anyway I Define a new

play07:05

get/ out/ code and point in fast API and

play07:09

run the app next to streamlit to catch

play07:11

any call back to local lost

play07:14

8000

play07:16

code back to my streamit app I create a

play07:18

new o flow to generate a Google

play07:21

authorization URL and states it is a

play07:24

randomly generated ID that is baked into

play07:27

the authorization URL and and sent to

play07:30

Google's authorization

play07:31

server I kind of consider this as the ID

play07:35

of the current authentication flow and I

play07:38

expect the authorization server to keep

play07:40

it in mind then I embed the

play07:42

authorization URL into a link button

play07:45

which redirects the user to Google's old

play07:47

servers on a click so far we're in known

play07:51

territory as always I input my Gmail

play07:53

account consent to let it use my profile

play07:56

info press okay then

play07:59

instead of the authentication is a

play08:01

success text I'm getting back the hello

play08:04

world from Fast

play08:06

API so after the logging and consent

play08:09

screen the Google authorization server

play08:12

sends back a response to the Callback

play08:14

URL which fast API catches you know

play08:17

might as well play with this call back I

play08:20

add a state and code argument to fast

play08:22

API so it parses them out of the request

play08:26

and then I just display them in HTML

play08:28

response

play08:30

and look at this the state and code gets

play08:32

passed into my

play08:34

HTML

play08:36

nice let's try a new authentication flow

play08:39

in streamlet and see F API catch the

play08:42

authorization call

play08:47

back you can use this code to get your

play08:50

credentials from the Google resource

play08:51

server but be quick agent fan this code

play08:55

will self-destruct in 5 minutes I create

play08:57

a new form in streamlit to copy paste

play08:59

the state and code back from Fast API if

play09:03

the state ID from the origin stream need

play09:05

and the Google authorization server

play09:06

called back to fast API match I know

play09:09

they come from the same flow so this

play09:12

temporary authorization code is for me

play09:15

and I can use it to Ping the Google

play09:16

resource server for user credentials

play09:19

using the fetch token

play09:21

method and then like last time I extract

play09:24

and verify the ID token from the

play09:26

credentials to get the logged in user

play09:28

yada yada

play09:30

yep that's the full a to workflow

play09:34

breakdown behind get user credentials

play09:36

this is the most common authentication

play09:39

flow on the web it's called the web

play09:41

application flow or authorization code

play09:43

Grant type flow it's the default flow in

play09:46

any python o web library but I I still

play09:50

have a few questions for for example

play09:53

what do I do with those credentials

play09:54

after reading user info from the ID

play09:56

should I like store the credentials

play09:58

somewhere so I can reload them when the

play10:00

user comes back to the session and if a

play10:03

hacker steals the access token can they

play10:05

read my Google Calendar for secret

play10:07

meetings with my manager to answer those

play10:11

questions I pushed my MVP a little

play10:14

further maybe too much so I won't show

play10:17

the full code but the project is in the

play10:19

description

play10:21

[Music]

play10:23

below I added a/ session endpoint in

play10:26

fast API that creates a new autois ation

play10:29

URL and state ID I store this state in a

play10:33

local SQL light or a remote fir store

play10:35

database stream L calls this to create a

play10:38

session on Fast API and in the database

play10:41

and get the authorization URL with a

play10:44

button click and a redir hack I push the

play10:46

user to the Google authorization URL for

play10:49

login and

play10:51

consent the Google OD server calls back

play10:54

fast API which passes the call back URL

play10:57

for the state and authorization code

play10:59

and if the state ID is in the database

play11:02

it uses the code to fetch the access and

play11:05

ID tokens from the resource

play11:07

server finally fast API sends a redirect

play11:11

response back to streamlets and stores

play11:13

the state ID in an HTTP only secure

play11:17

cookie on my

play11:18

browser cookies well since stre 1.37

play11:23

streamlet can read cookies with the St

play11:25

context cookies method so on each return

play11:27

to streamlet I can read the state from

play11:30

the cookie send it to fast API to check

play11:33

if there's a matching session and if one

play11:35

exists reuse the tokens from the session

play11:37

in the database to get back calendar and

play11:40

profile

play11:41

information that way sensitive tokens

play11:44

are never sent to the client

play11:47

browser I later discovered that this is

play11:49

called session based authentication it's

play11:52

fun to implement once in your life but

play11:55

uh it just opens a new batch of troubles

play11:58

if backend development is not your

play12:00

specialty for example because this

play12:03

access token has so much power in

play12:05

accessing user resources it has a very

play12:08

short lifespan in case it gets stolen at

play12:11

least we are lucky since those tokens

play12:13

stay on the backend tornado server side

play12:16

in stream we don't display them in any

play12:18

front end code and actually because of

play12:21

the short lifespan of an access token

play12:23

there is a third token in the

play12:25

credentials objects that I didn't talk

play12:27

about it's called the refresh token in

play12:30

case the access token expires I should

play12:32

use the refresh token to renew the

play12:35

access token instead of going through a

play12:37

new login flow speaking of login flows

play12:40

and cookies you know gdpr privacy don't

play12:44

track people putting a cookie is

play12:46

considered browser tracking and if I

play12:48

deploy my app to the world I am supposed

play12:51

to ask for consent to store the cookie

play12:53

on the user's browser and I'm sure I

play12:56

will forget to do it yep anyway as a

play13:00

data expert that's a lot of tokens

play13:03

sessions and cookies to deal

play13:08

with this video is sponsored by myself

play13:12

if you want to support me researching

play13:14

editing and showcasing the latest data

play13:17

and web practices for data fans consider

play13:19

buying me a coffee to stay awake or

play13:22

offer a super tanks after I show you the

play13:25

next authentication technique that

play13:26

doesn't require fast API let's go if we

play13:31

have a hard time doing back and forth

play13:33

server side interaction in streamlet why

play13:36

not do everything on the front and side

play13:40

that's when it appeared to me the

play13:42

ultimate Google widgets I found a Google

play13:46

signin button that could be embedded in

play13:48

HTML JavaScript

play13:52

code elegant fact by using a stream

play13:55

component I can embed the HTML Google

play13:58

sign in button in my web app catch the

play14:01

Google token in the JavaScript call back

play14:04

and push the token back into server side

play14:07

tornado python code then finally I use

play14:10

Google o o off slip whatever verify

play14:14

token to extract the token

play14:19

ID it works as long as I add the Streit

play14:23

locost 8501 URL to the list of

play14:27

authorized origins in my o credentials

play14:30

on the Google console no fast API server

play14:32

needed no back and forth between the

play14:35

authorization and the resource no

play14:37

storing and comparing session tokens

play14:40

Google does all of the hard stuff for

play14:42

you actually if you look into your local

play14:45

cookies you will find out a new sidcc

play14:49

cookie from a Google origin sidcc

play14:53

for session ID secure HTTP only cross

play14:57

site

play14:57

cookie if if you're interested I'm using

play15:00

this component template from Thiago one

play15:03

of the streid founders and you can find

play15:05

the source code in the description below

play15:07

again okay does it work on streamid

play15:11

cloud well the logging and consant

play15:14

Screen don't

play15:16

load see if I check the web def tools

play15:19

console it tells me the given origin is

play15:22

not allowed for the given client ID let

play15:25

me add the URL to the list of JavaScript

play15:29

Origins and wait a few minutes again

play15:33

okay uh let's try

play15:36

again

play15:41

yep we've seen three different

play15:44

techniques to do Google authentication

play15:46

that work well in low stakes

play15:48

environments I personally use the get

play15:51

user credentials locally or on an on

play15:53

premise server for quick login for

play15:55

example for my YouTube analytics

play15:57

dashboard

play15:59

it sounds like the signin button

play16:02

component is a better beginner friendly

play16:04

solution especially if you have access

play16:06

to the HTML CSS JavaScript which is not

play16:09

really the case in streamlit and I know

play16:12

I'm too lazy to maintain JavaScript

play16:14

logic in the long run so I tend to stick

play16:17

with python based server side solutions

play16:20

for more flexibility or fine-tuning

play16:23

deploying your own fast API server to

play16:25

catch the authentication flow is a nice

play16:28

setup as long as you to put https

play16:30

everywhere there are two more solutions

play16:32

that didn't make it in this video

play16:34

because it's already too long but do

play16:36

tell me in the comments if you want a

play16:38

second one the first one is the

play16:39

authentication as a service path you can

play16:42

use o providers like o zero Fire based

play16:45

authentication or super based to manage

play16:47

a unique single sign on with multiple

play16:49

identity providers use the data and

play16:52

session cookie management for you they

play16:54

even have their dedicated UI for example

play16:57

here's Solara o method redirecting to an

play17:00

old zero logging and streamid Cloud

play17:03

redirects you to Old kits

play17:05

UI a second ID commonly used in

play17:08

production settings it's even

play17:10

recommended as a best practice in the

play17:13

Unicorn documentation for deploying

play17:15

flask is to put your streamit app behind

play17:18

a reverse proxy like engine INX or caddy

play17:21

the reverse proxy handles load balancing

play17:24

caches static files and most importantly

play17:28

manages our authentication via Solutions

play17:30

like authentic aelia or keycloak it then

play17:34

redirects the logged in user to the

play17:36

Stream It app with a HTTP header to

play17:39

identify them just like cookies starting

play17:43

version

play17:44

1.37 streamlet can access headers

play17:46

through the St context headers method to

play17:49

access user information passed by the

play17:51

reverse proxy so we're good nope

play18:00

now I'm off to play with caddy as a

play18:01

reverse proxy for streamlit and if it

play18:04

goes well maybe I should plan a video

play18:06

about hosting streamit apps in pseudo

play18:09

production settings with caddy so you

play18:11

know I'll see you

play18:13

around bye

Rate This

5.0 / 5 (0 votes)

Ähnliche Tags
Google AuthStreamlitOAuthOIDCWeb SecurityAPI AccessUser DataCode TutorialDevOpsTech Insights
Benötigen Sie eine Zusammenfassung auf Englisch?