У меня есть многопоточное многопоточное приложение на основе Java, которое должно вызывать конечные точки на основе REST, работающие в облаке Microsoft, с токеном авторизации в заголовке, полученном с помощью «Azure ADAL AcquireToken». Я использую «AzureAD/azure-activedirectory-library-for-java» (пример кода ниже). Вопросы у меня есть -Как управлять извлечением токена ADAL в многопользовательском приложении
- мне нужно сделать вызов для получения маркеров с помощью acquireToken метода для все и каждого REST вызова я собираюсь сделать ли? Если да, то Я верю, что токен, который я собираюсь получить с последним вызовом, может измениться, , тогда в этом случае будут запросы, если у меня уже есть запросы с ранее извлеченными жетонами, которые будут сбой или Azure ADAL будет , все еще собирается почитать все ранее созданные токены?
- Если маркер извлекаемый ранее не ожидается, будет честен 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());
}
}
}
Спасибо, Питер! Означает ли это, что мы (потребитель токена) должны поддерживать первый токен, а затем обновлять логику токенов? – akg
@akg Да. Нам нужно поддерживать токен. Когда токен был недействительным, нам нужно запросить новый. –