diff --git a/frappe/docs/user/en/guides/integration/social_login_key.md b/frappe/docs/user/en/guides/integration/social_login_key.md
index 8bc3d030db..d0896e8fa9 100644
--- a/frappe/docs/user/en/guides/integration/social_login_key.md
+++ b/frappe/docs/user/en/guides/integration/social_login_key.md
@@ -24,3 +24,11 @@ e.g. Social Login Key
- **Client Secret** : `123456`
- **Enable Social Login** : `Check`
- **Base URL** : `https://erpnext.org` (required for some providers)
+
+#### Generating Client ID and Client Secret for providers
+
+- Creating a Google API Console project and client ID
+- Manually Build a Login Flow for Facebook
+- Creating an OAuth App for GitHub
+- Authorize access to web applications using OpenID Connect and Azure Active Directory
+- Create a Connected App on Salesforce
diff --git a/frappe/integrations/doctype/social_login_key/social_login_key.json b/frappe/integrations/doctype/social_login_key/social_login_key.json
index 8475a8281b..57451d7f77 100644
--- a/frappe/integrations/doctype/social_login_key/social_login_key.json
+++ b/frappe/integrations/doctype/social_login_key/social_login_key.json
@@ -93,7 +93,7 @@
"label": "Social Login Provider",
"length": 0,
"no_copy": 0,
- "options": "Custom\nFacebook\nFrappe\nGitHub\nGoogle\nOffice 365",
+ "options": "Custom\nFacebook\nFrappe\nGitHub\nGoogle\nOffice 365\nSalesforce",
"permlevel": 0,
"precision": "",
"print_hide": 0,
@@ -660,7 +660,7 @@
"issingle": 0,
"istable": 0,
"max_attachments": 0,
- "modified": "2017-12-21 13:55:17.041059",
+ "modified": "2018-01-13 21:19:37.800121",
"modified_by": "Administrator",
"module": "Integrations",
"name": "Social Login Key",
diff --git a/frappe/integrations/doctype/social_login_key/social_login_key.py b/frappe/integrations/doctype/social_login_key/social_login_key.py
index 305da2391e..bc9b7be137 100644
--- a/frappe/integrations/doctype/social_login_key/social_login_key.py
+++ b/frappe/integrations/doctype/social_login_key/social_login_key.py
@@ -120,6 +120,23 @@ class SocialLoginKey(Document):
})
}
+ providers["Salesforce"] = {
+ "provider_name": "Salesforce",
+ "enable_social_login": 1,
+ "base_url": "https://login.salesforce.com",
+ "custom_base_url": 0,
+ "icon":"fa fa-cloud", #https://github.com/FortAwesome/Font-Awesome/issues/1744
+ "redirect_url": "/api/method/frappe.integrations.oauth2_logins.login_via_salesforce",
+ "api_endpoint": "https://login.salesforce.com/services/oauth2/userinfo",
+ "api_endpoint_args":None,
+ "authorize_url": "https://login.salesforce.com/services/oauth2/authorize",
+ "access_token_url": "https://login.salesforce.com/services/oauth2/token",
+ "auth_url_data": json.dumps({
+ "response_type": "code",
+ "scope": "openid"
+ })
+ }
+
# Initialize the doc and return, used in patch
# Or can be used for creating key from controller
if initialize and provider:
diff --git a/frappe/integrations/oauth2_logins.py b/frappe/integrations/oauth2_logins.py
index 666a0030ef..f02573934c 100644
--- a/frappe/integrations/oauth2_logins.py
+++ b/frappe/integrations/oauth2_logins.py
@@ -26,3 +26,7 @@ def login_via_frappe(code, state):
@frappe.whitelist(allow_guest=True)
def login_via_office365(code, state):
login_via_oauth2_id_token("office_365", code, state, decoder=json.loads)
+
+@frappe.whitelist(allow_guest=True)
+def login_via_salesforce(code, state):
+ login_via_oauth2("salesforce", code, state, decoder=json.loads)
diff --git a/frappe/utils/oauth.py b/frappe/utils/oauth.py
index 803aad2ac3..f648ae3128 100644
--- a/frappe/utils/oauth.py
+++ b/frappe/utils/oauth.py
@@ -262,6 +262,10 @@ def update_oauth_user(user, data, provider):
save = True
user.set_social_login_userid(provider, userid=data["sub"])
+ elif provider=="salesforce" and not user.get_social_login_userid(provider):
+ save = True
+ user.set_social_login_userid(provider, userid="/".join(data["sub"].split("/")[-2:]))
+
if save:
user.flags.ignore_permissions = True
user.flags.no_welcome_mail = True