2012-11-02 25 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狀態返回時,它將刷新授權令牌並再次嘗試請求。