我正在尝试获取RestKit(版本0.10.2)以使用OAuth2进行身份验证。我正在使用GTMOAuth2来处理OAuth交互。
我已成功获得GTMOAuth2签到我并向我正在使用的api发出请求。 我还设法让RestKit使用我的访问令牌发出请求:
- (void)setRKAuthorizationToken:(NSString *)authorizationToken {
RKObjectManager* objectManager = [RKObjectManager sharedManager];
NSString* authHeader = [NSString stringWithFormat:@"Bearer %@", authorizationToken];
[objectManager.client setValue:authHeader forHTTPHeaderField:@"Authorization"];
}
在此代码示例中,我手动设置HTTP标头,因为RestKit对OAuth2的支持将标头设置为Authorization: OAuth2 <accessToken>
而不是Authorization: Bearer <accessToken>
。
无论如何,这种方法很有效,直到需要使用刷新令牌刷新访问令牌。
我真正想要做的是告诉RestKit使用GTMOAuth2Authentication
的{{1}},因为它会在访问令牌到期时自动使用刷新令牌获取新的访问令牌。
BTW,RestKit是phasing it's support for OAuth;建议的方法是使用第三方库授权请求。我asked for an example并且响应指向了子类的方向,它位于- (BOOL)authorizeRequest:(NSMutableURLRequest *)request;
分支中。
所以,问题是:您是否已成功将RestKit 0.10.x与GTMOAuth2集成或知道如何实现此目的?
答案 0 :(得分:0)
我将在这里回答我自己的问题,因为我有一些有用的东西,但它并不理想。
基本上我继续手动签署请求,并且为了处理过期令牌的可能性,我使用GTMOAuth来授权虚拟请求。严重的缺点是它意味着对api的额外请求。但是,现在我知道我有一个有效的访问令牌。部分技巧是知道何时致电loginWithBaseController:
。
这是基本概念:
- (void)makeRequestToEnsureAccessTokenSuccess:(void (^)())block error:(void (^)(NSError*))errorBlock {
NSURL *url = [NSURL URLWithString:@"https://uri/to/a/basic/api/call.json"];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
// TODO: Only do this if we need to. It's kind of a waste to refresh the token
// all the time.
[self.gtmoauth authorizeRequest:request completionHandler:^(NSError *error) {
if (error) {
errorBlock(error);
} else {
[GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:kKeychainItemName accessibility:NULL authentication:self.gtmoauth];
block();
}
}];
}
- (void)loginWithBaseController:(UIViewController *)baseViewController {
[self loadAuthFromKeyChain];
if (self.gtmoauth.canAuthorize) {
[self makeRequestToEnsureAccessTokenSuccess:^{
NSLog(@"setting RKAuthorizationToken with %@", self.gtmoauth.accessToken);
[self setRKAuthorizationToken: self.gtmoauth.accessToken];
[self.delegate authorizationFinished];
} error:^(NSError* error) {
[self logout];
[self showAuthorizationControllerFor:baseViewController];
}];
} else {
[self showAuthorizationControllerFor:baseViewController];
}
}
无论如何,我仍然在寻找更好的解决方案。我想我会发布这个,以防它至少通过开发帮助别人。
答案 1 :(得分:0)
RestKit Wiki上的这篇文章OAuth Support on Restkit引用了使用AFOAuth2Client的完整解决方案。
telegraphy-interactive/OAuthClientSetup处引用的示例iOS应用程序具有可授权操作的可插入架构。它包含一个类OACSAuthOpRK
,它提供RestKit RKObjectManager
操作来发出授权请求。
其中使用的策略是将请求包装在授权内。授权检查OAuth2授权令牌的货币。查找令牌当前,它会尝试请求并检查返回状态。查找令牌已过期,或从请求中查找401状态返回,它将刷新授权令牌并再次尝试请求。