Problemas para que el inicio de sesión de Salesforce funcione con dj-rest-auth + django-allauth

Dec 03 2020

Mi aplicación tiene un backend Django 3.1 con django-allauth y dj-rest-auth (bifurcación con soporte activo de django-rest-auth ).

Mis frontends móviles y web ya pueden iniciar sesión usando Facebook y Google a través de REST. Ahora estoy tratando de agregar Salesforce como un tercer método de inicio de sesión social REST, pero tengo problemas.

He seguido las instrucciones de django-allauth para Salesforce :

  • Creó una aplicación Salesforce Connected con id y openid scopes (junto con algunos otros) y configuró la URL de devolución de llamada en https://www.mywebdomain.com/accounts/salesforce/login/callback/
  • Creé una aplicación social en Django con ID de cliente, secreto y URL de inicio de sesión en el campo "Clave" (https://login.salesforce.com/)
  • Incluido allauth.socialaccount.providers.salesforce en INSTALLED_APPS

He estado usando JSforce del lado del cliente para iniciar la solicitud de autenticación de Salesforce en la interfaz, pero estoy abierto a otros métodos si son más simples / mejores / etc.

Al ejecutar el jsforce.browser.login()código JS de mis clientes, se abre una ventana emergente de inicio de sesión de Salesforce. Después de ingresar las credenciales de inicio de sesión de Salesforce, el sistema Salesforce redirigió a mi URL de devolución de llamada definida, lo que resultó en una página que muestra el siguiente texto:

Red social fallidos de acceso
se produjo un error al intentar acceder a través de su cuenta de la red social.

La URL en la barra de direcciones de esa página se parece a esto:

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

Traté de depuración e imprimir el error en mi back-end, pero ambos auth_error.codey auth_error.exceptionestaban en blanco / vacía.

También intenté enviar el access_tokenhash de esa URL a mi punto final de la API de Salesforce (ver más abajo), pero eso resultó en un error 400 ("Valor incorrecto").

Así es como SocialLoginViewdefiní mi s en mi views.py, según la documentación de autenticación social 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

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

¿Cómo se puede hacer que la autenticación social de Salesforce funcione en esta aplicación?

Respuestas

sunw Jan 27 2021 at 23:40

Lo descubrí y lo hice funcionar: cuando publiqué en mi punto final de la API de Salesforce dj-rest-auth, solo estaba incluido access_tokenen mi cuerpo POST. De hecho, necesito ambos access_tokeny keydónde keyestá la URL de inicio de sesión de Salesforce ( "https://login.salesforce.com").

De hecho, estaba en las instrucciones de django-allauth para Salesforce , pero malinterpreté la redacción. Ahora sé que dice requerir ambos access_tokeny keyen el cuerpo POST.