2012-02-10 27 views
7

मैं उपयोगकर्ता से जुड़े Google खाते का उपयोग करने के लिए प्रमाणीकृत करने के साथ काम कर रहा हूं। समस्या यह है कि जब भी उपयोगकर्ता मेरे ऐप के माध्यम से लॉग इन करता है, तो "एक्सेस एक्सेस" हमेशा Google के प्रमाणीकरण दृश्य पर दिखाई देता है, फिर भी मैंने पिछले परीक्षण से पहले से एक्सेस एक्सेस पर क्लिक किया था। क्या यह सामान्य है या क्या मैं अपने कोड गलत कर रहा हूं? कृपया मुझे लोगों की मदद करो।आईओएस: 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:

मैं एक बाहर में loggin के लिए निम्नलिखित कोड का उपयोग

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

मेरे अनुभव से, यह व्यवहार सामान्य है।

क्या आपको संदेह है क्योंकि फेसबुक केवल उपयोगकर्ता से पूछता है कि क्या उपयोगकर्ता उपयोगकर्ता की प्रोफ़ाइल तक पहुंचने के लिए ऐप विशेषाधिकार देना चाहता है?

+0

यह बिल्कुल समझ में नहीं आता है और एंड्रॉइड पर भी ड्राइव एसडीके केवल यह पूछकर काम करता है कि उपयोगकर्ता ने __NOT__ पहले से ही विशेषाधिकार प्रदान किए हैं। Google आईओएस संस्करण को अलग क्यों करेगा? – 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]; 

और

api के लिए कॉल करने से पहले कीचेन में बचाने के लिए बस की जाँच करें और इस

GTMOAuth2Authentication * auth = [GTMOAuth2ViewControllerTouch 
             authForGoogleFromKeychainForName:YOUR_KEYCHAIN_ITEM_NAME 
             clientID:GOOGLE_CLIENT_KEY 
             clientSecret:GOOGLE_CLIENT_SECRET]; 
का उपयोग कर OAuth वस्तु पुनः प्राप्त करने का प्रयोग करें

और सुनिश्चित करें कि यह ओथ ऑब्जेक्ट

का उपयोग करने के साथ प्रामाणिक है
+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]; 

]