2012-02-10 2 views
7

Я работаю с аутентификацией пользователя, чтобы использовать учетную запись google, с которой он связан. Проблема в том, что каждый раз, когда пользователь регистрируется через мое приложение, «Разрешить доступ» всегда появляется в представлении проверки подлинности Google, даже если я нажал «Разрешить доступ» уже из предыдущего теста. Является ли это нормальным, или я неправильно делаю свои коды? Пожалуйста, помогите мне, ребята.iOS: Код аутентификации Google

Я использовал следующие коды Вход для реселлеров в из:

- (IBAction)signIn:(id)sender { 
    if(!isSignedIn){ 
     [self signOutFromAll]; 

     NSString *keychainItemName = nil; 

     // save keychain 
     keychainItemName = kKeychainItemName; 

     NSString *scope = @"https://www.googleapis.com/auth/plus.me"; 

     NSString *clientID = kClientID; 
     NSString *clientSecret = kClientSecret; 

     SEL finishedSel = @selector(viewController:finishedWithAuth:error:); 

     GTMOAuth2ViewControllerTouch *viewController; 
     viewController = [GTMOAuth2ViewControllerTouch controllerWithScope:scope 
                    clientID:clientID 
                   clientSecret:clientSecret 
                  keychainItemName:keychainItemName 
                    delegate:self 
                  finishedSelector:finishedSel]; 

     [[self navigationController]pushViewController:viewController animated:YES]; 
    } else { 
     [self displayAlertWithMessage:@"Currently Signed in."]; 
    } } 

- (IBAction)signOut:(id)sender { 
    [self signOutFromAll]; 
    [self displayAlertWithMessage:@"Signed out."]; } 

Это для делегата:

- (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController 
     finishedWithAuth:(GTMOAuth2Authentication *)auth 
       error:(NSError *)error{ 
    if(error != nil){ 
     // Authentication failed... 
     NSLog(@"Authentication error: %@", error); 
     NSData *responseData = [[error userInfo] objectForKey:@"data"]; 
     if([responseData length] > 0) 
      NSLog(@"%@", [[[NSString alloc]initWithData:responseData encoding:NSUTF8StringEncoding]autorelease]); 
     self.auth = nil; 
    } else { 
     // Authentication succeeded... 
     isSignedIn = YES; 
     self.auth = auth; 
    } 
} 

И awakeFromNib:

- (void)awakeFromNib{ 
    // Fill in the Client ID and Client Secret text fields 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    // First, we'll try to get the saved Google authentication, if any, from the keychain 
    // Normal applications will hardcode in their client ID and client secret, 
    // But the sample app allows the user to enter them in a text field, and saves them in the preferences 
    NSString *clientID  = [defaults stringForKey:kGoogleClientIDKey]; 
    NSString *clientSecret = [defaults stringForKey:kGoogleClientSecretKey]; 

    GTMOAuth2Authentication *auth; 

    auth = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName 
                   clientID:clientID 
                  clientSecret:clientSecret]; 

    if (auth.canAuthorize) { 
     // There is saved google authentication 
     // self.serviceSegments.selectedSegmentIndex = 0; 
    } 

    // Save the authentication object, which holds the auth tokens 
    self.auth = auth; 

    [self setAuth:auth]; 
    isSignedIn = self.auth.canAuthorize; 
} 

Кстати мой эталонным для этих кодов находится по этой ссылке: http://code.google.com/p/gtm-oauth2/wiki/Introduction#Using_the_OAuth_2_Controllers

+0

Я получил ноль значение в "GTMOAuth2ViewControllerTouch * ViewController" хотя ClientId, clientSecret, keychainItemName являются correct.Can вы explian, что это здесь не так? – Ponting

ответ

-2

Из моего опыта это обычное поведение.

У вас есть сомнения, потому что facebook только спрашивает пользователя один раз, если пользователь хочет предоставить привилегии приложения для доступа к профилю пользователя?

+0

Это абсолютно не имеет смысла, и даже на Android Drive SDK работает, только спрашивая, когда пользователь __NOT__ уже предоставил эти привилегии. Почему Google изменит версию iOS? – KVISH

3

из документации:

Брелок имя элемента используется, чтобы сохранить маркер на брелка пользователя, и следует определить как ваше имя приложения и имя (имена) службы. Если keychainItemName равно нулю, токен не будет сохранен, и пользователь должен будет снова войти в систему при следующем запуске приложения.

http://code.google.com/p/gtm-oauth2/wiki/Introduction

Так, из вашего кода, это зависит от того, что kKeychainItemName установлен в положение.

Просто подумал, что я прокомментирую это, поскольку я читал документы.

0

Я знаю, что это старый вопрос, но я столкнулся с той же проблемой, поэтому я пишу свое решение, это может помочь кому-то еще в будущем.

Оказывается, это не достаточно, чтобы установить только self.auth, вам также необходимо, чтобы установить self.analyticsService.authorizer переменная

if ([self.auth canAuthorize]) 
{ 
    self.analyticsService.authorizer = self.auth; 
    [self getAnalyticsData]; 
    return; 
} 

Это сделал трюк для меня, пользователь не дольше просили ввести учетные данные.

3

Используйте этот метод, когда вы получаете объект OAuth сохранить в брелка

[GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:YOUR_KEYCHAIN_ITEM_NAME authentication:auth]; 

и

, прежде чем сделать вызов апи просто проверить и получить объект OAuth с помощью этого

GTMOAuth2Authentication * auth = [GTMOAuth2ViewControllerTouch 
             authForGoogleFromKeychainForName:YOUR_KEYCHAIN_ITEM_NAME 
             clientID:GOOGLE_CLIENT_KEY 
             clientSecret:GOOGLE_CLIENT_SECRET]; 

и убедитесь, что объект oauth является подлинным с использованием этого

if(![GTMOAuth2ViewControllerTouch authorizeFromKeychainForName:YOUR_KEYCHAIN_ITEM_NAME authentication:auth]) 
+0

не могли бы вы предложить мне, как получить ключевое имя и идентификатор клиента. Когда я создаю учетную запись google, вы можете получить только идентификатор клиента. – Alok

0
Put the below code to logout/sign out from Google SDK. 

- Call below function from where you want: 

static NSString *const kKeychainItemName = @"MY_APP"; 



- (void)logoutFromGoogleDrive { 

[GTMOAuth2SignIn revokeTokenForGoogleAuthentication:(GTMOAuth2Authentication *)self.driveService.authorizer]; 

[GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:kKeychainItemName authentication:nil]; 

} 

[Note: Above code works, if you have used GTMOAuth2SignIn for sign in user for google access like, 

GTMOAuth2Authentication * auth = [GTMOAuth2ViewControllerTouch 
authForGoogleFromKeychainForName:YOUR_KEYCHAIN_ITEM_NAME 
clientID:GOOGLE_CLIENT_KEY 
clientSecret:GOOGLE_CLIENT_SECRET]; 

] 
Смежные вопросы