【发布时间】:2021-11-17 23:23:00
【问题描述】:
我是一名高级初学者,我已经在这个问题上停留了几天。我正在创建的应用程序需要访问每个用户的 Salesforce 帐户。为了建立 API 连接,我们需要存储他们的 Salesforce 用户名、密码和访问令牌。
用户将提供他们的 Salesforce 用户名和密码,然后单击按钮进行授权。此按钮将用户引导至:
来自 Salesforce Oauth 服务器的响应应该是:
https://www.mysite.com/oauth/salesforce/?display=popup&code=aPrx6RMKPrMpm.SHNCxBmHz3ZiHMc.xZRY9RHLekkzW_G8Uu.KyqmmY0.JGCr5roqPT49vTCbg%3D%3D
这是 views.py 文件
from django.views.generic.base import RedirectView, TemplateView, View
from django.http import Http404, HttpResponse
from django.conf import settings
from django.contrib import messages
from django.core.urlresolvers import reverse_lazy, reverse
from guardian.mixins import LoginRequiredMixin
from simple_salesforce import Salesforce
import logging
from campaigns.views import CampaignOwnerPermission
from . import api, utils, settings
from .models import OauthToken
class SalesforceOauthRedirectView(
LoginRequiredMixin,
RedirectView
):
def get_redirect_url(self):
logger = logging.getLogger(__name__)
# Extract 'code' parameter from return URL and set to variable
if (
not self.request.GET.get(
'code', None
) is None
):
try:
existing_credentials = OauthToken.objects.get(
user=request.user
)
# get stored Salesforce username and password
username = str(existing_credentials.salesforce_user_id)
password = str(existing_credentials.password)
payload = {
'grant_type': 'password',
'client_id': str(settings.CONSUMER_KEY),
'client_secret': str(settings.CONSUMER_SECRET),
'username': username,
# must concatenate password & code before passing to server
'password': password + str(code)
}
try:
# Post payload to Salesforce Oauth server and get user
# token in response.
r = requests.post(
"https://login.salesforce.com/services/oauth2/token",
headers={
"Content-Type":"application/x-www-form-urlencoded"
},
data=payload
)
# Decode the JSON response from Salesforce Oauth server
decoded = json.loads(r.content)
# Store access_token to database
existing_credentials.token = decoded['access_token']
existing_credentials.active = True
existing_credentials.save()
messages.add_message(
self.request,
messages.SUCCESS,
_(
'Successfully updated Salesforce \
authentication with user credentials: "%s"'
%
salesforce_user_id
)
)
# Success point
return reverse_lazy('providers:provider_list')
# except (ValueError, KeyError, TypeError):
# logger.error('Could not decode response from Salesforce API')
# Not sure how this should be arranged
except:
logger.error(
'Could not get Oauth_token from Salesforce API.'
)
messages.add_message(
self.request,
messages.WARNING,
('Could not get Oauth_token from Salesforce API.\n\n \
Salesforce may be experiencing an outage. Try again \
in a few minutes and contact explorro support if the \
problem persists.'
)
)
return reverse_lazy('providers:provider_list')
except:
logger.error('Could not get users Salesforce credentials')
messages.add_message(
self.request,
messages.WARNING,
('There was a problem authenticating with \
Salesforce. Be sure to enter your Salesforce \
username and password before attempting to authorize your\
account. Contact our support team if you need some help.'
)
)
return reverse_lazy('providers:provider_list')
else:
pass
return reverse_lazy('providers:provider_list')
messages.add_message(
self.request,
messages.WARNING,
('Could not retrieve Salesforce Authorization Code\n\n \
Contact your Salesforce administrator for assistance.'
)
)
'code' 参数(示例值 = randomTextCode)从响应 URL 中解析出来,并作为 'payload' 变量(第 38 行)的一部分传递给https://login.salesforce.com/services/oauth2/token
最后一步应该接收来自https://login.salesforce.com/services/oauth2/token的JSON响应,其中包含access_token
该错误似乎源于第一个 try/except 语句,因为我在第 #103-106 行收到异常错误消息。
在本地运行时,这里是服务器响应 (301)
"GET /oauth/salesforce/?display=popup&code=aPrx6RMKPrMpm.SHNCxBmHz3ZgWIqBWQKmln4Q6TfdI8TbmeWuMw5H..Di.342no15VYNvmgzA%3D%3D HTTP/1.1" 301 0
这里是 models.py
from django.db import models
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
class OauthToken(models.Model):
user = models.ForeignKey(
settings.AUTH_USER_MODEL,
related_name='Salesforce User',
verbose_name=_('Salesforce User'),
db_index=True,
)
salesforce_user_id = models.EmailField(
verbose_name=_('Salesforce user id'),
db_index=True, unique=True
)
password = models.CharField( # TODO: This needs to be encrypted!!
verbose_name=_('Salesforce password'),
max_length=256,
)
token = models.CharField(
verbose_name=_('Token'),
max_length=256,
null=True,
blank=True,
)
security_token = models.CharField(
verbose_name=_('Security Token'),
max_length=256
)
active = models.BooleanField(
verbose_name=_('Active'),
default=False,
db_index=True
)
def __unicode__(self):
return str(self.salesforce_user_id)
class Meta:
verbose_name = _('Oauth token')
verbose_name_plural = _('Oauth tokens')
非常感谢任何解决此问题的帮助。
【问题讨论】:
-
你能粘贴实际的错误吗?
-
向用户显示的错误是“使用 Salesforce 进行身份验证时出现问题。请务必在尝试授权您的帐户之前输入您的 Salesforce 用户名和密码。如果您需要一些信息,请联系我们的支持团队帮助。”这是从第 98 行到第 108 行的“except:”代码生成的
-
你能把代码分享给git或site吗?
标签: python django oauth salesforce