Eu encontrei o mesmo problema e ele acontece ao fazer login com o Google. Antes do WordPress, usamos Nginx como um proxy reverso. Isso poderia estar relacionado?
Estou assumindo que isso está acontecendo ao fazer login no WordPress através do seu site Discourse. Se for esse o caso, o problema é que o nonce gerado pelo WordPress expirou. Isso acontece em sites WordPress que têm um Cache de Objeto ativado.
Uma solução é desativar o Cache de Objeto em qualquer página que tenha o link “Login com Discourse”. Para essa abordagem, certifique-se de que o Cache de Objeto esteja desativado para usuários anônimos.
Outra solução está descrita aqui: Wordpress SSO Expired nonce - #15 by simon. A função nesse post pode ser copiada exatamente como está para o arquivo functions.php do seu tema WordPress.
Essa função adiciona uma string aleatória ao URL de Login com Discourse. A string aleatória aciona o WordPress para quebrar o cache e gerar um novo nonce para o usuário. @angus, isso provavelmente deveria ser adicionado ao código do plugin: wp-discourse/lib/sso-client/sso-client-base.php at main · discourse/wp-discourse · GitHub. Não há desvantagens nisso, e eu não acho que haja outra maneira de lidar com o cache de objetos causando o uso de nonces desatualizados em vez de gerar novos para cada visita.
Muito obrigado pela resposta. Assim que lançarmos o Discourse em operação, tentaremos desativar o cache Nging no site WordPress e, se isso não funcionar, editaremos o functions.php de acordo com as instruções.
Obrigado @simon!
Tenho um pouco de dificuldade em entender por que isso limparia o cache de objetos do WordPress, pois normalmente adicionar uma string aleatória a um URL é usado para evitar o cache do navegador. Qual consulta está sendo armazenada em cache no cache de objetos do WordPress? Estou vendo um motivo não relacionado ao cache de objetos pelo qual essa abordagem pode funcionar
No entanto, se for esse o caso, podemos precisar de um ajuste ligeiramente diferente. Mas talvez eu esteja perdendo alguma coisa?
O problema não é com o cache de objetos do WordPress, pois, até onde sei, ele não é persistente entre as requisições. O problema ocorre com sites que possuem algum tipo de cache persistente: https://developer.wordpress.org/reference/classes/wp_object_cache/#persistent-caching. Isso pode ser configurado através de um plugin, mas também é habilitado por padrão por alguns provedores de hospedagem, por exemplo, a WP Engine. Acredito que no caso da WP Engine, eles não habilitam o cache de objetos em sua página de login, mas o habilitam para usuários anônimos em todas as outras páginas. Portanto, na WP Engine, o problema só é acionado se o link “login with Discourse” for adicionado a uma página diferente da página de login.
O problema com o discourse_sso_url é que, quando ele é sempre definido com o mesmo valor, para sites que têm um cache persistente habilitado, ele sempre retornará o mesmo nonce. Definir seu valor discourse_sso para uma string aleatória, em vez de seu valor padrão de 1, quebra o cache. Pelo menos sempre funcionou dessa forma quando testei anteriormente. No momento, não tenho as coisas configuradas para testar.
Editar: há mais alguns detalhes sobre o problema aqui: Discourse (as provider) + WP SSO nonce error - #14 by simon. Faz um bom tempo que não olho para isso. A correção para o problema na época parecia ser tanto adicionar uma string aleatória ao discourse_sso_url quanto garantir que o cache de página não estivesse habilitado na página onde o link de login era exibido (caso contrário, a string aleatória não será única para cada visita de um usuário anônimo).
Entendi. Obrigado pela explicação.
Acho que devemos talvez dar um passo de cada vez, pois estou receoso de aplicar uma correção aqui sem ter certeza de que será “pluralista”, ou seja, que funcionará com diferentes abordagens de cache.
Também ainda não entendi completamente o papel dos vários caches em causar este problema específico, em particular os papéis distintos dos caches de objetos persistentes e de páginas (se estiverem presentes). Posso entender por que um cache de página pode causar esse problema, mas não um cache de objeto persistente (ainda). Se for este último, talvez queiramos ajustar as consultas em nossa classe Nonce.
Precisarei testar isso com um pouco mais de profundidade na próxima semana.
@Petr_Mišák Você poderia, por favor, primeiro tentar desativar qualquer cache de página que você tenha na página com o link de login e nos informar como foi?
Tentarei desabilitar nosso Nginx Microcache para uma página de teste de login no WordPress. Nossa página de teste onde fazemos login no WordPress através do Discourse está aqui Test Discourse Login | Svět Androida
Eu (ocasionalmente) notei o problema se eu usar o login do Google para fazer login.
Mas agora estou surpreso que os links de login do Discourse que colocamos na página usando o shortcode desapareceram da nossa página de teste.
Alguém tem alguma ideia de por que isso está acontecendo?
Até que eu resolva o problema com a página de teste de login, não tenho “nonce expirado” para testá-lo.
Por favor, primeiro certifique-se de que não há algum tipo de problema de cache. Informe-nos como você se sai com isso.
Entendido, vamos resolver isso passo a passo, concordo.
Parece que o erro também ocorre com o login oficial. Aqui está um e-mail para simulá-lo para que você possa tentar por si mesmo.
- vá para a página Přihlásit se ‹ Svět Androida — WordPress
- faça login usando “Entrar com o Discourse” e use sua conta do Google lá
- após fazer login no Discourse, você será redirecionado de volta para https://www.svetandroida.cz/ ou https://www.svetandroida.cz/wp-login.php com uma mensagem de erro, veja a captura de tela.
Está mal testado porque o problema nem sempre aparece.
Por favor, tente e me diga se você obtém o erro antes que eu desative o Nginx Cache. Obrigado
Verifiquei o status do nosso Nginx Microcache em Přihlásit se ‹ Svět Androida — WordPress, mas parece que o Nginx Microcache não é usado lá. O problema com o “nonce expirado” estará, portanto, relacionado a outra coisa.
Olá @Petr_Mišák, só verificando se você conseguiu encontrar o culpado por isso?
Nós procuramos, mas até agora, infelizmente, sem sucesso. Mas continuaremos a procurar e a investigar a causa do problema.
Verifiquei o status do nosso Nginx Microcache em Přihlásit se ‹ Svět Androida — WordPress, mas parece que o Nginx Microcache não é usado lá.
Tenho quase certeza de que o problema ao fazer login em https://www.svetandroida.cz/ através do Discourse está relacionado ao nonce estar em cache. A maneira como testei isso foi clicando no link “Log in with Discourse” (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F).
Na primeira vez que fiz isso, fui redirecionado para https://komunita.svetandroida.cz/, criei uma conta no site do Discourse com o Gmail e, em seguida, fui redirecionado de volta para o seu site WordPress como um usuário logado.
Em seguida, saí do seu site WordPress e tentei fazer login novamente clicando no link “Login with Discourse”. Desta vez, recebi o erro “nonce expirado”.
Em seguida, gerei um link de login com um valor aleatório para o parâmetro de URL discourse_sso, por exemplo, https://www.svetandroida.cz/?discourse_sso=181253058&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F e consegui fazer login no seu site WordPress através do Discourse sem problemas.
Tentei isso algumas vezes, tanto com o link de login gerado pelo plugin (https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F) quanto com links de login que têm um valor aleatório definido para o parâmetro discourse_sso. Parece que o nonce retornado está em cache por pelo menos alguns minutos.
Sem depurar totalmente o problema, tenho quase certeza de que você pode fazer as coisas funcionarem apenas adicionando o seguinte ao arquivo functions.php do seu tema (ele definirá uma string aleatória para o parâmetro de URL discourse_sso. Isso deve funcionar, desde que não haja também “cache de página” ativado na sua página de login.)
add_filter('wpdc_sso_client_query', 'wpdc_custom_sso_client_query' );
function wpdc_custom_sso_client_query() {
return wp_generate_password( 12, false );
}
Se você quiser depurar o problema, aqui está o que estou vendo para uma solicitação bem-sucedida. Observe a linha Cache-Svetzitrka: STALE. Isso pode indicar que há uma camada de cache personalizada em vigor e que o cache estava STALE para a solicitação bem-sucedida (portanto, um novo nonce foi gerado.)
Resumo
Request URL:
https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F
Request Method:
GET
Status Code:
302 Found
Remote Address:
93.185.102.156:443
Referrer Policy:
strict-origin-when-cross-origin
Cache-Control:
max-age=0
Cache-Svetzitrka:
STALE
Content-Length:
0
Content-Type:
text/html; charset=UTF-8
Date:
Mon, 11 Dec 2023 09:38:05 GMT
Expires:
Mon, 11 Dec 2023 09:21:47 GMT
Location:
https://komunita.svetandroida.cz/session/sso_provider?sso=bm9uY2U9MGU3NTNjYWNhNjMwNmMzNzM5M2MyODk4MjZlYzMxMjQmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ3d3cuc3ZldGFuZHJvaWRhLmN6JTJG&sig=32ddcc85bd2dd7175f963e791cc9ac734a607355d773422d3abec6173c9f656b
Server:
nginx
Strict-Transport-Security:
max-age=10886400; includeSubdomains; preload
X-Content-Type-Options:
nosniff
X-Frame-Options:
SAMEORIGIN
X-Redirect-By:
WordPress
Aqui está o que estou vendo para uma solicitação com falha. A linha Cache-Control: no-cache, no-store parece indicar que a resposta não deveria ser armazenada em cache, mas a entrada from service worker na resposta indica que a resposta pode estar vindo do cache de um service worker.
Resumo
Request URL:
https://www.svetandroida.cz/?discourse_sso=1&redirect_to=https%3A%2F%2Fwww.svetandroida.cz%2F
Request Method:
GET
Status Code:
302 Found (from service worker)
Referrer Policy:
strict-origin-when-cross-origin
Cache-Control:
no-cache, no-store
Content-Security-Policy:
upgrade-insecure-requests; base-uri 'self'; object-src 'none'; script-src https://komunita.svetandroida.cz/logs/ https://komunita.svetandroida.cz/sidekiq/ https://komunita.svetandroida.cz/mini-profiler-resources/ https://komunita.svetandroida.cz/assets/ https://komunita.svetandroida.cz/extra-locales/ https://komunita.svetandroida.cz/highlight-js/ https://komunita.svetandroida.cz/javascripts/ https://komunita.svetandroida.cz/plugins/ https://komunita.svetandroida.cz/theme-javascripts/ https://komunita.svetandroida.cz/svg-sprite/ https://www.google-analytics.com/analytics.js https://www.googletagmanager.com/gtag/js 'sha256-8uAKDaK4QxxCeYZl0Wxad2Nnj2tgKyA14hYBh66pnn0='; worker-src 'self' https://komunita.svetandroida.cz/assets/ https://komunita.svetandroida.cz/javascripts/ https://komunita.svetandroida.cz/plugins/; frame-ancestors 'self'; manifest-src 'self'
Content-Type:
text/html; charset=utf-8
Date:
Mon, 11 Dec 2023 09:38:05 GMT
Discourse-Logged-Out:
1
Location:
https://komunita.svetandroida.cz/login
Referrer-Policy:
strict-origin-when-cross-origin
Server:
nginx
Set-Cookie:
sso_payload=sso%3Dbm9uY2U9MGU3NTNjYWNhNjMwNmMzNzM5M2MyODk4MjZlYzMxMjQmcmV0dXJuX3Nzb191cmw9aHR0cHMlM0ElMkYlMkZ3d3cuc3ZldGFuZHJvaWRhLmN6JTJG&sig=32ddcc85bd2dd7175f963e791cc9ac734a607355d773422d3abec6173c9f656b; path=/; SameSite=Lax
Set-Cookie:
_forum_session=kGW2K6gafsjS90qQMEmxzjggEYo4tZPZe76XZNVro34ilyuuHsaYt2nEzC9h6tfiSBmY9XoDdxh1SV3S8n%2BwqrbsD58UvJBz6khjm%2Fty83ufkgry8daHDdyoTfFwQOjAbXrWeGIwkS4edGY1XetNwXhu%2FNJUghqmq8BEUycBt7098KUO%2BmRYDl5iSL0FNhUzo5Hc7xwRg0tfxuxmb%2FIyVLnbFz6IJuGB3Y95PRcU5DYIwAAny1GQbKQ23kSjgALxAThG7aA%2B7LCI9cJNWV1JRSy%2FTElDN3iugKuVpaQcrSPhV3SvQaiNH3MCfLwu6yxlp%2BZ%2BwTyw22czX8bb197z36WhlbghYtxvKYGRjONJQUagisjPpMrCAcGeTKsGB4JgnUKCtlrwIoFvaDxjec7hMo3aCnibbbkmcxWc6LvD6G2xaxkDgebe7RpvfTYdG8cn8j6rNwX3hM8la4RqZnmma0%2FQlSrfj0BjfY7lnan6TYm28vLwH%2FFfdZoRbo6JdTs5AFjCJvx9UXSjFmoXHH1R1yfAizPeKDFnpiuUs4a%2FBzWafQ%3D%3D--8PEvbWwpqBuJMSRJ--CzzhBea4mmv58a7KLEnukw%3D%3D; path=/; secure; HttpOnly; SameSite=Lax
Set-Cookie:
_t=; path=/; max-age=0; expires=Thu, 01 Jan 1970 00:00:00 GMT; SameSite=Lax
Strict-Transport-Security:
max-age=31536000
Vary:
Accept
X-Content-Type-Options:
nosniff
X-Discourse-Route:
session/sso_provider
X-Download-Options:
noopen
X-Frame-Options:
SAMEORIGIN
X-Permitted-Cross-Domain-Policies:
none
X-Request-Id:
001750b9-94f2-4bf0-8503-9d673463b91e
X-Runtime:
0.012335
X-Xss-Protection:
0



