使用 dj-rest-auth + django-allauth 时无法登录 Salesforce 的问题解决。

7

我的应用程序有一个 Django 3.1 后端,使用了 django-allauthdj-rest-authdjango-rest-auth 的一个活跃支持分支)。

我的移动应用和 Web 应用前端已经可以通过 REST 使用 Facebook 和 Google 登录。我现在正在尝试添加 Salesforce 作为第三个 REST 社交登录方式,但遇到了问题。

我已按照 django-allauth 文档中的 Salesforce 操作指南 进行操作:

  • 创建了一个带有 id 和 openid 范围(以及其他一些范围)的 Salesforce 连接应用,并将回调 URL 设置为 https://www.mywebdomain.com/accounts/salesforce/login/callback/
  • 在 Django 中创建了一个 SocialApplication,其中包含 Client ID、Secret 和登录 URL 在“Key”字段中(https://login.salesforce.com/
  • 将 allauth.socialaccount.providers.salesforce 包含在 INSTALLED_APPS 中

我一直在使用客户端 JSforce 在前端发起 Salesforce 认证请求,但如果有更简单/更好的方法,我也可以考虑使用其他方法。

在客户端 JS 代码中运行 jsforce.browser.login() 会打开一个 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.codeauth_error.exception都为空。

我还尝试从URL的哈希中发送access_token到我的Salesforce API端点(请参见下文),但结果是400错误(“值不正确”)。

这是我在views.py中如何定义我的SocialLoginView,基于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社交认证如何在此应用程序中实现?

您提供的错误信息不完整。您能否子类化默认模板以包含完整的消息?请参考此答案了解如何实现。 - Lord Elrond
@ElrondSupportsMonica auth_error.code 是 unknown,auth_error.exception 是 None,而 auth_error.extra 是一个空字典。 - sunw
在Salesforce设置中,您是否看到了什么(如果有的话)->此用户->向下滚动到登录历史记录。看起来您已经成功接收了访问令牌(会话ID)?对其进行urldecode,它必须具有sf org id(请参见SF设置->公司信息),后跟“!”而不是“%21”。然后使用Authorization:Bearer access_token_goes_here发送GET请求到您获得的“id”网址(https://login.salesforce.com/id/00D3t000004QWRmEAO/0053t000008QBetAAG),看看它是否返回任何有意义的内容。您可以使用Postman,curl或任何您想要的http客户端。 - eyescream
还有,尝试使用 https://openidconnect.herokuapp.com/ 吗?这将是完全手动的OAuth2“舞蹈”,但应该可以帮助您弄清如何配置django。而且它是服务器端的事情(用户仍然安全地被引导到sf登录页面,但没有JavaScript,也没有从url中读取“#fragment”的内容)。 SF有很多OAuth2选项,也许有更好的选择适合您?https://help.salesforce.com/articleView?id=remoteaccess_oauth_flows.htm&type=5 - eyescream
你确定可以这样做吗?我只看到过启用SSO的Salesforce(社区用户)登录第三方应用程序(但这并不代表太多)。 - wp78de
我认为JSForce的浏览器身份验证是直接处理OAuth而不是通过底层框架来处理的。我预计你需要完全将JSForce从项目中移除,并利用类似于django-salesforce的东西。否则,你必须将机密信息交给JSForce -- 这意味着浏览器已经知道它们了。 - acrosman
1个回答

0
我解决了问题并使其正常工作:当我向我的dj-rest-auth Salesforce API端点发送请求时,我只在POST请求体中包含了access_token。实际上,我需要同时包含access_tokenkey,其中key是Salesforce登录URL("https://login.salesforce.com")。
这确实在django-allauth关于Salesforce的说明中提到过,但我误解了措辞。现在我知道它说的是要求在POST请求体中同时包含access_tokenkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接