Salesforceログインをdj-rest-auth + django-allauthで機能させる際の問題

Dec 03 2020

私のアプリには、django-allauthとdj-rest-auth(django-rest-authのアクティブにサポートされているフォーク)を備えたDjango3.1バックエンドがあります。

私のモバイルフロントエンドとWebフロントエンドは、REST経由でFacebookとGoogleを使用してすでにサインインできます。現在、Salesforceを3番目のRESTソーシャルログインメソッドとして追加しようとしていますが、問題が発生しています。

私が続いてきたSalesforceのためのジャンゴ- allauthの指示に:

  • idスコープとopenidスコープ(および他のスコープ)を使用してSalesforce Connected Appを作成し、コールバックURLを次のように設定します。 https://www.mywebdomain.com/accounts/salesforce/login/callback/
  • 「キー」フィールドにクライアントID、シークレット、ログインURLを使用してDjangoでSocialApplicationを作成しました(https://login.salesforce.com/)。
  • INSTALLED_APPSにallauth.socialaccount.providers.salesforceが含まれています

私はクライアント側の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.codeauth_error.exception空の空白/でした。

またaccess_token、そのURLのハッシュからSalesforce APIエンドポイントに送信しようとしましたが(以下を参照)、400エラー(「値が正しくありません」)が発生しました。

dj-rest-authのソーシャル認証ドキュメントSocialLoginViewに基づいて、views.pyでsを定義した方法は次のとおりです。

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

私はそれを理解して機能させました。dj-rest-authSalesforceAPIエンドポイントに投稿するとき、私はaccess_tokenPOST本文にのみ含めていました。私は実際に両方を必要とaccess_tokenしてkey、どこkeySalesforceのログインURLです("https://login.salesforce.com")。

それは確かにSalesforceのdjango-allauthの指示に含まれていましたが、私はその表現を誤って解釈しました。私は今、それが両方access_tokenkeyPOST本文の両方を必要とすると言っていることを知っています。