Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何在iOS上将GTMOAuth2与RestKit集成?_Iphone_Objective C_Ios_Oauth 2.0_Restkit - Fatal编程技术网

Iphone 如何在iOS上将GTMOAuth2与RestKit集成?

Iphone 如何在iOS上将GTMOAuth2与RestKit集成?,iphone,objective-c,ios,oauth-2.0,restkit,Iphone,Objective C,Ios,Oauth 2.0,Restkit,我正在尝试获取(版本0.10.2)以使用OAuth2进行身份验证。我用它来处理OAuth交互 我已经成功地让GTMOAuth2让我登录并向我正在使用的api发出请求。 我还设法让RestKit使用我的访问令牌发出请求: -(void)setRKAuthorizationToken:(NSString*)authorizationToken{ RKObjectManager*objectManager=[RKObjectManager sharedManager]; NSString*authHe

我正在尝试获取(版本0.10.2)以使用OAuth2进行身份验证。我用它来处理OAuth交互

我已经成功地让GTMOAuth2让我登录并向我正在使用的api发出请求。 我还设法让RestKit使用我的访问令牌发出请求:

-(void)setRKAuthorizationToken:(NSString*)authorizationToken{
RKObjectManager*objectManager=[RKObjectManager sharedManager];
NSString*authHeader=[NSString stringWithFormat:@“Bearer%@”,authorizationToken];
[objectManager.client setValue:authHeader for HttpHeaderField:@“Authorization”];
}
在这个代码示例中,我手动设置HTTP头,因为RestKit对OAuth2的支持将头设置为
Authorization:OAuth2;建议使用第三方库授权请求。我的回答为我指明了从类到子类的方向,它们位于
开发
分支中


所以,问题是:您是否成功地将RestKit 0.10.x与GTMOAuth2集成,或者知道如何实现这一点?

我将在这里回答我自己的问题,因为我有一些东西可以工作,但并不理想

基本上,我继续手动签署请求,为了处理令牌过期的可能性,我使用GTMOAuth授权一个虚拟请求。严重的缺点是它意味着对api的额外请求。但是,现在我知道我有一个有效的访问令牌。技巧的一部分是知道何时调用
loginWithBaseController:

以下是基本概念:

-(void)MakeRequestToEnsuccessTokenSuccess:(void(^)()块错误:(void(^)(NSError*)错误块{
NSURL*url=[NSURL URLWithString:@”https://uri/to/a/basic/api/call.json"];
NSMutableURLRequest*请求=[NSMutableUrlRequestRequestWithURL:url];
//TODO:只有在我们需要的时候才这样做。刷新令牌是一种浪费
//一直如此。
[self.gtmoauth authorizeRequest:RequestCompletionHandler:^(NSError*错误){
如果(错误){
错误块(error);
}否则{
[GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:kKeychainItemName可访问性:空身份验证:self.gtmoauth];
block();
}
}];
}
-(void)loginWithBaseController:(UIViewController*)baseViewController{
[自加载AuthFromKeychain];
if(self.gtmoauth.canAuthorize){
[self makeRequestToEnsureAccessTokenSuccess:^{
NSLog(@“使用%@设置RKAuthorizationToken”,self.gtmoauth.accessToken);
[self-setRKAuthorizationToken:self.gtmoauth.accessToken];
[自我授权完成];
}错误:^(N错误*错误){
[自动注销];
[自显示授权控制器:baseViewController];
}];
}否则{
[自显示授权控制器:baseViewController];
}
}

无论如何,我仍在寻找更好的解决方案。我想我会发布这篇文章,以防它至少通过开发帮助其他人。

这篇文章在restkitwiki上引用了一个完整的解决方案

处引用的示例iOS应用程序具有用于授权操作的可插拔架构。它包括一个类,
OACSAuthOpRK
,该类提供了一个RestKit
RKObjectManager
操作,用于发出授权请求

这里使用的策略是将请求包装在授权中。授权检查OAuth2授权令牌的货币。找到当前令牌后,它会尝试请求并检查返回状态。如果发现令牌已过期,或者从请求中找到401状态返回,它将刷新授权令牌并再次尝试请求