我正在开发一个本机Android应用程序,该应用程序必须通过SOAP API与Salesforce组织进行交互。当前,要使该应用程序的用户登录,他们必须在其用户名和密码旁边提供安全令牌。这使登录/注册过程不舒服且冗长。据我所知,唯一的解决方案是将Salesforce组织中的每个IP地址列入白名单。我本以为这是一个安全问题,所以我想知道是否有更好的解决方案。
据我所知,一种解决方案是将我的应用配置为通过代理登录,然后将该代理的地址列入白名单。正是在研究这个过程的过程中,我发现这个https://serverfault.com/questions/514716/whats-the-minimum-required-squid-config-to-make-a-public-proxy-server使我认为也许还有其他更成熟的方法可以做到这一点,我并不知道。
基本上,我的问题是,在任何手机上运行的android应用程序是否有办法向外部API发出请求,这些请求似乎都来自一个IP地址(可能是通过代理服务器)(不做任何“狡猾”的操作) “)?
答案 0 :(得分:1)
看起来您正在解决错误的问题。为什么要如此严重地绕过SF安全功能。
尝试使用REST(而不是SOAP)登录SF。您将收到的会话ID可以在任何API中使用。因此,如果您使用OAuth2登录,则可能不需要安全令牌。您需要使用使用者ID和机密信息(但这只是您在SF中安全生成的一对值,而不是绑定到任何特定用户。您甚至可以使用生产的值登录到沙箱)。
如果您想做对的话,这里有A LOT of reading。以及创建“连接的应用程序”的一些前提步骤。如果可能,请检查您的Android库是否没有内置的OAuth登录信息(登录SF,Gmail,Facebook,LinkedIn,Twitter ...您可以在几个地方找到OAuth / OpenId)
如果您希望纯后台连接而用户没有意识到他正在与Salesforce通信-也许“ Username and password” OAuth流最适合您。与SOAP登录调用相比,这应该是对代码的最小更改。从某种意义上说,这仍然很薄弱,您仍然需要输入密码(用户的密码或某个专用的集成帐户),但是有可能不需要安全令牌。尝试一下(下面的示例),并检查用户的登录历史记录是否存在错误。
如果您的用户拥有适当的SF帐户,那么another OAuth flow可能更好。理想情况下,可以通过他们信任的SF登录页面显示它们,并在登录成功后将其重定向回您的应用程序。 (如果您最近使用过SF Data Loader,您可能会看到类似的内容?)。这样,您的应用程序将看不到密码,只会看到结果。即使您的客户想要使用自定义域,它也决定启用单点登录...
抱歉,身份验证,授权是非常重要的主题。但是有一种更好的方法,所以我希望您在将自己编码成一个角落之前做出一个有意识的决定...如果帮助材料过于干燥/太新且充满了关键字,则可以尝试传递一些线索:
您的SOAP登录可能看起来像这样:
POST
https://test.salesforce.com/services/Soap/c/45.0/
HEADERS
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
PAYLOAD
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:enterprise.soap.sforce.com">
<soapenv:Body>
<urn:login>
<urn:username>uptonogood@example.com</urn:username>
<urn:password>Nice_Try!111 + security token</urn:password>
</urn:login>
</soapenv:Body>
</soapenv:Envelope>
对应的OAuth登录(尽管移动应用程序应该更好地“喜欢” JSON,所以被迫返回XML,因此,如果您愿意-放弃我添加的Accept
标头)
POST
https://test.salesforce.com/services/oauth2/token
HEADERS
Content-Type:application/x-www-form-urlencoded
Accept:application/xml
PAYLOAD
grant_type=password&
client_id=3MVG9fTLmJ60pJ5JaGv0NNHD5nh6P...&
client_secret=3437814...&
username=uptonogood@example.com&
password=Nice_Try!111
答案 1 :(得分:0)
执行此操作的正确方法是拥有自己的后端,通过该后端代理请求。
例如:
Android app -> Your backend -> Salesforce