Problème pour que la connexion Salesforce fonctionne avec dj-rest-auth + django-allauth

Dec 03 2020

Mon application a un backend Django 3.1 avec django-allauth et dj-rest-auth (fork activement pris en charge de django-rest-auth ).

Mes interfaces mobiles et Web peuvent déjà se connecter via Facebook et Google via REST. J'essaie maintenant d'ajouter Salesforce comme troisième méthode de connexion sociale REST, mais je rencontre des problèmes.

J'ai suivi les instructions de django-allauth pour Salesforce :

  • Création d'une application connectée Salesforce avec des portées id et openid (ainsi que quelques autres), et définissez l'URL de rappel sur https://www.mywebdomain.com/accounts/salesforce/login/callback/
  • Création d'une application sociale dans Django avec l'ID client, le secret et l'URL de connexion dans le champ "Clé" (https://login.salesforce.com/)
  • Inclus allauth.socialaccount.providers.salesforce dans INSTALLED_APPS

J'utilise JSforce côté client pour lancer la demande d'authentification Salesforce dans le frontend, mais je suis ouvert à d'autres méthodes si elles sont plus simples / meilleures / etc.

L'exécution jsforce.browser.login()du code JS de mes clients ouvre une fenêtre contextuelle de connexion Salesforce. Après avoir saisi les informations de connexion Salesforce, le système Salesforce est redirigé vers mon URL de rappel définie, ce qui donne une page contenant le texte suivant:

Échec de connexion au réseau social
Une erreur s'est produite lors de la tentative de connexion via votre compte de réseau social.

L'URL dans la barre d'adresse de cette page ressemble à ceci:

https://www.mywebdomain.com/accounts/salesforce/login/callback/#access_token=00D3t000004QWRm%21ARwAQPfHWiM6jdB43dlyW6qjEw._34mjzGi_Jv6YCXp0QssT.9F9lCge5_YaH8gqTy3Od6SywCs8X9zOGv145SyviBVeGdn0&instance_url=https%3A%2F%2Fna123.salesforce.com&id=https%3A%2F%2Flogin.salesforce.com%2Fid%2F00D3t000004QWRmEAO%2F0053t000008QBetAAG&issued_at=1606802917608&signature=KvxAX0WBCFQYY%2BO25id9%2FXxpbh2q2d2vWdQ%2FFV5FCBw%3D&state=jsforce0.popup.c0ockgct29g&scope=id+api+web+refresh_token+openid&token_type=Bearer

J'ai essayé de déboguer et imprimer l'erreur dans mon back - end, mais les deux auth_error.codeet auth_error.exceptionétaient blancs / vides.

J'ai également essayé d'envoyer le access_tokenhachage de cette URL à mon point de terminaison d'API Salesforce (voir ci-dessous), mais cela a entraîné une erreur 400 ("Valeur incorrecte").

Voici comment j'ai défini mes SocialLoginViews dans mon views.py, sur la base de la documentation d'authentification sociale de dj-rest-auth :

from dj_rest_auth.registration.views import SocialLoginView
from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter
from allauth.socialaccount.providers.google.views import GoogleOAuth2Adapter
from allauth.socialaccount.providers.salesforce.views import SalesforceOAuth2Adapter


class FacebookLogin(SocialLoginView):
    adapter_class = FacebookOAuth2Adapter


class GoogleLogin(SocialLoginView):
    adapter_class = GoogleOAuth2Adapter


class SalesforceLogin(SocialLoginView):
    adapter_class = SalesforceOAuth2Adapter

Mes urls.py:

from .views import FacebookLogin, GoogleLogin, SalesforceLogin

urlpatterns = [
    ...
    # Sending access_token to the Facebook and Google REST endpoints works,
    # but doing the same for the Salesforce REST endpoint does not (400 error: "Incorrect value")
    url(r'^api/rest-auth/facebook/$', FacebookLogin.as_view(), name='fb_login'), url(r'^api/rest-auth/google/$', GoogleLogin.as_view(), name='google_login'),
    url(r'^api/rest-auth/salesforce/$', SalesforceLogin.as_view(), name='salesforce_login'),
    ...
]

Comment l'authentification sociale Salesforce peut-elle fonctionner dans cette application?

Réponses

sunw Jan 27 2021 at 23:40

Je l'ai compris et je l'ai fait fonctionner: lors de la publication sur mon point de terminaison d'API Salesforce dj-rest-auth, je n'incluais que access_tokendans mon corps POST. J'ai en fait besoin des deux access_tokenet key, où se keytrouve l'URL de connexion Salesforce ( "https://login.salesforce.com").

C'était en effet dans les instructions de django-allauth pour Salesforce , mais j'ai mal interprété le libellé. Je sais maintenant qu'il dit d'exiger à la fois access_tokenet keydans le corps POST.