Desde a atualização do DiscourseSSO para o DiscourseConnect, nossa integração SSO parou de funcionar.
Temos uma configuração provavelmente incomum, na qual existem vários aplicativos dos quais o SSO pode ser iniciado, em vez de apenas um. Nosso software pode ser instalado localmente ou em múltiplos inquilinos na nuvem. Cada instância de inquilino do software inclui um link SSO para nossa comunidade Discourse. Isso significa que podemos iniciar o SSO a partir de (por exemplo) tenant1.ourcompany.com, software.tenant2.com e something.else.com — quase mil locais diferentes.
Não temos um único provedor de identidade central para todos os nossos inquilinos; cada um pode usar sua própria solução de IDP (Google, O365, AD, Okta, …). No lado do servidor, temos processos e mitigações implementados para proteger contra sequestro de contas.
Infelizmente, nossa abordagem aqui parece ter deixado de funcionar na atualização mais recente do Discourse. (Graças a este commit.) Do ponto de vista técnico, o fluxo que funcionava era o seguinte:
- Nosso backend, via API, obtinha um nonce e detalhes do SSO do Discourse
- O Discourse enviava um redirecionamento 301 com a carga útil do SSO de volta para nós em um endereço específico
- O servidor aqui estava configurado para ignorar o redirecionamento 301 (para evitar erros de nonce). Em vez disso, ele analisava o cabeçalho
Location, decodificava os valores em base64, obtinha o nonce, gerava a carga útil do SSO, assinava com o segredo do SSO e enviava o usuário de volta para a URL de login do SSO.
Parece que o nonce foi alterado para que fique vinculado à sessão do navegador (para proteger contra ataques CSRF). Isso significa que, ao tentarmos o fluxo acima, o navegador do cliente não possui o cookie _forum_session com o nonce quando o redirecionamos de volta ao Discourse, e assim recebemos a mensagem “nonce expirado”.
É possível tornar essa proteção CSRF opcional? Ou seja, ter uma nova configuração para enable_secure_nonce que possamos definir como false?
No momento, a maioria de nossos clientes está bloqueada fora do nosso fórum, e estamos considerando ter que pedir a todos que configurem senhas, perdendo nossa capacidade de rastrear notificações do fórum em nosso aplicativo — o que resultará em uma queda no engajamento. ![]()