Erreur lors de l'utilisation du plugin discourse-oauth2-basic avec NeonCRM

Je pense commencer par supprimer notre Droplet actuel et le configurer à nouveau depuis zéro, car ce Docker a été mis en place il y a quelques années. Je reviendrai vers vous une fois que j’aurai fait cela et effectué les tests.

Ça semble être un bon plan. Pour la plupart des communautés, nous recommandons de rester sur la branche par défaut tests-passed, car elle vous offre les toutes dernières fonctionnalités et corrections de bugs de Discourse. De nombreux changements ont été apportés à l’authentification depuis la dernière version stable, il est donc possible que certaines choses commencent à fonctionner d’elles-mêmes.

@david, j’ai pris le temps de réessayer aujourd’hui. J’utilise maintenant une installation fraîche de Discourse (la dernière version stable, comme vous l’avez suggéré).

J’ai configuré OAuth2 en utilisant le plugin, exactement comme avant, avec les paramètres suivants :

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

Si j’utilise l’URL formatée manuellement, j’obtiens ceci (ce qui est nouveau) :

L'autorisation a expiré, ou vous avez changé de navigateur. Veuillez réessayer.

Et l’erreur habituelle dans les journaux :

(oauth2_basic) Échec d'authentification ! csrf_detected : OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF détecté

D’un autre côté, si j’utilise le bouton OAuth2 dans la fenêtre de connexion de Discourse, j’obtiens :

Oups

Le logiciel qui alimente ce forum de discussion a rencontré un problème inattendu. Nous nous excusons pour la gêne occasionnée.

Des informations détaillées sur l'erreur ont été enregistrées et une notification automatique a été générée. Nous allons l'examiner.

Je rencontre également les erreurs suivantes consignées dans /logs :

ArgumentError (URI invalide : ) /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/excon-0.71.0/lib/excon.rb:126:in `new'

et

Échec de la gestion de l'exception dans le middleware de l'application d'exception : URI invalide :

@david J’ai essayé votre précédente suggestion concernant la configuration de oauth2_user_json_url et la désactivation de oauth2_fetch_user_details, et j’ai obtenu plusieurs (nouveaux) erreurs après l’avoir essayé :

ActiveRecord::NotNullViolation (PG::NotNullViolation: ERREUR : la valeur NULL dans la colonne “provider_uid” viole la contrainte not-null
DÉTAIL : La ligne échouée contient (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’

Échec de la gestion de l’exception dans le middleware de l’application d’exception : PG::NotNullViolation: ERREUR : la valeur NULL dans la colonne “provider_uid” viole la contrainte not-null
DÉTAIL : La ligne échouée contient (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).

Et bien sûr, l’habituel :

(oauth2_basic) Échec d’authentification ! csrf_detected : OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF détecté

Cependant, j’ai remarqué dans ce dernier (CSRF détecté) que dans l’onglet env, il est indiqué :

hostname forum-app
process_id 762
application_version db7d00a8dce2cc1f7b9d86192cde1f55dd57408b
HTTP_HOST forum.efao.ca

Est-il normal que le nom d’hôte ne corresponde pas au nom HTTP_HOST ? Cela pourrait-il être la raison pour laquelle j’obtiens une erreur CSRF ?

Salut Denis,

Quelques nouvelles ?
J’ai eu la même erreur :
ActiveRecord::NotNullViolation (PG::NotNullViolation: ERROR: null value in column “provider_uid” violates not-null constraint

Comment as-tu résolu le problème ?

Merci,
Beam

Denis et moi avons constaté que NeonCRM ne respecte pas vraiment la spécification OAuth2… ils envoient l’identifiant utilisateur (user_id) dans la variable access_token, qui ne peut pas être utilisé comme un vrai jeton d’accès.

Ainsi, vous devez désactiver oauth2_fetch_user_details et définir oauth2_callback_user_id_path sur token (et non access_token, car la bibliothèque Ruby OAuth2 le renomme pour un usage interne).

Avec cela, cela devrait fonctionner, mais il n’y a aucun moyen de récupérer l’adresse e-mail ou le nom de l’utilisateur.

Salut Denis,

J’utilise Mattermost, donc le comportement est différent.
Cependant, tes infos m’ont poussé à examiner davantage les paramètres, et ça fonctionne maintenant, merci !!

Voici mes paramètres pour Mattermost en tant que fournisseur OAuth2 pour Discourse :

Paramètres au format texte pour les moteurs de recherche :

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 : COCHÉ
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 : COCHÉ

Côté Mattermost, l’URL de rappel (callback) est configurée ainsi :
https://base.animalrebellion.org/auth/oauth2_basic/callback

J’aimerais toujours savoir comment fusionner first_name et last_name dans le champ “json name path” pour obtenir full_name, mais je peux me contenter d’utiliser la propriété “username” ou “first_name”.

J’espère que cela t’aidera.

Salutations !
Beam

Liens vers les ressources :
Lien vers le plugin : GitHub - discourse/discourse-oauth2-basic: A basic OAuth2 plugin for use with Discourse · GitHub
Lien sur la façon d’installer un plugin Discourse : Install plugins on a self-hosted site

Content que ça fonctionne pour toi, @Beam !