Problemas para que el inicio de sesión de Salesforce funcione con dj-rest-auth + django-allauth
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.code
y auth_error.exception
estaban en blanco / vacía.
También intenté enviar el access_token
hash 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 SocialLoginView
definí 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
Lo descubrí y lo hice funcionar: cuando publiqué en mi punto final de la API de Salesforce dj-rest-auth, solo estaba incluido access_token
en mi cuerpo POST. De hecho, necesito ambos access_token
y key
dónde key
está 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_token
y key
en el cuerpo POST.