Probleme mit der Salesforce-Anmeldung mit dj-rest-auth + django-allauth

Dec 03 2020

Meine App verfügt über ein Django 3.1-Backend mit django-allauth und dj-rest-auth (aktiv unterstützte Verzweigung von django-rest-auth ).

Meine Handy- und Web-Frontends können sich bereits über REST über Facebook und Google anmelden. Ich versuche jetzt, Salesforce als dritte soziale REST-Anmeldemethode hinzuzufügen, stoße jedoch auf Probleme.

Ich habe die Anweisungen von django-allauth für Salesforce befolgt :

  • Erstellt eine Salesforce Connected App mit ID- und OpenID-Bereichen (zusammen mit einigen anderen) und setzt die Rückruf-URL auf https://www.mywebdomain.com/accounts/salesforce/login/callback/
  • Erstellt eine SocialApplication in Django mit Client-ID, Geheimnis und Anmelde-URL im Feld "Schlüssel" (https://login.salesforce.com/)
  • Allauth.socialaccount.providers.salesforce in INSTALLED_APPS enthalten

Ich habe clientseitiges JSforce verwendet , um die Salesforce - Authentifizierungsanforderung im Frontend zu starten, bin aber offen für andere Methoden, wenn sie einfacher / besser / etc. Sind.

Wenn Sie jsforce.browser.login()den JS-Code meiner Kunden ausführen, wird ein Salesforce-Anmelde-Popup geöffnet. Nach Eingabe der Salesforce-Anmeldeinformationen wurde das Salesforce-System zu meiner definierten Rückruf-URL umgeleitet, sodass eine Seite mit dem folgenden Text angezeigt wurde:


Fehler bei der Anmeldung in sozialen Netzwerken Beim Versuch, sich über Ihr Konto in sozialen Netzwerken anzumelden, ist ein Fehler aufgetreten.

Die URL in der Adressleiste auf dieser Seite sieht ungefähr so ​​aus:

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

Ich habe versucht , zu debuggen und drucken Sie die Fehler in meinem Back - End, aber beide auth_error.codeund auth_error.exceptionwaren leer / leer.

Ich habe auch versucht, den access_tokenHash dieser URL an meinen Salesforce-API-Endpunkt zu senden (siehe unten), aber das führte zu einem 400-Fehler ("Falscher Wert").

So habe ich mein SocialLoginViews in meiner views.py definiert, basierend auf der Social Auth-Dokumentation von 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

Meine 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'),
    ...
]

Wie kann Salesforce Social Auth in dieser App zum Funktionieren gebracht werden?

Antworten

sunw Jan 27 2021 at 23:40

Ich habe es herausgefunden und zum Laufen gebracht: Beim Posten auf meinem Salesforce-API-Endpunkt dj-rest-auth habe ich nur access_tokenin meinen POST-Text aufgenommen. Ich brauche eigentlich beides access_tokenund keywo keyist die Salesforce-Anmelde-URL ( "https://login.salesforce.com").

Es war zwar in den Django-Allauth-Anweisungen für Salesforce enthalten , aber ich habe den Wortlaut falsch interpretiert. Ich weiß jetzt, dass es heißt, sowohl access_tokenals auch keyim POST-Körper zu verlangen .