2012-02-23 5 views
0

Я использовал GTMOAuth для успешного входа в Dropbox, но я, похоже, не могу заставить делегата выполнить обратный вызов после ответа ответа У меня есть этот код для login ..Получение делегата для обратного вызова при успешном удалении входа в систему с использованием REST api через GTMOAuth

NSURL *requestURL = [NSURL URLWithString:@"https://api.dropbox.com/1/oauth/request_token"]; 
NSURL *accessURL = [NSURL URLWithString:@"https://api.dropbox.com/1/oauth/access_token"]; 
NSURL *authorizeURL = [NSURL URLWithString:@"https://www.dropbox.com/1/oauth/authorize"]; 
NSString *scope = nil; 

GTMOAuthAuthentication *auth = [self authForTwitter]; 
if (auth == nil) { 
// perhaps display something friendlier in the UI? 
NSAssert(NO, @"A valid consumer key and consumer secret are required for signing in to Twitter"); 
} 

// set the callback URL to which the site should redirect, and for which 
// the OAuth controller should look to determine when sign-in has 
// finished or been canceled 
// 
// This URL does not need to be for an actual web page; it will not be 
// loaded 
[auth setCallback:@"https://www.dropbox.com"]; 

NSString *keychainItemName = nil; 
if ([self shouldSaveInKeychain]) { 
    keychainItemName = kTwitterKeychainItemName; 
} 

// Display the autentication view. 
GTMOAuthViewControllerTouch *viewController; 
viewController = [[[GTMOAuthViewControllerTouch alloc] initWithScope:scope 
      language:nil 
     requestTokenURL:requestURL 
    authorizeTokenURL:authorizeURL 
     accessTokenURL:accessURL 
     authentication:auth 
     appServiceName:keychainItemName 
      delegate:self 
    finishedSelector:@selector(viewController:finishedWithAuth:error:)] autorelease]; 

// We can set a URL for deleting the cookies after sign-in so the next time 
// the user signs in, the browser does not assume the user is already signed 
// in 
[viewController setBrowserCookiesURL:[NSURL URLWithString:@"http://api.dropbox.com/"]]; 

// You can set the title of the navigationItem of the controller here, if you want. 

[[self navigationController] pushViewController:viewController animated:YES]; 

Я пробовал редактировать библиотеку, но безуспешно.

ответ

1

Удар в ту же проблему. После некоторой отладки кажется, что проблема заключается в том, что URL-адрес обратного вызова не включен в шаг «6.2.1. Потребитель направляет пользователя на поставщика услуг» (http://oauth.net/core/1.0a/#auth_step2). Согласно спецификациям OAuth, это не должно, но Dropbox требует, чтобы он выполнял перенаправление.

Таким образом, чтобы проверить, я изменил GTMOAuthAuthentication.m так:

+ (NSArray *)tokenAuthorizeKeys { 
    // keys for opening the authorize page, http://oauth.net/core/1.0a/#auth_step2 
    NSArray *keys = [NSArray arrayWithObjects: 
        kOAuthTokenKey, 
        // extensions 
        kOAuthDomainKey, 
        kOAuthHostedDomainKey, 
        kOAuthLanguageKey, 
        kOAuthMobileKey, 
        kOAuthScopeKey, 
        kOAuthCallbackKey, // !pi! 20120313 dropbox testing 
        nil]; 
    return keys; 
} 

т.е. добавил обратный вызов URL на эту стадию, а также. Теперь GTMOAuth работает с Dropbox для меня.

Должно быть лучшее решение для этого, но я просто тестировал GTMOAuth/RESTKit, и этого было достаточно для меня.