En raison de l'utilisation de l'application Client pour obtenir le jeton d'accès Azure AD, il est nécessaire de saisir le nom d'utilisateur et le mot de passe lors de l'authentification de l'interface graphique. Si vous suivez l'authentification de l'application Web (https://msdn.microsoft.com/en-us/library/mt143610.aspx) pour effectuer l'authentification, elle répond à l'exigence client_secret
. J'ai donc utilisé le point de terminaison https://login.microsoftonline.com/<tenantId>/oauth2/token
pour obtenir un jeton d'accès de Power BI et créer un exemple d'application console en Java.
Voici ma configuration des dépendances maven ci-dessous dans le fichier pom.xml
. C'est très bien d'utiliser Azure adal4j de la version 1.0.0, mais suggère de mettre à jour la dernière version.
<dependencies>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>adal4j</artifactId>
<version>1.1.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
Et l'exemple de code ci-dessous.
String clientId = "<clientId>";
String clientSecret = "<key>";
String tenantId = "<tenantId>";
String authority =String.format("https://login.microsoftonline.com/%s/oauth2/token", tenantId);
String resource = "https://analysis.windows.net/powerbi/api";
AuthenticationContext context = null;
AuthenticationResult result = null;
ExecutorService service = null;
try {
service = Executors.newFixedThreadPool(1);
context = new AuthenticationContext(authority, false, service);
ClientCredential credential = new ClientCredential(clientId, clientSecret);
Future<AuthenticationResult> future = context.acquireToken(resource, credential, null);
result = future.get();
} finally {
service.shutdown();
}
String accessToken = null;
if (result == null) {
throw new ServiceUnavailableException("authentication result was null");
} else {
accessToken = result.getAccessToken();
System.out.println("Access Token: " + accessToken);
}
Toute préoccupation, n'hésitez pas à me le faire savoir.
Mise à jour pour C#:
public static string GetAccessToken()
{
var authenticationContext = new AuthenticationContext("{authorityURL}");
var credential = new ClientCredential(clientId: "{application id}", clientSecret: "{application password}");
var result = authenticationContext.AcquireToken(resource: "{resourceURL}", clientCredential:credential);
if (result == null) {
throw new InvalidOperationException("Failed to obtain the JWT token");
}
string token = result.AccessToken;
return token;
}
S'il vous plaît voir la référence pour AuthenticationContext.AcquireToken
https://msdn.microsoft.com/en-us/library/dn479466.aspx.
J'ai essayé cette approche mais elle demande client_silent avec tous les autres identifiants comme, ClientId, nom d'utilisateur, mot de passe. Plus d'essayer d'utiliser Java. J'ai donné le lien dans mon post original l'approche que j'ai essayée. Ce qui est exactement la même chose que ce que vous avez mentionné. – user4130072