Probleme mit der Salesforce-Anmeldung mit dj-rest-auth + django-allauth
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.code
und auth_error.exception
waren leer / leer.
Ich habe auch versucht, den access_token
Hash 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 SocialLoginView
s 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
Ich habe es herausgefunden und zum Laufen gebracht: Beim Posten auf meinem Salesforce-API-Endpunkt dj-rest-auth habe ich nur access_token
in meinen POST-Text aufgenommen. Ich brauche eigentlich beides access_token
und key
wo key
ist 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_token
als auch key
im POST-Körper zu verlangen .