(iOS) Успешно получить токен, но не может получить результат от веб-API, когда приложение открывается во второй раз - PullRequest
0 голосов
/ 20 декабря 2018

Я использую ADAL 2.4.1 (для iOS).Приложение успешно получает токен после входа в Azure AD и может использовать токен для вызова веб-API и получения данных.Однако я закрыл / убил приложение и снова открыл приложение.Приложение все еще может получить токен, но не может получить данные из веб-API.Сервер возвращает HTML-скрипт приложению.

Приложение регистрируется в Azure AD, чтобы получить токен доступа и сохранить его в приложении (используя цепочку ключей).Я буду использовать сохраненный токен доступа для вызова API.

Функция для получения API:

ADAuthenticationContext *authContext = [ADAuthenticationContext authenticationContextWithAuthority:AUTHORITY_URL error:nil];
authContext.credentialsType = AD_CREDENTIALS_AUTO;
NSURL *redirectUri = [[NSURL alloc]initWithString:REDIRECT_URI];

[authContext acquireTokenWithResource:"api_path"
                             clientId:CLIENT_ID
                          redirectUri:redirectUri
                       promptBehavior:AD_PROMPT_AUTO
                               userId:nil
                 extraQueryParameters: @""
                      completionBlock:^(ADAuthenticationResult *result)
 {
     if (result.status != AD_SUCCEEDED)
     {
         completionBlock(nil, nil, result.error);
     }
     else
     {
         completionBlock(result.tokenCacheItem.userInformation, result.tokenCacheItem.accessToken, nil);
     }
 }];

Функция для получения формы данных WebAPI:

    NSURL *url=[NSURL URLWithString:"API Path"];
    NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)postData.length];

    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    NSMutableURLRequest *request = [NSMutableURLRequest new];
    [request setURL:url];
    [request setHTTPMethod:@"POST"];
    [request setTimeoutInterval: 15];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];       
    NSString* authValueToken = [NSString stringWithFormat:@"Bearer %@", "ADAL Token"];
    [request setValue:authValueToken forHTTPHeaderField:@"Authorization"];

    [request setHTTPBody:postData];

    [NSURLConnection sendAsynchronousRequest:request queue:opsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
     {
         NSString* resultString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
         NSLog(@"result : %@", resultString);

Запустите приложение в первый раз, приложению необходимо войти в Azure AD или использовать другое приложение «Microsoft Authenticator» для получения токена.Успешно получить токен и получить данные из веб-API.Кроме того, приложение будет хранить токен в приложении (используя цепочку ключей).

Запустить приложение во второй раз, так как я выбираю AD_PROMPT_AUTO в функции «acquTokenWithResource».Приложение автоматически проверит, не истек ли токен (хранилище в цепочке для ключей) первым.Если не истек срок действия, он будет использовать этот токен для вызова API.Однако сервер возвращает HTML-скрипт в приложение.Этот HTML-скрипт такой же, как страница входа.

HTML-скрипт:

             Sign in to your account

<noscript>
    <meta http-equiv="Refresh" content="0; URL=https://login.microsoftonline.com/jsdisabled" />
</noscript>


    <link rel="shortcut icon" href="https://secure.aadcdn.microsoftonline-p.com/ests/2.1.8383.13/content/images/favicon_a_eupayfgghqiai7k9sol6lg2.ico" />

<meta name="robots" content="none" />
https://login.live.com/logout.srf?iframed_by=https%3a%2f%2flogin.microsoftonline.com","urlUxPreviewOptOut":"https://login.microsoftonline.com/common/uxpreview/optout","showCantAccessAccountLink":true,"fShowAsyncTileLoad":true,"urlFeatureAnnouncementBlogPost":"https://aka.ms/AA1edlw","fCollapseExcessLinks":true,"fShowLoginV2PreviewLink":true,"fEnableShowResendCode":true,"iShowResendCodeDelay":90000,"sSMSCtryPhoneData":"AF~Afghanistan~93!!!AX~Ã…land.....

1 Ответ

0 голосов
/ 20 декабря 2018

Вероятно, что API, к которому вы пытаетесь получить доступ, не идентифицирует запрос как запрос с проверкой подлинности и перенаправляет клиента для входа в Azure AD.Это поведение несколько странно, но его можно объяснить, если API также является конечной точкой, которую можно посетить в браузере.

Возможно, ваш клиент (мобильное приложение) неправильно отправляет токен доступа взапрос.В вашем коде у вас есть следующая строка:

NSString* authValueToken = [NSString stringWithFormat:@"Bearer %@", "ADAL Token"];

Если это действительно то, что вы имеете в коде своего приложения, то вам нужно обновить его, чтобы фактически использовать токен доступа (полученный из ADAL) взаголовок Authorization, а не строка «ADAL Token».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...