Renjish C
Renjish C

Reputation: 49

How to implement refresh token in ios

only some api call needs the token. and when 401 occurs refresh token call will be taken place.and for each call the token is refreshing. how to execute more than 1 api synchronously when 401 occurs

Upvotes: 1

Views: 2356

Answers (1)

Aleem
Aleem

Reputation: 3291

This is upto you, how you design the flow but I did almost same problem like following in Objective C

  • Call method of like in my case userProfileGETRequest
  • Before calling userProfileGETRequest Check date if token gets expired(in your case may be status code == 401)
  • If Token not expired simply call API in my case userProfileAPI with last token
  • If Token Expired then Call Refresh token and with Success and Failure Callback
  • If successful refresh token, call the userProfileAPI API with updated refresh token.

        + (void) userProfileGETRequest:(NSDictionary *)headerParams urlQuery: (NSString*)action parameters:(NSDictionary*)params docOpenPassword: (NSString*)password docOpenOtp: (NSString*)otp
                onComplete:(void (^)(id json, id code, id url))successBlock
                   onError:(void (^)(id error, id code, id url))errorBlock {if ([[SingletonSDK sharedInstance] isTokenExpired:[NSDate date]]) {[self refereshToken:nil :^(id json, id code) {
        [[SingletonSDK sharedInstance] handleLoginResponseObject:json];
    
            [self userProfileAPI:headerParams urlQuery:action parameters:params
    
                      onComplete:^(id json, id code, id url) {
                          successBlock(json, code, url);
                      } onError:^(id error, id code, id url) {
                          errorBlock(error, code, url);
                      }];
    
        } onError:^(id error, id code) {
            [[SingletonSDK sharedInstance] hideProgessHud];
            return ;
        }];
    }
    
    } else {
        [self userProfileAPI:headerParams urlQuery:action parameters:params
                  onComplete:^(id json, id code, id url) {
                      successBlock(json, code, url);
                  } onError:^(id error, id code, id url) {
                      errorBlock(error, code, url);
                  }];
    }}
    

//userProfileAPI Methods

+ (void) userProfileAPI:(NSDictionary *)headerParams urlQuery: (NSString*)action parameters:(NSDictionary*)params 
                                         onComplete:(void (^)(id json, id code, id url))successBlock
                                            onError:(void (^)(id error, id code, id url))errorBlock
{

NSString *authorizationValue = [self setAuthorizationValue:action];
NSString *language = [self editedLanguageNameAsApiRequired];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

//set headers values
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:language forHTTPHeaderField:@"Accept-Language"];
[manager.requestSerializer setValue:authorizationValue forHTTPHeaderField:@"authorization"];

[manager GET:action parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"getRequest response success");
    NSString *url = [[[operation response] URL] absoluteString];
    NSInteger statusCode = [operation.response statusCode];
    NSNumber *statusObject = [NSNumber numberWithInteger:statusCode];

    successBlock(responseObject, statusObject, url);
}
     failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     NSString *url = [[[operation response] URL] absoluteString];
     NSInteger statusCode = [operation.response statusCode];
     NSNumber *statusObject = [NSNumber numberWithInteger:statusCode];
     if ([self takeDesiredActionIfAccessTokenExpired:statusCode]) {
         return ;
     }
     id responseObject = operation.responseData;
     id json = nil;
     id errorMessage = nil;

     if ([statusObject integerValue] == 404) {
         errorMessage = [[SingletonSDK sharedInstance] getStringValueFromLanguageKey: COMMON_ERROR_SHARED_PREFERENCES];//NSLocalizedString(COMMON_ERROR_RESOURCE_NOT_FOUND, nil);
     } else {
         if (responseObject) {

             json = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:&error];
             errorMessage = [(NSDictionary*)json objectForKey:@"Message"];

         }else{

             json = [error.userInfo objectForKey:NSLocalizedDescriptionKey];
             errorMessage = json;

         }
     }


     if(![errorMessage isKindOfClass:[NSString class]]){
         errorMessage = [[SingletonSDK sharedInstance] getStringValueFromLanguageKey: COMMON_ERROR_MSG] ; //NSLocalizedString(COMMON_ERROR_MSG, nil);
     }

 }];
}

Upvotes: 1

Related Questions