Search code examples
iosiphoneoauth-2.0afnetworkingfitbit

How to call an OAuth 2.0 API from iOS


I am working on Fitbit integration. How can I make request and authorize its OAuth 2.0 API. I checked ASIHTTPRequest but it is not available on ARC. Can I do it with AFNetworking ? I am using Objective-C.


Solution

  • Its done using AFNetworking using AFOAuth2Manager here is the code

    In ViewController.m

    #define CLIENT_ID         @"your client id"
    #define CONSUMER_SECRET      @"your consumer secret"
    

    Start authorization using safari.

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize?response_type=code&client_id=227FKJ&redirect_uri=http%3A%2F%2Fcallback.com%2Ffitbit&scope=activity%20nutrition%20heartrate%20location%20nutrition%20profile%20settings%20sleep%20social%20weight"]];
    

    get response code from NSUserDefaults

    NSString *string  = [[NSUserDefaults standardUserDefaults] valueForKey:@"auth_code"];
        NSURL *baseURL = [NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize"];
        AFOAuth2Manager *OAuth2Manager =
        [[AFOAuth2Manager alloc] initWithBaseURL:baseURL
                                        clientID:CLIENT_ID secret:CONSUMER_SECRET];
        NSDictionary *dict = @{@"client_id":CLIENT_ID, @"grant_type":@"authorization_code",@"redirect_uri":@"http://lampdemos.com/fitbit",@"code":string};
    
        [OAuth2Manager authenticateUsingOAuthWithURLString:@"https://api.fitbit.com/oauth2/token" parameters:dict success:^(AFOAuthCredential *credential) {
            NSLog(@"Token: %@", credential.accessToken);
            AppDelegate *adddel = (AppDelegate *)[[UIApplication sharedApplication]delegate];
            adddel.credential = credential;
            [self getUserProfileWithCredentials:credential];
        } failure:^(NSError *error) {
            NSLog(@"Error: %@", error);
        }];
    

    call further requests

    -(void)getUserProfileWithCredentials:(AFOAuthCredential*)credential{
        NSURL *baseURL = [NSURL URLWithString:@"https://www.fitbit.com/oauth2/authorize"];
    
        AFHTTPRequestOperationManager *manager =
        [[AFHTTPRequestOperationManager alloc] initWithBaseURL:baseURL];
        [manager.requestSerializer setAuthorizationHeaderFieldWithCredential:credential];
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        [manager GET:@"https://api.fitbit.com/1/user/-/profile.json"
          parameters:nil
             success:^(AFHTTPRequestOperation *operation, id responseObject) {
    
                 NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
                 NSDictionary *userDict  =[dictResponse valueForKey:@"user"];
                NSLog(@"Success: %@", userDict);
                 NSMutableString *str =[NSMutableString stringWithFormat:@"%@",@""];
                 for (NSString *key in [userDict allKeys]) {
                     [str appendFormat:@"%@ %@\n",key,[NSString stringWithFormat:@"%@",[userDict valueForKey:key]]];
                 }
                 self.profileDetails.text =str;
    
             }
             failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                 NSLog(@"Failure: %@", error);
             }];
    }