无需GUI身份验证即可从power BI获取accessToken

时间:2015-11-25 17:21:52

标签: java azure powerbi

我按照电源BI网络应用验证文档中提供的说明操作,并且能够获取身份验证令牌。但该过程要求用户在GUI中输入凭证以获取身份验证代码。

相反,我想做静默认证,即没有GUI认证。我尝试了几种方法,比如在下面的链接中使用HHTPClient和参考代码

https://gist.github.com/dquig/a4f2f02fe3e306cebe2e

但它要求client_secret,遗憾的是没有方法接受cleint_secret以及resourceuri,clientId,用户名,密码,回调。 am使用1.0.0版本的azure adal4j。这是版本问题吗?任何帮助都将大大贬值

3 个答案:

答案 0 :(得分:0)

我想你想看一下这篇博文:http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to-authenticate-users-via-usernamepassword/

ADAL .NET客户端库API现在具有接受用户名和密码的方法。该文章包括所有约束和限制的列表。如果您的使用不在快乐的道路上,我认为您需要提示用户。

我应该提一下,如果你为用户存储刷新令牌,你应该每90天(或刷新令牌到期时)提示一次。

答案 1 :(得分:0)

由于使用客户端应用程序获取Azure AD访问令牌,因此必须在GUI身份验证上输入用户名和密码。如果按照Web应用程序身份验证(https://msdn.microsoft.com/en-us/library/mt143610.aspx)进行身份验证,则符合client_secret要求。

所以我使用端点https://login.microsoftonline.com/<tenantId>/oauth2/token从Power BI获取访问令牌,并用Java创建了一个控制台应用程序示例。

以下是pom.xml文件中的maven依赖项配置。 使用1.0.0版本的Azure adal4j很好,但建议更新最新版本。

<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>

示例代码如下。

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);
}

如有任何疑虑,请随时告诉我。

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;
}

请参阅AuthenticationContext.AcquireToken https://msdn.microsoft.com/en-us/library/dn479466.aspx的参考资料。

答案 2 :(得分:0)

如果您将应用注册为本机客户端应用,则需要提供客户端密钥。然后,您就可以使用用户名和密码流而无需通过交互式登录。