Is there an endpoint to check if a user is logged in

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.

Poderia explicar um pouco como podemos verificar se um usuário está logado no Discourse a partir de outro subdomínio? Estou tentando implementar um middleware de autenticação nos meus manipuladores de rotas (no servidor) para verificar se o login do usuário no Discourse como SSO ainda é válido.

Estou tentando implementar quase a mesma coisa para um aplicativo web, mas não consigo descobrir como verificar se o usuário ainda está logado. (De preferência, logado no mesmo navegador atualmente usado para enviar a solicitação ao servidor)
Obrigado!

Meu código para isso ainda não está ativo, mas se o usuário for redirecionado por meio de outro servidor (com o Discourse como provedor de SSO), uma sessão existirá nesse servidor externo. Criei uma rota lá, algo como /auth/is-authenticated, que retorna o status do usuário. Ela serve principalmente para remover os botões de “entrar” quando o usuário já está logado. Quando o usuário faz logout no Discourse, acho que um webhook o desloga do outro servidor. Não verifiquei o código há algum tempo, mas acredito que foi assim que configurei.

Como um servidor externo pode verificar se o navegador do usuário ainda está logado no Discourse? Não acho que outro domínio possa acessar os cookies do Discourse definidos após o login.

Meu objetivo é fazer o logout do usuário no servidor externo (não no Discourse) se o usuário fizer logout do Discourse usando apenas o navegador ativo atual. (Isso é até possível?)

Obrigado pela resposta.

Quando o usuário está no aplicativo externo, ele clica em um botão de login e é redirecionado pelo fluxo de provedor SSO do Discourse, retornando ao aplicativo externo. Esse aplicativo externo pode armazenar uma sessão com os dados do usuário. Quando o usuário faz logout no Discourse, o webhook pode deletar a sessão do aplicativo externo. Não tenho certeza, mas acho que o cabeçalho do webhook é X-Discourse-Event: user_logged_out.

Edição: o logout do site externo é feito usando a API do Discourse.

Em vez de perguntar ao Discourse se um usuário está logado, você pode consultar o aplicativo externo. No meu caso, isso serve apenas para coisas como remover o botão de login no site externo.

Posso verificar meu código mais tarde. Não o vejo há algum tempo, mas acho que ele fazia algo assim.

Obrigado pela resposta! Agradeço muito.

Sim, agora está claro para mim. A única limitação ao fazer logout com a API é que o usuário será desconectado de todas as sessões (em todos os dispositivos, já que a API não consegue distinguir entre a sessão atual do navegador e outros navegadores com sessão ativa).