2016-01-24 2 views
0

У меня есть многопоточное многопоточное приложение на основе Java, которое должно вызывать конечные точки на основе REST, работающие в облаке Microsoft, с токеном авторизации в заголовке, полученном с помощью «Azure ADAL AcquireToken». Я использую «AzureAD/azure-activedirectory-library-for-java» (пример кода ниже). Вопросы у меня есть -Как управлять извлечением токена ADAL в многопользовательском приложении

  1. мне нужно сделать вызов для получения маркеров с помощью acquireToken метода для все и каждого REST вызова я собираюсь сделать ли? Если да, то Я верю, что токен, который я собираюсь получить с последним вызовом, может измениться, , тогда в этом случае будут запросы, если у меня уже есть запросы с ранее извлеченными жетонами, которые будут сбой или Azure ADAL будет , все еще собирается почитать все ранее созданные токены?
  2. Если маркер извлекаемый ранее не ожидается, будет честен Azure ADAL то, какие варианты я должен управлять одиночной лексемой в то время , а затем убедившись, что в то время только один маркер используется все запросов? Нужно ли мне реализовать какой-то однопоточный кеш , чтобы получить токен, сохранить этот токен до истечения срока его действия, сделать вызов , чтобы получить новый токен, если истек, и сделать все мои многопоточные запросы пройти через этот однопоточный кеш, чтобы получить последний токен ? Любые предложения по этому поводу. Если это так, то кажется, что - это огромное узкое место в многопоточном многопоточном мульти jvm приложениях по мере масштабирования.

Мой код ниже. Когда я вызвал метод purchaseToken из цикла внутри основного метода, у меня в основном было 3 разных типа токена в 10 вызовах, и все 3 разных токена, похоже, работали, но не уверены, как это следует вызывать в многопоточных приложениях.

package com.mycompany.msft.auth; 

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

import com.microsoft.aad.adal4j.AuthenticationContext; 
import com.microsoft.aad.adal4j.AuthenticationResult; 
import com.microsoft.aad.adal4j.ClientCredential; 

public class ApplicationAuthExample { 
    private final static String AUTHORIZATION_ENDPOINT = "https://login.microsoftonline.com/"; 
    private final static String ARM_ENDPOINT = "https://myendpoint"; 


    private static String credential = "my credential"; 
    private static String clientId = "my client id"; 
    private static String tenantId = "my tenant id"; 

    private static String url = AUTHORIZATION_ENDPOINT + tenantId ; 

    AuthenticationContext context = null; 
    AuthenticationResult result = null; 
    ExecutorService service = null; 

    public AuthenticationResult getAuthToken() { 
     try { 
      service = Executors.newFixedThreadPool(1); 


      context = new AuthenticationContext(url, false, service); 

      Future<AuthenticationResult> future = null; 


       ClientCredential cred = new ClientCredential(clientId, credential); 
       future = context.acquireToken(ARM_ENDPOINT, cred, null); 


      result = future.get(); 
     } catch (Exception ex) { 
      System.out.println("Exception occurred:"); 
      ex.printStackTrace(); 
      System.exit(1); 
     } finally { 
      service.shutdown(); 
     } 
     return result; 
    } 

    public static void main(String[] args) throws Exception { 

     ApplicationAuthExample auth = new ApplicationAuthExample(); 

     for (int i =0 ; i< 10 ; i++) { 
      AuthenticationResult result = auth.getAuthToken(); 
      // use adal to Authenticate 

      System.out.println (i+ " Authorization" + "Bearer " + result.getAccessToken()); 
      System.out.println (i + " getExpiresOn" + result.getExpiresOn()); 

      //This token comes different in different calls. Which one should I use and which one not. 
      System.out.println (i+ " getExpiresOn" + result.getRefreshToken()); 


      System.out.println (i+" getExpiresOn" + result.getUserInfo()); 
      } 

    } 
} 

ответ

0

По моему опыту, я думаю, что ключом к проблеме является время окончания токена. Вы можете использовать токен по своему желанию после его истечения. Вы можете обратиться к разделу от https://azure.microsoft.com/en-us/documentation/articles/active-directory-v2-tokens/, чтобы знать, что заявка на токен включает время Issued At, Expriation Time & `Не раньше.

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

Срок службы маркера безопасности по умолчанию для развертывания аутентификации на основе утверждений с использованием AD FS 2.0 составляет 60 минут.

Если вы хотите увеличить лексемы времени истечения Лазурного AD, вы можете попробовать обратиться к документу https://technet.microsoft.com/en-us/library/gg188586.aspx для настройки маркеров жизни проверяющей стороны.

+0

Спасибо, Питер! Означает ли это, что мы (потребитель токена) должны поддерживать первый токен, а затем обновлять логику токенов? – akg

+0

@akg Да. Нам нужно поддерживать токен. Когда токен был недействительным, нам нужно запросить новый. –

 Смежные вопросы

  • Нет связанных вопросов^_^