如何使Android应用程序登录请求全部显示为一个IP

时间:2019-05-07 12:02:51

标签: android networking salesforce

我正在开发一个本机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地址(可能是通过代理服务器)(不做任何“狡猾”的操作) “)?

2 个答案:

答案 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