2012-02-10 31 views
7

Tôi đang làm việc với việc xác thực người dùng để sử dụng tài khoản google mà anh được liên kết. Vấn đề là mỗi khi người dùng đăng nhập thông qua ứng dụng của tôi, "Cho phép truy cập" luôn xuất hiện trên chế độ xem xác thực của Google ngay cả khi tôi đã nhấp vào thử nghiệm Cho phép truy cập đã từ trước đó. Đây có phải là bình thường hoặc tôi đang làm mã của tôi sai? Xin hãy giúp tôi.iOS: Mã xác thực của Google

tôi đã sử dụng mã sau đây để loggin trong một ra:

- (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."]; } 

này là dành cho các đại biểu:

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

Và 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; 
} 

Bằng cách tham khảo của tôi đối với các mã này có trên liên kết này: http://code.google.com/p/gtm-oauth2/wiki/Introduction#Using_the_OAuth_2_Controllers

+0

Tôi nhận giá trị nil trong "GTMOAuth2ViewControllerTouch * viewController" mặc dù clientID, clientSecret, keychainItemName là chính xác.Bạn có thể khám phá những gì sai ở đây không? – Ponting

Trả lời

-2

Từ kinh nghiệm của tôi, hành vi này là bình thường.

Bạn có nghi ngờ vì facebook chỉ hỏi người dùng một lần nếu người dùng muốn cấp đặc quyền ứng dụng để truy cập tiểu sử của người dùng?

+0

Điều này làm cho hoàn toàn không có ý nghĩa và ngay cả trên Android SDK Drive hoạt động bằng cách chỉ yêu cầu khi người dùng đã __NOT__ cung cấp các đặc quyền đã có. Tại sao Google làm cho phiên bản iOS khác nhau? – KVISH

3

từ các tài liệu:

Tên mục keychain được sử dụng để lưu các mã thông báo keychain của người dùng, và cần xác định cả tên ứng dụng của bạn và tên dịch vụ (s). Nếu keychainItemName là không, mã thông báo sẽ không được lưu và người dùng sẽ phải đăng nhập lại vào lần tiếp theo khi ứng dụng chạy.

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

Vì vậy, từ mã của bạn, nó phụ thuộc vào những gì kKeychainItemName được thiết lập để.

Chỉ nghĩ rằng tôi sẽ nhận xét về điều này khi tôi đang đọc tài liệu.

0

Tôi biết đây là một câu hỏi cũ, nhưng tôi gặp phải vấn đề tương tự vì vậy tôi viết giải pháp của mình, nó có thể giúp người khác trong tương lai.

Hóa ra đó là không đủ để chỉ đặt self.auth, bạn cũng cần phải thiết lập các self.analyticsService.authorizer biến

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

này đã làm các trick cho tôi, người dùng không còn yêu cầu nhập thông tin đăng nhập.

3

Sử dụng phương pháp này khi bạn nhận được đối tượng oauth để lưu vào keychain

[GTMOAuth2ViewControllerTouch saveParamsToKeychainForName:YOUR_KEYCHAIN_ITEM_NAME authentication:auth]; 

trước khi thực hiện một cuộc gọi đến api chỉ cần kiểm tra và lấy đối tượng oauth sử dụng này

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

và đảm bảo đối tượng oauth của nó là xác thực với việc sử dụng

này
+0

bạn có thể vui lòng đề nghị tôi rằng làm thế nào để có được Key Chain Name và id khách hàng bí mật. Khi tôi đang tạo bằng tài khoản google thì chỉ có thể nhận được Client id. – 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]; 

] 
Các vấn đề liên quan