iOS: код аутентификации Google - PullRequest
       19

iOS: код аутентификации Google

7 голосов
/ 10 февраля 2012

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

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

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

И проснулся от Nib:

- (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

Ответы [ 5 ]

3 голосов
/ 08 июля 2015

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

[GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:YOUR_KEYCHAIN_ITEM_NAME authentication:auth];

и

перед вызовом api просто проверьте и получите объект 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])
3 голосов
/ 23 августа 2012

из документов:

Имя элемента цепочки для ключей используется для сохранения токена в цепочке для ключей пользователя и должно идентифицировать как имя вашего приложения, так и имена служб. Если keychainItemName равно nil, токен не будет сохранен, и пользователю придется снова войти в систему при следующем запуске приложения.

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

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

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

0 голосов
/ 20 ноября 2015
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];

]
0 голосов
/ 09 июля 2013

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

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

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

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

0 голосов
/ 13 июля 2012

По моему опыту, это нормальное поведение.

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

...