Проблемы с получением входа в систему Salesforce при работе с dj-rest-auth + django-allauth

Dec 03 2020

В моем приложении есть бэкэнд Django 3.1 с django-allauth и dj-rest-auth (активно поддерживаемая вилка django-rest-auth ).

Мои мобильные и веб-интерфейсы уже могут входить в систему с помощью Facebook и Google через REST. Сейчас я пытаюсь добавить Salesforce в качестве третьего метода входа в социальную сеть REST, но у меня возникают проблемы.

Я выполнил инструкции django-allauth для Salesforce :

  • Создал подключенное приложение Salesforce с областями id и openid (вместе с некоторыми другими) и установил URL-адрес обратного вызова на https://www.mywebdomain.com/accounts/salesforce/login/callback/
  • Создал SocialApplication в Django с идентификатором клиента, секретом и URL-адресом входа в поле «Ключ» (https://login.salesforce.com/)
  • Включен allauth.socialaccount.providers.salesforce в INSTALLED_APPS

Я использую клиентскую JSforce для запуска запроса аутентификации Salesforce во внешнем интерфейсе, но я открыт для других методов, если они проще / лучше и т. Д.

При jsforce.browser.login()запуске кода JS моих клиентов открывается всплывающее окно входа в систему Salesforce. После ввода учетных данных для входа в систему Salesforce система Salesforce перенаправилась на указанный мной URL-адрес обратного вызова, в результате чего появилась страница со следующим текстом:

Социальная сеть Войти Неудача
при попытке входа в систему с помощью вашей учетной записи в социальной сети произошла ошибка.

URL-адрес в адресной строке на этой странице выглядит примерно так:

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

Я пытался отлаживать и напечатать ошибку в моем внутреннем интерфейсе, но оба auth_error.codeи auth_error.exceptionбыли пусты / пусто.

Я также попытался отправить access_tokenхэш этого URL-адреса в мою конечную точку Salesforce API (см. Ниже), но это привело к ошибке 400 («Неверное значение»).

Вот как я определил свои SocialLoginViews в моем views.py на основе документации социальной авторизации 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

Мой 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'),
    ...
]

Как сделать так, чтобы социальная авторизация Salesforce работала в этом приложении?

Ответы

sunw Jan 27 2021 at 23:40

Я понял это и заставил его работать: при публикации в конечную точку API Salesforce dj-rest-auth я включал только access_tokenсвое тело POST. Мне действительно нужны оба access_tokenи key, где keyнаходится URL-адрес входа в Salesforce ( "https://login.salesforce.com").

Это действительно было в инструкциях django-allauth для Salesforce , но я неверно истолковал формулировку. Теперь я знаю, что он требует и того, access_tokenи другого keyв теле сообщения POST.