DevFly
DevFly

Reputation: 423

GTM OAuth2 retrieving access_token via Keychain not successful

I'm following Google's examples on how to authorize an app to access one or more APIs. The problem is that when i authorise successfully i get the access_token, but after this i can't get it from the keychain it is stored into. I read somewhere that iPhone Simulator doesn't work with Keychain, is it because of that, and if it is can you tell me some other way to store my access token?

Here is my code:

    static NSString *const kKeychainItemName = @"OAuthGoogleReader";

    GTMOAuth2Authentication *auth;
    auth = [GTMOAuth2ViewControllerTouch authForGoogleFromKeychainForName:kKeychainItemName
                                                                 clientID:kClientID
                                                             clientSecret:kClientSecret];

BOOL isSignedIn = [auth canAuthorize];
    if (isSignedIn) {
        NSLog(@"Signed");
        self.window.rootViewController = self.viewController;
        auth.accessToken = [[NSUserDefaults standardUserDefaults] objectForKey:@"accessToken"];
          NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com/reader/api/0/subscription/list?access_token=%@", [auth accessToken]]]];
          GTMHTTPFetcher* myFetcher = [GTMHTTPFetcher fetcherWithRequest:request];

          // optional upload body data

          //[myFetcher setPostData:[postString dataUsingEncoding:NSUTF8StringEncoding]];
        [myFetcher setAuthorizer:auth];
          [myFetcher beginFetchWithDelegate:self
                          didFinishSelector:@selector(myFetcher:finishedWithData:error:)];
         // - (void)myFetcher:(GTMHTTPFetcher *)fetcher finishedWithData:(NSData *)retrievedData error:(NSError *)error;
    }else{
    NSString *scope = @"https://www.google.com/reader/api/";

    GTMOAuth2ViewControllerTouch *viewController;
    viewController = [[GTMOAuth2ViewControllerTouch alloc] initWithScope:scope
                                                                clientID:kClientID
                                                            clientSecret:kClientSecret
                                                        keychainItemName:kKeychainItemName
                                                                delegate:self
                                                        finishedSelector:@selector(viewController:finishedWithAuth:error:)];

        self.window.rootViewController = viewController;
    }

I get error:

2012-08-22 16:54:47.253 greader[20833:c07] Signed
2012-08-22 16:54:47.705 greader[20833:c07] Cannot authorize request with scheme http (<NSMutableURLRequest http://www.google.com/reader/api/0/subscription/list?access_token=(null)>)

as you can see access_token is just nil.

Also some simple examples on how to use this library would be great.

Thank you!

Upvotes: 1

Views: 1069

Answers (1)

grobbins
grobbins

Reputation: 1564

The gtm-oauth2 library handles storing and retrieving the access token and other auth values on the keychain. The app should not need to use the access token string directly, nor should the app put the authorization tokens into NSUserDefaults, as that is insufficiently secure.

gtm-auth2 also by default will refuse to attach an access token to a URL with an http: scheme. OAuth 2 is secure only when used with https: scheme URLs.

Upvotes: 1

Related Questions