ITEnthusiasm
08/05/2022, 6:22 PMform data in localStorage while a user is making their way through a complex form. It's not robust but I think it at least covers some basics for anyone who's worried about it.
(A solution like this is necessary to make sure that users with JS enabled do not lose their progress if they're redirected in order to re-authenticate after a complex form submission.)ITEnthusiasm
08/05/2022, 6:23 PMform-test.tsx Route and the useFormLocalStorage hook.rp_st
08/05/2022, 7:38 PMITEnthusiasm
08/06/2022, 1:22 AMlocalStorage logic for every other reason that the user refreshes the page or navigates back to it. So it's easier to just reuse that logic.
Of course, someone could say, "It's pretty easy to do SuperTokensWebsite.init() as an add-on regardless." So that leads to part 2.
2) More Importantly it's hard. 😅 Remix is much more powerful and also much more easy to work with when developers work with (not against) the framework. And that more or less necessitates creating an app that plays nicely with their Form component (even if you aren't building a site that can accommodate non-JS users). There are a ton of advantages that come from using their Form component. So it's by no means disadvantageous, but it's still a constraint in development.
Using their Form component necessitates properly mapping auth requests during form submissions. But it also requires cleverly handling redirect scenarios when users are not authenticated, as you saw in the server.js file.
On https://github.com/ITenthusiasm/remix-supertokens/issues/1, you mentioned that:
> Normally, if you used verifySession middleware, it would send a 401 to the frontend and the supertokens-website repo would do an automatic refresh.
But in order for our application to work for both JS and non-JS users, the server has to swallow that error and take care of the redirects itself. So no 401 response ever gets sent.
If supertokens-website relies on the 401 error, then we're in trouble because the server is no longer sending `401`s with the current implementation. We could update the server to send the `401`s, but that makes it impossible for non-JS users to easily re-authenticate.
So what we end up with is a situation where -- in order for supertokens-website to be reliable -- the server would need to know whether the user is a JS user or a non-JS user. And though doable, that task seems more complex.ITEnthusiasm
08/06/2022, 1:48 AM<noscript> tag that sets the Cookie. (Let's call the Cookie javascript-unavailable.) ... Then the server would need to check the cookie to determine whether to swallow the error and handle the redirect itself (for non-JS users) or to let the error pass through so that supertokens-website can handle it (for JS users). The absence of a js-unavailable Cookie would indicate that we should let the error pass through, because they are supposedly a JS user. This approach already makes the logic in server.js more involved than a developer may like. And this is why I ultimately leaned in favor of just relying on localStorage.
Additionally, we still need the localStorage logic regardless. So that has to be built out. And then we'd have to load up supertokens-website alongside it so we can make refreshing easier in that one special use case with forms. (Admittedly, at least that part is not too bad.)
But even then... not every use case can be handled, as the person in that StackOverflow answer mentioned. There are more odd scenarios too... Two Examples:
1) Ideally, if a user suddenly enables (or gains / regains access to) JavaScript, then we'd want to give them a better refreshing experience. This means we need some kind of JS effect that clears the Cookie on page load. But this can get dicey in some cases...
2) If an authenticated user who already had JavaScript enabled suddenly lost (or disabled) the ability to use it, then they could make a form request to the server without the important js-unavailable Cookie. At that point, they'd get a 401 but wouldn't be able to do anything with it, and the app would appear to be broken in an unfamiliar way.ITEnthusiasm
08/06/2022, 1:53 AMsupertokens-website approach, it becomes more complex than it's worth. And there are still some edge cases that can cause problems. I don't run into any of those problems if I just keep things consistent by relying on localStorage and letting the server handle all the redirecting.
Does that make sense? If you have any other ideas for approaching this problem, they'd be appreciated! I am more or less happy with using localStorage though, as I don't think it's a bad user experience. And if desired, it should be pretty easy to include a "Re-authenticated" toast / popup notification to explain why the form refreshed (while retaining their progress) instead of doing a normal submit. But even that's easier to do than the Cookie + supertokens-website thing.ITEnthusiasm
08/08/2022, 1:39 PMrp_st
08/08/2022, 2:04 PMrid: .... So maybe the server can see if that is there, and if it is, then it can send back a 401?
> I am more or less happy with using localStorage though, as I don't think it's a bad user experience.
I agree. So perhaps it's OK to just keep it as it is and do redirection either way.ITEnthusiasm
08/08/2022, 6:33 PM