使用社交框架检索Twitter OAuth令牌(iOS6)

我有点困惑,我如何使用iOS社交框架获得Twitter OAuth令牌。 假设我在iOS6上有Facebook和Twitter帐户设置,我可以获得ACAccount。 当我检查Facebook ACAccount的ACAccountCredential时,设置了OAuthToken属性,但对于Twitter ACAccount,则不是。 对于Twitter ACAccount的每个其他细节设置只是ACAccountCredential不是。

为了增加混淆,我遇到了一篇关于使用Reverse Auth获取OAuth令牌的文章( https://dev.twitter.com/docs/ios/using-reverse-auth )。 本文讨论如何调用https://api.twitter.com/oauth/request_token并传入oauth_ * params参数(例如consumer_key,nononce等)的字典。但是,将我的ACAccount确实附加到SLRequest中是否可以达到这个目的? 无论如何,当我尝试这个时,我会收到错误“无法validationoauth签名和令牌”。

所以我的问题是我应该在ACAccountCredential中看到Twitter OAuth Token,还是应该使用Reverse Auth? 如果是的话,我需要显式传递包含oauth_ *参数的NSDictionary或附加ACAccount足够?

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

ACAccountCredential

此对象用于与ACAccount对象的协调,以便帐户框架能够对特定帐户的用户进行身份validation。 它不是被devise成随意阅读的; 只有当您需要将帐户保存到帐户框架时才应该使用它。

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

苹果公司在文档中明确表示,在将帐户保存到帐户框架后,凭据无法读取。

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

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

使用Twitter的反向validation

由Twitter提供的文档(在您的问题中链接)使得该stream程相当清晰,以便您访问OAuth访问令牌所需执行的操作,但是我将尝试澄清一些可能不太清楚的事情。

除了账户和推特框架外,还需要额外的框架来完成这项工作。 Social.framework 。 确保这是导入,因为这会使请求令牌更加简单。

至于您需要发送的请求,Twitter不知道ACAccounts。 请记住,这个反向validation过程并不是特定于iOS的,它可以通过任何可以访问networking的计算设备来完成。 因此,您需要使用指定参数(OAuth标准的+ x_auth_mode )向https://api.twitter.com/oauth/request_token发送HTTP POST请求。 在这里可以find更多关于所需参数的清晰度,但是您的问题中的链接也会明确说明哪些参数是必需的。 您将被要求提供您自己的随机数和其他参数值。

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

就是这样

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

假设你打算在> = iOS 5.0上试试这个,这里有一个获取访问令牌的更简单的方法。 无论您是使用Twitter.framework还是Social.framework,这两种方式都是通过为您执行请求签名来完成的。 我们使用TWRequest或SLRequest来创build您的请求。 一旦我们完成了这一点,我们从这些中获取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; } } 

可能是这个代码可以优化更多,但你明白了。 variablesaccessToken将具有实际的访问令牌。

实际上,如果您唯一的担心是检索OAuth令牌,那么使用Social框架可以非常简单地访问此令牌。 在文档里面有一个叫做:

 func preparedURLRequest() -> NSURLRequest! 

返回值兼容OAuth的NSURLRequest对象,允许应用程序代表用户操作,同时保持用户密码的私密性。 默认情况下,NSURLRequest被标记为OAuth1,或者通过基于用户帐户添加适当的标记来OAuth2。

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

所以你可以简单地创build一个签名的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了。

然而,你不会有秘密令牌(因为它被用来生成oauth_signature按照twitter文档 ),这使得这对服务器端pipe理来说很没用。

看看这个项目https://github.com/seancook/TWReverseAuthExample 。 有TWAPIManager类为你做这项工作。