我对如何使用iOS社交框架获取推特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_*参数字典,例如consumer_key、nononce等。但是,将我的ACAccount附加到SLRequest确实可以达到这个目的吗?在任何情况下,当我尝试这样做时,我都会得到错误“无法验证oauth签名和令牌”。
所以我的问题是,我应该在ACAccountCredential中看到Twitter OAuth令牌,还是应该使用反向认证?如果是这样,我是否需要显式地传递包含oauth_*参数的NSDictionary,或者附加ACAccount就足够了?
发布于 2013-02-17 00:41:51
让我们通过几个步骤来回答这个问题,有一些事情需要解决/澄清。
ACAccountCredential
此对象与ACAccount对象配合使用,以便帐户框架能够对特定帐户的用户进行身份验证。它不是为随意读取而设计的;它应该只在您需要将帐户保存到帐户框架时使用。
Documentation from Twitter指出,如果您要迁移到帐户框架来管理用户的帐户,而不是使用您自己的服务器,或者对于较旧的iOS应用程序,您需要填充一个ACAccountCredential来管理本地帐户。
帐户保存到帐户框架后,无法读取凭据的Apple clearly say in their documentation。
出于隐私原因,帐户保存后将无法访问此属性。
因此,这就是为什么推特提供了使用反向身份验证的能力,以防您仍然需要OAuth令牌来进行服务器端管理。我不知道为什么你可以在Facebook账户上获得,但是对于Twitter,你不能直接跳转到预先保存的ACAccountCredential。
使用Twitter的反向身份验证
Twitter提供的文档(链接在您的问题中)清楚地说明了访问OAuth访问令牌需要做些什么,但我将尝试澄清一些不太清楚的事情。
除了账号和推特框架之外,还需要一个额外的框架来实现这一点:Social.framework。确保将其导入,因为这将使请求令牌变得相当简单。
至于你需要发送的请求,推特不知道ACAccounts。请记住,这种反向认证过程并不是特定于iOS的,它可以由任何可以访问web的计算设备来完成。因此,您需要使用指定的参数(OAuth标准参数+ x_auth_mode)向https://api.twitter.com/oauth/request_token发送HTTP POST请求。更清楚地说明所需的参数can be found here,但您问题中的链接也会清楚地说明哪些参数是必需的。您需要提供自己的nonce和其他参数值。
您可以使用SLRequest类或AFNetworking向推特发出POST请求,传入参数值的NSDictionary (如推特的access_token文档中的代码示例所示)。
就是这样
回答完这两点之后,我认为很明显,您需要使用反向身份验证才能根据需要访问正确的OAuth令牌。Twitter文档清楚地说明了您需要做什么(它甚至提供了您可以使用的代码示例),但是您确实需要了解一般的OAuth请求/响应管理。不能简单地附加ACAccount,需要用所需的OAuth参数填充字典,然后将其传递给对request_token的HTTP POST请求。我已经提供了相当多的参考资料供您参考,我希望这将使您走上正确的道路。
发布于 2013-07-06 09:02:16
假设您打算在>= 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将具有实际的访问令牌。
发布于 2014-09-16 08:20:54
实际上,如果您唯一关心的是检索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 token (因为它用于根据twitter documentation生成oauth_signature ),这使得它对于服务器端管理非常无用。
https://stackoverflow.com/questions/14874785
复制相似问题