Implémenter la connexion Apple pour discourse via API

Bonjour, je travaille à la création d’une API pour la connexion à Discourse en utilisant Apple. J’ai déjà installé le plugin et suivi les instructions de Authentification Apple pour Discourse. Cela fonctionne bien lors de la connexion à Discourse en utilisant un compte Apple sur le site web.

Après avoir vérifié le flux de connexion Apple depuis le web, j’ai remarqué qu’il redirige vers la page Apple pour la connexion, obtient un code généré par Apple lors d’une connexion réussie, puis redirige vers :

POST {{discourse_host}}/auth/apple/callback avec les paramètres state:{state}, code:{code from Apple}

Après cela, il redirige vers GET {{discourse_host}}/auth/apple/callback?code={{code from Apple}}&state={state}, générant un nouveau cookie qui sera utilisé dans l’API Discourse.

À partir de ce flux, je m’attends à ce qu’un nouveau cookie soit généré après l’appel /auth/apple/callback.

Mais lorsque j’essaie d’appeler l’API, j’obtiens l’erreur Authorization timed out, or you have switched browsers. Please try again.

J’ai donc réessayé avec un nouveau code généré par Apple, mais j’ai toujours la même erreur.

Et lorsque je vérifie le journal, il indique :

Started GET "/auth/apple/callback?code=c32f105b5084d42b8bd3e7051873ddb55.0.rrzxz.pChPU9zGlXIHHhgEXLiA5g&state=fbi3bbboud" for
(apple) Setup endpoint detected, running now.
(apple) Callback phase initiated.
(apple) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected
Started GET "/auth/failure?message=csrf_detected&strategy=apple" for 123.253.233.16 at 2023-11-27 06:10:28 +0000
Processing by Users::OmniauthCallbacksController#failure as HTML
  Parameters: {"message"=>"csrf_detected", "strategy"=>"apple"}
  Rendered users/omniauth_callbacks/failure.html.erb within layouts/no_ember (Duration: 4.1ms | Allocations: 17)
  Rendered layout layouts/no_ember.html.erb (Duration: 57.5ms | Allocations: 2882)

Message (47 copies reported)

(apple) Authentication failure! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detected

Backtrace

/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:163:in `log'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:486:in `fail!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-oauth2-1.7.3/lib/omniauth/strategies/oauth2.rb:87:in `callback_phase'
/var/www/discourse/plugins/discourse-apple-auth/lib/omniauth_apple.rb:60:in `callback_phase'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:238:in `callback_call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:189:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:192:in `call!'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:169:in `call'
/var/www/discourse/vendor/bundle/ruby/3.2.0/gems/omniauth-1.9.2/lib/omniauth/strategy.rb:192:in `call!'

Je voudrais donc demander si cette direction pour utiliser la connexion Apple de Discourse via l’API est correcte et comment résoudre le problème de l’erreur csrf_detected.

L’authentification Apple (et, en fait, toutes les autres méthodes d’authentification dans Discourse) n’est pas conçue pour être utilisée via l’API. Elle doit être utilisée directement par les utilisateurs finaux dans un navigateur pris en charge.

Quel problème essayez-vous de résoudre ici ? Peut-être pouvons-nous trouver une solution alternative ?

1 « J'aime »

Salut @david, merci pour ta réponse. Ce que je veux réaliser ici, c’est créer une API pour la connexion Apple qui sera utilisée par l’application mobile pour accéder à l’API Discourse.

Pour utiliser l’API Discourse afin de se connecter avec un e-mail et un mot de passe, cela fonctionne bien en utilisant ces deux API Discourse :

  1. {{discourse_host}}/session/csrf.json : Cette API renvoie un cookie et un code CSRF, qui seront utilisés pour la connexion en utilisant l’API suivante.
  2. {{discourse_host}}/session : Cette API renvoie un nouveau cookie qui peut être utilisé pour accéder à d’autres API Discourse.
API Csrf

Session

Je m’attends à ce que ce soit similaire à la connexion Apple dans Discourse, où je fais une requête à l’API Discourse pour générer le cookie _t.

Salut @david, as-tu une solution à mon problème ?

Je crains qu’il n’y ait pas de réponse simple. Les API d’authentification comme celle-ci sont spécifiquement conçues pour éviter qu’elles ne soient déclenchées sans interaction réelle de l’utilisateur sur le web.

Pour votre cas d’utilisation, la solution la plus courante serait d’utiliser le système de clés API utilisateur. Cela permettra à Discourse de gérer 100 % de la logique d’authentification et donnera à votre application des clés API par utilisateur. Cette stratégie devrait être beaucoup plus robuste que d’essayer de « simuler » une session utilisateur.

1 « J'aime »