Twitter屏幕名称/用户ID持久性问题

Twitter屏幕名称/用户ID持久性问题,twitter,oauth,sttwitter,Twitter,Oauth,Sttwitter,我正在为iOS 9及其后版本编写一个iPhone应用程序。我的目标之一是,该应用程序应该能够通过用户拥有的一个或多个twitter帐户代表我的用户发送推文 我已经将STWitter库集成到我的应用程序中,并且我已经获得了我想要的功能,几乎可以像我想要的那样工作。我说“几乎”是因为它的一小部分没有像我预期的那样工作,我想在这里重点讨论这一部分 我可能会说,我不认为这是一个与STTwitter相关的问题,因为另一个发布了类似问题的海报正在使用twitterouth库 目前,在我正在测试的应用程序版本

我正在为iOS 9及其后版本编写一个iPhone应用程序。我的目标之一是,该应用程序应该能够通过用户拥有的一个或多个twitter帐户代表我的用户发送推文

我已经将STWitter库集成到我的应用程序中,并且我已经获得了我想要的功能,几乎可以像我想要的那样工作。我说“几乎”是因为它的一小部分没有像我预期的那样工作,我想在这里重点讨论这一部分

我可能会说,我不认为这是一个与STTwitter相关的问题,因为另一个发布了类似问题的海报正在使用twitterouth库

目前,在我正在测试的应用程序版本中,我有两个按钮,分别标记为“@acct1”和“@acct2”

每个按钮代表我拥有的一个Twitter帐户。我的两个Twitter帐户使用相同的密码

如果我按下其中一个按钮,应用程序将创建一条推文,并将其发送到我与该按钮关联的推文帐户

我的应用程序仍处于测试模式,因此目前我将收到的oauth令牌存储在非持久性内存中。因此,如果我重新启动应用程序,我的oauth令牌将消失。稍后,当一切都整理好后,我会将它们存储在用户默认值中

因此,在应用程序重启后,我第一次按下@acct1或@acct2按钮时,我将没有所需的oauth令牌,我将不得不启动到Twitter的往返以获取它们

在重新启动应用程序之前,如果再次使用同一按钮,我仍将拥有oauth令牌,并且不必首先访问Twitter

任何集成了STTwitter库并在OAuth奇迹中工作过的人都将熟悉所有这些的基本轮廓

我想这就足够了。现在谈谈问题:

假设我刚刚重新启动了我的应用程序。当我触摸@acct1时,我的代码确定我没有持有oauth令牌,因此我开始序列以往返于Twitter获取它们

首先,我向Twitter发送一个postTokenRequest

它成功地返回,它的success_块包含一个包含各种数据位的URL,然后我将其传递给Safari

Safari使用URL访问Twitter网站,当该网站页面出现时,我会看到一个标题为“授权使用您的帐户?”

这个屏幕显示了两个文本框。一个表示用户ID(或电话号码或电子邮件地址),另一个表示密码。我只对这里的userID选项感兴趣

这是我的问题--------------

在我随postTokenRequest传递的参数中,我可以选择包含“screen name”参数的值

注意,“屏幕名”和用户ID在这里是可以互换的

我的假设是,如果我在postTokenRequest的传递参数中包含一个“屏幕名”,那么当Safari向我的用户显示其“授权使用您的帐户”屏幕时,该屏幕上的用户ID字段将自动填充我作为“屏幕名”传递的内容

我还假设,如果我对屏幕名称传递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-这就是我期望发生的事情:
I Rqst Safari用户ID
按令牌用户标识I
案例按钮发送显示输入
----  -----  -----  ------  ------
1a@acct1无,无@acct1
1b@acct2无,无@acct2
他也在描述这个问题,但海报没有得到任何帮助

在我看来,Twitter端似乎出现了一个问题,上次成功发布oauth令牌时,数据(屏幕名称/用户ID)无意中被持久化了。在表1中注意,一旦案例1a获得批准,1a的屏幕名称将持续存在,并在1b的请求中显示为屏幕名称。2a和2b也是如此

我还注意到,如果在请求之间等待一段时间,持久化的数据就会消失

在这篇文章的开头,我提到我的两个Twitter帐户共享相同的p/w。这使得这个持久性问题对我或我的任何用户来说都可能是一个大问题,因为他们选择为自己的几个Twitter帐户使用相同的密码

如果这样的用户使用我的应用程序快速连续地设置了几个Twitter帐户,并且没有注意到Twitter将以前批准的帐户的屏幕名作为当前被请求帐户的屏幕名,那么新的Twitter帐户将被误导

但是,如果每个正在设置的Twitter帐户都有不同的p/w,则可能会发现问题。在这种情况下,屏幕名称/用户ID和p/w之间的不匹配将导致拒绝

我并不热衷于建议我的用户为他们的几个Twitter账户使用不同的p/w。我也不能强制执行它,因为OAuth的整个要点是应用程序不应该知道用户的p/w

到目前为止,我所能做的最好的事情就是

(1) 始终在postTokenRequest中为屏幕名称发送一个nil

(2) 通知我的用户,当他们在我的应用程序上设置新的Twitter帐户时,他们永远不应该接受Twitter在“授权使用您的帐户”屏幕的userID字段中预加载的内容,而是总是用他们知道正确的userID替换在那里找到的任何内容

如有任何意见,将不胜感激

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