【问题标题】:Retrieving Twitter OAuth Token using Social Framework (iOS6)使用社交框架 (iOS6) 检索 Twitter OAuth 令牌
【发布时间】:2013-01-30 06:03:31
【问题描述】:

我对如何使用 iOS 社交框架获取 Twitter OAuth 令牌感到有些困惑。假设我在 iOS6 上设置了 Facebook 和 Twitter 帐户,并且可以获得 ACAccount。当我检查 Facebook ACAccount 的 ACAccountCredential 时,设置了 OAuthToken 属性,但对于 Twitter ACAccount 却没有。 Twitter ACAccount 的所有其他详细信息都已设置,但 ACAccountCredential 未设置。

为了增加困惑,我看到一篇关于使用反向身份验证获取 OAuth 令牌 (https://dev.twitter.com/docs/ios/using-reverse-auth) 的文章。本文讨论了调用 https://api.twitter.com/oauth/request_token 并传入 oauth_* params params 的字典,例如consumer_key、noonce 等。但是,将我的 ACAccount 附加到 SLRequest 肯定可以达到这个目的吗?无论如何,当我尝试此操作时,我会收到错误“无法验证 oauth 签名和令牌”。

所以我的问题是我应该在 ACAccountCredential 中看到 Twitter OAuth 令牌,还是应该使用反向身份验证?如果是这样,我是否需要显式传入包含 oauth_* 参数的 NSDictionary 或附加 ACAccount 是否足够?

【问题讨论】:

    标签: ios twitter-oauth social-framework


    【解决方案1】:

    让我们分几步来回答这个问题,有一些事情需要解决/澄清。

    ACAccountCredential

    此对象与 ACAccount 对象配合使用,以便帐户框架能够对特定帐户的用户进行身份验证。它不是为随意阅读而设计的;仅当您需要将帐户保存到帐户框架时才应该使用它。

    Documentation from Twitter 指出,如果您要迁移到帐户框架来管理用户帐户,而不是使用您自己的服务器,或者在旧 iOS 应用程序的情况下,您需要在本地管理帐户,则需要填充 ACAccountCredential .

    Apple clearly say in their documentation 在将帐户保存到帐户框架后无法读取凭据。

    出于隐私原因,保存帐户后无法访问此属性。

    因此,这就是 Twitter 提供使用反向身份验证功能的原因,以防您仍然需要 OAuth 令牌进行服务器端管理。我不知道为什么你可以通过 Facebook 帐户获得它,但对于 Twitter,你不能直接跳转到预先保存的 ACAccountCredential。

    使用 Twitter 的反向验证

    Twitter 提供的文档(在您的问题中链接)清楚地说明了您需要做什么才能访问 OAuth 访问令牌,但我会尝试澄清一些可能不太清楚的事情.

    除了 Accounts 和 Twitter 框架之外,还需要一个额外的框架来完成这项工作; Social.framework。确保已导入它,因为这将使请求令牌变得相当简单。

    至于您需要发送的请求,Twitter 不知道 ACAccounts。请记住,此反向身份验证过程并非特定于 iOS,它可以由任何可以访问 Web 的计算设备完成。因此,您需要使用指定的参数(OAuth 标准参数 + x_auth_mode)向https://api.twitter.com/oauth/request_token 发送 HTTP POST 请求。对所需参数can be found here 更清楚一点,但您问题中的链接也将明确哪些参数是必需的。您将需要提供自己的 nonce 和其他参数值。

    您可以使用 SLRequest 类或 AFNetworking 向 Twitter 发出 POST 请求,为您的参数值传入一个 NSDictionary(如 Twitter 文档中access_token 的代码示例所示)。

    就是这样

    在回答了这两点之后,我认为很明显,您需要使用反向身份验证才能访问正确的 OAuth 令牌以满足您的需求。 Twitter 文档清楚地说明了您需要做什么(它甚至提供了您可以使用的代码示例),但您确实需要了解一般的 OAuth 请求/响应管理才能做到这一点。您不能简单地附加一个 ACAccount,您需要使用所需的 OAuth 参数填充字典,然后将其传递给您的 HTTP POST 请求到request_token。我提供了相当多的参考资料供您参考,我希望这能让您走上正确的道路。

    【讨论】:

      【解决方案2】:

      假设您要在 >= iOS 5.0 上尝试此功能, 这是获取访问令牌的更简单方法。无论您使用的是 Twitter.framework 还是 Social.framework,两者的工作方式都是为您进行请求签名。我们使用 TWRequest 或 SLRequest 来创建您的请求。完成此操作后,我们会从其中任何一个中获取 NSURLRequest 对象。

      这里的诀窍是查看这个 NSURLRequest 的标头。正如我们必须指定的,根据 OAuth 标准,一些 OAuth 参数和 oauth_token 是其中之一,应该很容易将其提取出来。以下是解决此问题的方法。

      NSURLRequest * reqTemp = /* Prepare the request using either Twitter.framework or Social.framework */;
      NSDictionary * dictHeaders = [reqTemp allHTTPHeaderFields];
      
      NSString * authString = dictHeaders[@"Authorization"];
      NSArray * arrayAuth = [authString componentsSeparatedByString:@","];
      NSString * accessToken;
      for( NSString * val in arrayAuth ) {
          if( [val rangeOfString:@"oauth_token"].length > 0 ) {
              accessToken =
                  [val stringByReplacingOccurrencesOfString:@"\""
                                                 withString:@""];
              accessToken =
                  [accessToken stringByReplacingOccurrencesOfString:@"oauth_token="
                                                              withString:@""];
              break;
          }
      }
      

      也许这段代码可以进一步优化,但你明白了。变量 accessToken 将具有实际的访问令牌。

      【讨论】:

        【解决方案3】:

        实际上,如果您唯一关心的是检索 OAuth 令牌,则有一种非常简单的方法可以使用 Social 框架来访问它。 文档中包含一个名为:

        func preparedURLRequest() -> NSURLRequest!
        

        返回值 一个 OAuth 兼容的 NSURLRequest 对象,它允许 应用程序代表用户行事,同时保留用户的密码 私人的。 NSURLRequest 默认被签名为 OAuth1,或者 OAuth2 根据用户的帐户添加适当的令牌。

        讨论 使用此方法在发送前修改您的请求。经过 正确设置帐户,此方法将自动添加任何 必要的令牌。

        所以你可以像这样简单地创建一个签名的SLRequest

        let accounts = self.accountStore.accountsWithAccountType(type)
        let request = SLRequest(
                        forServiceType: SLServiceTypeTwitter,
                        requestMethod: .GET,
                        URL: NSURL(string: "https://api.twitter.com/1.1/account/verify_credentials.json"),
                        parameters: ["include_entities": true])      
        request.account = accounts?.first as? ACAccount
        

        现在只需访问request.preparedURLRequest().allHTTPHeaderFields(),您就会在其中看到oauth_token

        但是您不会拥有 Secret 令牌(因为它用于根据 twitter documentation 生成 oauth_signature),这使得这对于服务器端管理毫无用处。

        【讨论】:

          【解决方案4】:

          查看这个项目https://github.com/seancook/TWReverseAuthExample。有 TWAPIManager 类可以为您完成这项工作。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-09-01
            • 2015-05-28
            • 1970-01-01
            • 2015-02-14
            • 2016-02-05
            • 1970-01-01
            • 2012-01-12
            相关资源
            最近更新 更多