0

I am trying to acquire token Interactively for multiple scopes, Policy and RMS scopes using Objective C. I am not sure whether I am doing it right or wrong, the way I am trying to get it as below. I have written a method "aquireToken" where I am calling the function twice one for Policy scope and other RMS scope and updating result in NSDictionary.

There is a flag which is being updated inside the "completionBlock = ^(MSALResult *result, NSError *error)". But its value is not reflected in the caller "aquireToken" function.

The code snippet is as below:

- (void) aquireToken
{

    policyTokenResult = false;
    rmsTokenResult = false;

    NSError *error = nil;
    MSALPublicClientApplication *application = [self createPublicClientApplication:&error];


    [self retrieveTokens:application forScopes:scopesPolicy isPolicy:true];

    if (policyTokenResult)
        {
            [self retrieveTokens:application forScopes:scopesRMS isPolicy:false];
        }


    for (NSString* key in resultMap) {
        id value = resultMap[key];
      //  id object = [resultDict objectForKey:key];
        NSLog(@"%@ = %@", key, value);
        // do stuff
    }

}  

- (void)retrieveTokens:(MSALPublicClientApplication*) application
         forScopes: (NSArray<NSString *> *) scopes
          isPolicy: (BOOL) isPolicy
{

NSError *error = nil;
MSALAccount* userAccount  = nil;

for (MSALAccount *account in [application allAccounts:&error])
{
    if([[account.username uppercaseString] isEqualToString:[authID uppercaseString]])
    {
        NSLog(@"Account Found: \t%@", account.username);
        userAccount = account;
        break;
    }
}

MSALCompletionBlock completionBlock;
__block __weak MSALCompletionBlock weakCompletionBlock;

weakCompletionBlock = completionBlock = ^(MSALResult *result, NSError *error)
{
    dispatch_async(dispatch_get_main_queue(), ^{
        if (!error)
        {
            if (isPolicy)
            {
                [resultMap setObject:result.accessToken forKey:@"PolicyAccessToken"];
                [resultMap setObject:result.account.username forKey:@"UserId"];
                authID = result.account.username;
                policyTokenResult = true;

            }
            else
            {
                [resultMap setObject:result.accessToken forKey:@"RMSAccessToken"];
                rmsTokenResult = true;
            }

            if(policyTokenResult && rmsTokenResult)
            {
                [resultMap setObject:@"" forKey:@"ResultStatusSuccess"];
            }

            return;
        }

        if ([error.domain isEqualToString:MSALErrorDomain] && error.code == MSALErrorInteractionRequired)
        {
            [self acquireTokenInteractive:application scopes:scopes isPolicy:isPolicy completionBlock:weakCompletionBlock];
            return;
        }

    });

};

if(userAccount)
{
    [self acquireTokenSilent:application scopes:scopes forAccount:userAccount isPolicy:isPolicy completionBlock:completionBlock];

}
else
{
    [self acquireTokenInteractive:application scopes:scopes isPolicy:isPolicy completionBlock:completionBlock];

}
}

- (void) acquireTokenSilent: (MSALPublicClientApplication *) application
                     scopes: (NSArray<NSString *> *) scopes
                 forAccount: (MSALAccount *) userAccount
                   isPolicy: (BOOL) isPolicy
            completionBlock: (MSALCompletionBlock) completionBlock
{

    MSALSilentTokenParameters *silentParams = [[MSALSilentTokenParameters alloc] initWithScopes:scopes account:userAccount];

    [application acquireTokenSilentWithParameters:silentParams completionBlock:completionBlock];
}

- (void) acquireTokenInteractive: (MSALPublicClientApplication *) application
                          scopes: (NSArray<NSString *> *) scopes
                        isPolicy: (BOOL) isPolicy
                 completionBlock: (MSALCompletionBlock)completionBlock
{

    MSALInteractiveTokenParameters *interactiveParams = [[MSALInteractiveTokenParameters alloc] initWithScopes:scopes];
    [interactiveParams setPromptType:MSALPromptTypeSelectAccount];
    interactiveParams.completionBlockQueue = dispatch_get_main_queue();
    [application acquireTokenWithParameters:interactiveParams completionBlock:completionBlock];
}
  • The "policyTokenResult" flag's updated value is not reflected in "aquireToken" so it is not being called 2nd time. Also values not reflected in dictionary object as well in "aquireToken". – Vinod Singh May 11 '20 at 13:20
  • The same thing can be achieved in C# by: Task t = AuthenticateUtil(publicClientApp, m_scopesPolicy, true); t.Wait(); if (m_policyTokenResult) { t = AuthenticateUtil(publicClientApp, m_scopesRMS, false); t.Wait(); } How we can achieve the same in ObjectiveC? – Vinod Singh May 11 '20 at 13:38

0 Answers0