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