Problem z zalogowaniem się do Salesforce podczas pracy z dj-rest-auth + django-allauth

Dec 03 2020

Moja aplikacja ma zaplecze Django 3.1 z django-allauth i dj-rest-auth (aktywnie wspierane rozwidlenie django-rest-auth ).

Moje frontendy mobilne i internetowe mogą już logować się za pomocą Facebooka i Google przez REST. Próbuję teraz dodać Salesforce jako trzecią metodę logowania społecznościowego REST, ale napotykam problemy.

Mam podanymi instrukcjami Django allauth dla Salesforce :

  • Utworzono połączoną aplikację Salesforce z identyfikatorami i zakresami openid (wraz z kilkoma innymi) oraz ustawiono adres URL wywołania zwrotnego na https://www.mywebdomain.com/accounts/salesforce/login/callback/
  • Utworzono aplikację społecznościową w Django z identyfikatorem klienta, sekretem i adresem URL logowania w polu „Klucz” (https://login.salesforce.com/)
  • Zawarte allauth.socialaccount.providers.salesforce w INSTALLED_APPS

Używam JSforce po stronie klienta, aby uruchomić żądanie autoryzacji Salesforce w interfejsie użytkownika, ale jestem otwarty na inne metody, jeśli są prostsze / lepsze / itp.

Uruchomienie jsforce.browser.login()w kodzie JS moich klientów otwiera wyskakujące okienko logowania Salesforce. Po wprowadzeniu danych logowania Salesforce system Salesforce przekierował do mojego zdefiniowanego adresu URL wywołania zwrotnego, co spowodowało wyświetlenie strony z następującym tekstem:

Social Network Login Failure
Wystąpił błąd podczas próby logowania za pośrednictwem sieci społecznej koncie.

Adres URL w pasku adresu na tej stronie wygląda mniej więcej tak:

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

Próbowałem debugować i wydrukować błąd w moim zapleczu, ale oba auth_error.codei auth_error.exceptionbyły puste / puste.

Próbowałem również wysłać access_tokenz hasha tego adresu URL do mojego punktu końcowego interfejsu Salesforce API (patrz poniżej), ale spowodowało to błąd 400 („Nieprawidłowa wartość”).

Oto jak zdefiniowałem moje SocialLoginViews w moim views.py, na podstawie dokumentacji uwierzytelniania społecznościowego 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

Mój 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'),
    ...
]

Jak można sprawić, by uwierzytelnianie społecznościowe Salesforce działało w tej aplikacji?

Odpowiedzi

sunw Jan 27 2021 at 23:40

Rozgryzłem to i sprawiłem, że działa: podczas wysyłania do mojego punktu końcowego Salesforce API dj-rest-auth uwzględniałem tylko access_tokenw mojej treści POST. Właściwie potrzebuję obu access_tokeni key, gdzie keyjest adres URL logowania do Salesforce ( "https://login.salesforce.com").

Rzeczywiście było to w instrukcjach django-allauth dla Salesforce , ale źle zinterpretowałem sformułowanie. Teraz wiem, że mówi, aby wymagać obu access_tokeni keyw treści POST.