I need a URL that will return 200 for a logged in user and 401 or 403 if the user is not logged in.
If require_login is checked, every page does a 301 to the login page.
I need a URL that will return 200 for a logged in user and 401 or 403 if the user is not logged in.
If require_login is checked, every page does a 301 to the login page.
Is this a user request, i.e. using the current users session?
Or…
Is this an admin API request using an admin API key?
Yeah. It’s me not understanding the question I’m asking.
I’m trying to do an auth_request in NGINX to tell whether the request is coming from a user that’s logged in by querying an URL to see whether it gets a 200 response or not.
It’s occurring to me that doing that is not quite as simple as I’d hoped.
You could try /session/current.json
It will return 200 if authenticated and 404 if not.
Generally .json / API requests don’t redirect.
That seems promising. I’ll keep poking at it.
Many thanks!
Is there an easy way to do this from a different subdomain?
Example, the forum is at forum.example.com and the request is coming from example.com (either from the frontend or backend code).
Sure. You can make an API call from anywhere.
But this specific call needs to be done from the frontend, since it will use the session cookies sent by the browser to the forum.
The Discourse session cookie appears to be just for the subdomain, so would the cookie be accessible from the top-level domain? I see _forum_session on the Discourse subdomain but it doesn’t appear when visiting the TLD.
If the cookie were available on the top-level domain, I was thinking that it would also be passed to the backend, so the backend could forward it to Discourse, but I’m not sure.
Maybe it requires using Discourse as an SSO provider? If it isn’t known whether the user is logged in, then we could redirect through the SSO process to check. I’m currently setting it up on a test server to see if it would work.
Edit: my end goal is to generate a JWT with the user data from Discourse (only if logged in to Discourse) and pass it to Firebase. There is a Discourse server on the subdomain, an extra backend server that can perform additional logic, and an SPA that connects to Firebase if given a JWT.
If you want anything fancy like this you would need to implement your own CurrentUserProvider
Thanks, I just looked it up and found this other thread, so I’ll ask some more questions about it over there.
Edit: it looks like we can do what we need with Discourse as an SSO provider.
If you can do it with SSO I highly recommend you go that path vs a provider
Thanks, it looks like we can check if a user is logged in and then redirect through Discourse’s SSO route if not logged in. It seems to work well on my laptop. The user logout webhook from Discourse can then log them out of the other app.
Könntet ihr mir bitte kurz erklären, wie man prüfen kann, ob ein Benutzer bei Discourse von einer anderen Subdomain aus angemeldet ist? Ich versuche, ein Auth-Middleware in meinen Route-Handlern (auf dem Server) zu implementieren, um zu prüfen, ob die SSO-Anmeldung des Benutzers bei Discourse noch gültig ist.
Ich versuche, fast dasselbe für eine Web-App zu implementieren, komme aber nicht darauf, wie man prüft, ob der Benutzer noch angemeldet ist. (Bevorzugt: angemeldet im selben Browser, der aktuell verwendet wird, um die Anfrage an den Server zu senden.)
Vielen Dank!
Mein Code dafür ist noch nicht live, aber wenn der Benutzer über einen anderen Server umgeleitet wird (mit Discourse als SSO-Anbieter), dann existiert eine Sitzung auf diesem externen Server. Ich habe dort eine Route erstellt, etwa /auth/is-authenticated, die den Status des Benutzers zurückgibt. Sie dient hauptsächlich dazu, die „Anmelden“-Buttons auszublenden, wenn der Benutzer bereits angemeldet ist. Wenn sich der Benutzer bei Discourse abmeldet, denke ich, dass ein Webhook ihn auch auf dem anderen Server abmeldet. Ich habe den Code schon eine Weile nicht mehr geprüft, aber ich glaube, so habe ich es eingerichtet.
Wie kann ein externer Server prüfen, ob der Browser des Benutzers noch bei Discourse angemeldet ist? Ich glaube nicht, dass eine andere Domain sogar auf die nach der Anmeldung gesetzten Discourse-Cookies zugreifen kann.
Mein Ziel ist es, den Benutzer vom externen (nicht Discourse) Server abzumelden, wenn der Benutzer sich nur im aktuellen aktiven Browser von Discourse abgemeldet hat. (Ist das überhaupt möglich?)
Danke für die Antwort.
Wenn sich der Benutzer in der externen Anwendung befindet, klickt er auf eine Anmeldeschaltfläche und wird durch den SSO-Provider-Flow von Discourse geleitet, bevor er zurück zur externen Anwendung weitergeleitet wird. Diese externe Anwendung kann eine Sitzung mit den Benutzerdaten speichern. Wenn sich der Benutzer bei Discourse abmeldet, kann der Webhook die Sitzung der externen Anwendung löschen. Ich bin mir nicht sicher, aber ich glaube, der Webhook-Header lautet X-Discourse-Event: user_logged_out.
Bearbeitung: Die Abmeldung von der externen Seite erfolgt über die Discourse-API.
Anstatt Discourse zu fragen, ob ein Benutzer angemeldet ist, können Sie die externe Anwendung fragen. In meinem Fall dient dies nur dazu, beispielsweise die Anmeldeschaltfläche auf der externen Seite auszublenden.
Ich kann meinen Code später noch einmal überprüfen. Ich habe ihn schon eine Weile nicht mehr angesehen, aber ich glaube, er hat etwas Ähnliches gemacht.
Danke für die Antwort! Ich schätze das wirklich.
Ja, das ist mir jetzt klar. Der einzige Haken beim Abmelden mit der API ist, dass der Benutzer von allen Sitzungen abgemeldet wird (auf allen Geräten – da die API nicht zwischen der aktuellen Sitzung des Browsers und anderen angemeldeten Browsern unterscheiden kann).