Coder Social home page Coder Social logo

Comments (16)

phamhieu avatar phamhieu commented on September 24, 2024 1

Thanks @awalias for clarification. After modifying slack clone example to use a single Supabase client, everything works properly.

from supabase-js.

kiwicopple avatar kiwicopple commented on September 24, 2024

The only thing I could think is that the token is expired when you try to log out. A couple of questions:

  • Is the browser left open, and then you try to log out after >3 hours?
  • There is a logout network call about 10 requests above the erroneous network call. Did you hit the button twice? Perhaps you're logged out already and the redirect to the home screen failed for some reason

from supabase-js.

thorwebdev avatar thorwebdev commented on September 24, 2024

Is the browser left open, and then you try to log out after >3 hours?

I'm able to reproduce this multiple times within a time window of less than 1h

There is a logout network call about 10 requests above the erroneous network call. Did you hit the button twice? Perhaps you're logged out already and the redirect to the home screen failed for some reason

Yes, there are times where the logout call is successful. You can see in the network comms though that after the logout there is a login (token?grant_types=password, right?). So don't think it's that.

from supabase-js.

awalias avatar awalias commented on September 24, 2024

@thorwebdev are you just using the OG slack clone example here?

from supabase-js.

thorwebdev avatar thorwebdev commented on September 24, 2024

@awalias yes, I'm able to observe this also on the official https://supabase-slack-clone.vercel.app/

slack-clone-logout-error

from supabase-js.

awalias avatar awalias commented on September 24, 2024

could be some race-condition here? https://github.com/supabase/supabase/blob/1e49eaeb7e0540c9cc1e4dad627e779a33b0500f/examples/slack-clone/pages/_app.js#L43

from supabase-js.

awalias avatar awalias commented on September 24, 2024

issue is when a user instantiates two or more supabase clients - fix is to always check localStorage before adding this.accessToken as an auth bearer token to see if there is one on the browser

from supabase-js.

phamhieu avatar phamhieu commented on September 24, 2024

It's gotrue logout api bug. The cookie is cleared before calling getUserFromClaims .

Screenshot 2020-08-17 at 10 50 15 AM

Screenshot 2020-08-17 at 10 51 54 AM
Screenshot 2020-08-17 at 10 52 23 AM

from supabase-js.

phamhieu avatar phamhieu commented on September 24, 2024

On slack-clone app, after an Invalid user error fires, I can login and logout successfully!!! no idea why the logout can goes through getUserFromClaims check

However the next login/logout will trigger Invalid user error again.

from supabase-js.

awalias avatar awalias commented on September 24, 2024

Oh we didn't update this issue after meeting @thorwebdev last week about this.

The issue here is that Slack-clone app uses two different supabase client instances, and supabase-js only reads from local storage on initiation, and manages it's own state of which user is logged in after that point - so multiple clients can easily get out of sync on current user state

Our options here are:

  1. supabase-js should check local storage before each call to see if there has been a change in user auth by a different client instance. This may be expensive

  2. we direct people to only init a single supabase client if they're using auth

  3. we make createClient return a singleton

any other?

from supabase-js.

phamhieu avatar phamhieu commented on September 24, 2024

@awalias what you describe seems to be another issue related to front-end.

The original error reported by @thorwebdev is from gotrue logout api. It can be reproduced easily.

  1. start your test supabase project, run slack clone quick start to create required tables
  2. pull slack clone app, update env with your test project keys and run it
  3. login and logout multiple times slack-clone client (with the same acc and client) you can see the error

Screenshot 2020-08-18 at 1 54 51 PM

I already check logout api on gotrue. The last commit on logout.go breaks the check mechanism.

Before
it works properly, because the claim is retrieved before clearing token
https://github.com/netlify/gotrue/blob/47cc9ce137a24c96985ee3e742b0f0adfb6f146c/api/logout.go
Screenshot 2020-08-18 at 2 02 43 PM

After
https://github.com/netlify/gotrue/blob/8304885327eb93a7346f4b27658f470499c39107/api/logout.go
Screenshot 2020-08-18 at 2 04 32 PM

from supabase-js.

awalias avatar awalias commented on September 24, 2024

I think the response from gotrue is actually correct in this instance, if you look at the request headers on the slack clone app, you will see that the apikey and auth bearer headers are the same, in this case the jwt being (mistakenly) sent is the anon key:

image
image

for comparison here is an example of a successful logout, with decoded jwt below:
image
image

The bug seems to be that the supabase-js client calling logout does not have the current user token, since it was already cleared from the client by the other instance

the "double logout" seems to be coming from here: https://github.com/supabase/supabase/blob/fed822f48c5e441eb867fa756443e362ac47423f/examples/slack-clone/components/Layout.js#L59

and here: https://github.com/supabase/supabase/blob/fed822f48c5e441eb867fa756443e362ac47423f/examples/slack-clone/pages/channels/%5Bid%5D.js#L16

from supabase-js.

awalias avatar awalias commented on September 24, 2024

also as a side note - we actually don't make use of the cookies set by go-true, we manage these ourselves using local storage inside supabase-js

from supabase-js.

phamhieu avatar phamhieu commented on September 24, 2024

Currently, supabase-js persists accessToken, refreshToken and currentUser to localstorage while also keeps them as class params inside supabase.auth. When we have multi supabase clients, these params can be out of sync.

We should use localstorage as the source of true and don't keep them as class params. It's the same as how we get authHeader to supply PostgrestClient. What do you think? @kiwicopple

from supabase-js.

awalias avatar awalias commented on September 24, 2024
  1. is it inefficient to fetch from local storage every time?
  2. what about server-side / node

maybe keep track of them internally but always check local storage first (if it exists?)

from supabase-js.

phamhieu avatar phamhieu commented on September 24, 2024
  1. right now everytime you call a request with postgrest client, it will read localstorage for accessToken to include in the header. It works ok until now. So i think it's efficient enough.
    Screenshot 2020-08-18 at 6 37 24 PM
  2. for server-side, accessToken should included in the header. To get refreshToken and currentUser we can call gotrue /user endpoint with accessToken

from supabase-js.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.