2012-11-02 23 views
1

我试图获得RestKit(版本0.10.2)以使用OAuth2进行身份验证。我正在使用GTMOAuth2来处理OAuth交互。如何在iOS上将GTMOAuth2与RestKit集成?

我已经成功地获得了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- (BOOL)authorizeRequest:(NSMutableURLRequest *)request;,因为它在访问令牌到期时自动使用刷新令牌获取新的访问令牌。

顺便说一句,RestKit是phasing it's support for OAuth;建议的方法是使用第三方库授权请求。我asked for an example和响应指出我在类的方向子类,这是在development分支。

所以,问题是:你是否成功地将RestKit 0.10.x与GTMOAuth2集成在一起,或者知道如何做到这一点?

回答

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]; 
    } 
} 

无论如何,我仍然在寻找更好的解决方案。我想我会发布这个以防万一通过开发帮助别人。

0

这篇文章在RestKit维基上,OAuth Support on Restkit引用了一个使用AFOAuth2Client的完整解决方案。

引用的示例iOS应用程序telegraphy-interactive/OAuthClientSetup具有用于授权操作的可插入体系结构。它包括一个类OACSAuthOpRK,它提供了用于进行授权请求的RestKit RKObjectManager操作。

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