我正在为 iOS 9 及更高版本编写一个 iPhone 应用程序。我对这个应用程序的目标之一是它应该能够通过用户拥有的一个或多个 Twitter 帐户代表我的用户发送推文。
我已将 STWitter 库集成到我的应用程序中,并且我已经获得了我想要的功能,几乎可以按照我的意愿工作。我说“几乎”是因为它的一小部分没有按我预期的那样工作,我想在这里重点关注这部分。
我可能会说我不认为这个问题是与 STTwitter 相关的问题,因为另一位在此处发布了类似问题的发帖者正在使用 Twitteroauth 库。
目前,在我正在测试的应用程序版本中,我有两个标记为“@acct1”和“@acct2”的按钮。
每个按钮代表我拥有的一个 Twitter 帐户。我的两个 Twitter 帐户都使用相同的密码。
如果我触摸其中一个按钮,该应用程序将创建一条推文并将其发送到与该按钮关联的我的推特帐户。
我的应用程序仍处于测试模式,因此目前我将收到的 oauth 令牌存储在非持久内存中。因此,如果我重新启动应用程序,我的 oauth 令牌就会消失。稍后,当一切都整理好后,我会将它们存储在用户默认值中。
因此,在应用程序重启后我第一次按下@acct1 或@acct2 按钮时,我将没有所需的oauth 令牌,我将不得不启动到Twitter 的往返来获取它们。
在同一按钮的任何后续重用中,在重新启动应用程序之前,我仍将拥有 oauth 令牌,并且我不必先去 Twitter。
任何集成了 STTwitter 库并尝试过 OAuth 奇迹的人都会熟悉这一切的基本大纲。
我想这已经足够背景了。现在解决问题:
现在假设我刚刚重新启动了我的应用程序。当我触摸@acct1 时,我的代码确定我没有持有 oauth 令牌,因此我开始执行序列以往返 Twitter 以获取它们。
首先,我向 Twitter 发送一个 postTokenRequest。
它成功返回,它的 sucess_block 包含一个带有各种数据位的 URL,然后我将其传递给 Safari。
Safari 使用该 URL 访问 Twitter 网站,当该网站页面出现时,我正在查看一个标题为“授权使用您的帐户?”的屏幕。
该屏幕向我显示了两个文本框。一个用于用户 ID(或电话号码或电子邮件地址),另一个用于密码。我只对这里的 userID 选项感兴趣。
这是我的问题/问题--------------
在我通过 postTokenRequest 传递的参数中,我可以选择包含“屏幕名称”参数的值。
请注意,我相信“屏幕名称”和用户 ID 在这里是可互换的术语。
我的假设是,如果我在我的 postTokenRequest 的传递参数中包含一个“屏幕名称”,那么当 Safari 向我的用户显示其“授权使用您的帐户”屏幕时,该屏幕上的用户 ID 字段将自动填充什么我通过了“屏幕名称”。
我还假设如果我为 Screen Name 传递 nil,则显示的 userID 字段将为空,我将需要填写它。
下面是两张表。
Table 1 - this is what I expect to happen:
I Rqst Safari userID
Press Token userID I
case button Sends shows enter
---- ----- ----- ------ ------
1a @acct1 nil nil @acct1
1b @acct2 nil nil @acct2
<App restarted here so saved oauth tokens evaporate>
2a @acct1 acct1 acct1 none
2b @acct2 acct2 acct2 none
表1的讨论:
在情况 1a 和 1b 中,当我触摸 @acct1 或 @acct2 时,我使用 postRequestToken 发送的屏幕名称为零。在这两种情况下,我希望 Safari 提供的用户 ID 也是空白的,并且需要我输入它。
在情况 2a 和 2b 中,当我触摸 @acct1 或 @aact2 时,我使用 postRequestToken 发送的屏幕名称包含正确的 acct1 或 acct2 值。在这两种情况下,Safari 提供的用户 ID 都是正确的,我不需要输入任何数据。
Table 2 - but this is what actually happens:
I Rqst Safari userID
Press Token userID I
case button Sends shows enter
---- ----- ----- ------ ------
1a @acct1 nil nil acct1
1b @acct2 nil acct1 acct2
<App restarted here so saved oauth tokens evaporate>
2a @acct1 acct1 acct1 none
2b @acct2 acct2 acct1 acct2
表2的讨论:
案例 1a 按预期工作,但案例 1b 没有。在 1b 中,Safari 将 acct1 显示为用户 ID,即使屏幕名称发送的请求令牌为零。
案例 2a 按预期工作,但案例 2b 没有。Safari 将 acct1 显示为用户 ID,即使请求令牌发送了 acct2 作为屏幕名称。
一般讨论;一般交流:
我认为这篇文章也描述了这个问题,但发帖人没有得到任何帮助。
在我看来,Twitter 端出现了一个问题,即上次成功发行 oauth 令牌时无意中保留了数据(屏幕名称/用户 ID)。请注意,在表 1 中,一旦案例 1a 获得批准,1a 的屏幕名称将持续存在并作为屏幕名称出现在 1b 的请求中。同样的事情在 2a 和 2b 中也很明显。
我还注意到,如果您在请求之间等待一段时间,持久化的数据就会消失。
在这篇文章的开头,我提到我的两个 Twitter 帐户共享相同的 p/w。这使得这个持久性问题对我或我的任何选择为他们的多个 Twitter 帐户使用相同密码的用户来说可能是一个大问题。
如果这样的用户在我的应用程序上快速连续设置了多个 Twitter 帐户并且没有注意到 Twitter 将先前批准的帐户的屏幕名称保留为当前正在请求的帐户的屏幕名称,那么新的 Twitter 帐户将被误导.
但是,如果正在设置的每个 Twitter 帐户具有不同的 p/w,则可能会发现问题。在这种情况下,屏幕名称/用户 ID 和密码之间的不匹配会导致拒绝。
我并不热衷于建议我的用户为他们的几个 Twitter 帐户中的每一个使用不同的 p/w。我也不能强制执行它,因为 OAuth 的全部意义在于应用程序不应该知道用户的 p/w。
到目前为止我能看到的最好的就是
(1) 在 postTokenRequest 中总是为 Screen Name 发送 nil。
(2) 通知我的用户,当他们在我的应用程序上设置新的 Twitter 帐户时,他们不应该接受Twitter 在“授权使用您的帐户”屏幕的用户 ID 字段中预加载的内容,而是始终将他们在那里找到的任何内容替换为他们知道是正确的用户 ID。
任何和所有的意见将不胜感激。