Acho que vou começar apagando nosso Droplet atual e configurando-o do zero novamente, já que esse Docker foi configurado há alguns anos. Vou dar um retorno quando tiver feito isso e testado.
Parece um bom plano. Para a maioria das comunidades, recomendamos manter a branch tests-passed padrão, pois ela oferece os recursos e correções de bugs mais recentes do Discourse. Houve muitas mudanças na autenticação desde o último lançamento estável, então você pode descobrir que as coisas começam a funcionar sozinhas.
@david, hoje tomei a liberdade de tentar novamente. Agora estou usando uma instalação fresca do Discourse (a mais recente na versão estável, como você sugeriu).
Configurei o OAuth2 usando o plugin, exatamente como antes, com as seguintes configurações:
oauth2 client id: MY-CLIENT-ID
oauth2 client secret: MY-CLIENT-SECRET
oauth2 authorize url: https://MY-NEON-ID.z2systems.com/np/oauth/auth
oauth2 token url: https://www.z2systems.com/np/oauth/token
Se eu usar a URL formatada manualmente, recebo esta mensagem (que é nova):
A autorização expirou ou você trocou de navegador. Por favor, tente novamente.
E o erro habitual nos logs:
(oauth2_basic) Falha na autenticação! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado
Por outro lado, se eu usar o botão OAuth2 na janela de login do Discourse, recebo:
Oops
O software que alimenta este fórum de discussão encontrou um problema inesperado. Pedimos desculpas pelo inconveniente.
Informações detalhadas sobre o erro foram registradas e uma notificação automática foi gerada. Vamos analisá-la.
Também recebo os seguintes erros registrados em /logs:
ArgumentError (URI inválido: ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'
e
Falha ao tratar exceção no middleware de app de exceção: URI inválido:
@david Tentei sua sugestão anterior sobre configurar oauth2_user_json_url e desativar oauth2_fetch_user_details, e obtive vários erros (novos) ao tentar:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERRO: valor nulo na coluna “provider_uid” viola a restrição not-null
DETALHE: Linha com falha contém (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
)
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/rack-mini-profiler-1.1.4/lib/patches/db/pg.rb:69:in `async_exec_params’
Falha ao lidar com exceção no middleware do app de exceção: PG::NotNullViolation: ERRO: valor nulo na coluna “provider_uid” viola a restrição not-null
DETALHE: Linha com falha contém (1, oauth2_basic, null, null, 2019-12-19 01:00:49.076659, {}, {“token”: “9607”, “expires”: false}, {}, 2019-12-19 01:00:49.077107, 2019-12-19 01:00:49.077107).
E, claro, o habitual:
(oauth2_basic) Falha na autenticação! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado
No entanto, notei neste último (CSRF detectado) que na aba env, está escrito:
hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca
É normal que o hostname não corresponda ao nome do HTTP_HOST? Isso poderia ser a razão pela qual recebo o erro de CSRF?
Ei Denis,
conseguiu resolver?
Eu estou com o mesmo erro:
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERRO: valor nulo na coluna “provider_uid” viola a restrição not-null
Como você corrigiu isso?
Obrigado,
Beam
Denis e eu descobrimos que o NeonCRM não está realmente seguindo a especificação OAuth2… eles estão enviando o user_id dentro da variável access_token, e ela não pode ser usada como um token de acesso real.
Portanto, você precisa desativar o oauth2_fetch_user_details e definir oauth2_callback_user_id_path como token (não access_token, porque a biblioteca Ruby OAuth2 renomeia para uso interno).
Com isso, deve funcionar, mas não há como obter o e-mail/nome do usuário.
Oi Denis,
Estou usando o Mattermost, então o comportamento é um pouco diferente.
No entanto, suas informações me levaram a examinar mais as configurações e consegui fazer funcionar, obrigado!!
Aqui estão minhas configurações para usar o Mattermost como provedor OAuth2 no Discourse:
Configurações em texto para mecanismos de busca:
oauth2 client id: <client id from mattermost oauth2 provider setup>
oauth2 client secret: <client secret from mattermost oauth2 provider setup>
oauth2 authorize url:https://chat.animalrebellion.org/oauth/authorize
oauth2 token url:https://chat.animalrebellion.org/oauth/access_token
oauth2 token url method: POST
oauth2 callback user id path:
oauth2 callback user info paths
oauth2 fetch user details: MARCADO
oauth2 user json url:https://chat.animalrebellion.org/api/v4/users/me
oauth2 user json url method: GET
oauth2 json user id path: id
oauth2 json username path: username
oauth2 json name path: username
oauth2 json email path: email
oauth2 json email verified path: email_verified
oauth2 json avatar path:
oauth2 email verified: MARCADO
No lado do Mattermost, a URL de callback está configurada como:
https://base.animalrebellion.org/auth/oauth2_basic/callback
Ainda gostaria de saber como juntar first_name e last_name no “json name path” como full_name, mas posso viver apenas usando a propriedade “username” ou “first_name”.
Espero ter ajudado!
Abraços!
Beam
Links para recursos:
Link para o plugin: GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
Link sobre como instalar o plugin do Discourse: Install plugins on a self-hosted site
Fico feliz que tenha funcionado, @Beam!
