首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的Power身份验证过程和with请求有什么问题?

我的Power身份验证过程和with请求有什么问题?
EN

Stack Overflow用户
提问于 2015-07-06 15:47:43
回答 2查看 1.8K关注 0票数 1

最终编辑:答案已经找到。这是一个依赖问题。请阅读下面的答案。

我正在开发一个程序,它最终应该将数据从SQL server db实时推送到我们的power BI报告中。目前,我正处于一个尝试从我的客户端应用程序连接到我的power BI的阶段。

对于身份验证过程,我遵循了代码的示例:https://gist.github.com/dquig/a4f2f02fe3e306cebe2e,身份验证似乎运行良好。我得到了一份资料(每次都是一样的,我还没有找到是否应该是这样的)。编辑:我还检查了OAuth2、powerBI API的所有msdn页面(包括步骤)。

编辑:我刚刚注意到,如果我填入完全的胡说八道的话,我甚至会得到一本书(为什么我以前没有试过.)。每次我得到的都是一样的象征。for请求的响应具有200状态,但为null实体。

下面是我的身份验证代码(这里省略了请求):

代码语言:javascript
复制
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import com.microsoft.aad.adal4j.AuthenticationContext;

public class PowerBIController {

private static final String POWER_BI_BASE_URL = "https://api.powerbi.com";
private static final String AUTH_URI = "https://login.windows.net/common/oauth2/authorize";
private static final String RESOURCE_URI = "https://analysis.windows.net/powerbi/api";
private static final boolean VALIDATE_AUTHORITY = false;

private static final String NATIVE_CLIENT_ID = "4b2f0d69-c17d-4d61-b2c0-4aeee5dfffe8";
private static final String USER_AT_TENANT = "powerBIUser@pveermanvicrea.onmicrosoft.com";
private static final String PASSWORD = "****";

private AuthenticationContext context = null;
private Client client;
private ExecutorService service = null;
private Response response;

public PowerBIController() throws Exception {
    client = ClientBuilder.newClient();
    service = Executors.newSingleThreadExecutor();
    context = new AuthenticationContext(AUTH_URI, VALIDATE_AUTHORITY, service);
    String powerBIAccessToken = getToken(RESOURCE_URI, NATIVE_CLIENT_ID, USER_AT_TENANT, PASSWORD);
}

private String getToken(String resourceUri, String nativeClientId,
        String tenant, String password) throws ExecutionException, InterruptedException{
    return context.acquireToken(
            resourceUri,
            nativeClientId,
            tenant,
            password,
            null
    ).get().getAccessToken();
}

然后是http请求:我尝试复制粘贴整个示例(来自上面的链接),但readEntity不是一种响应方法。我在这个Read response body in JAX-RS client from a post request上找到了下面的文章。但是我使用的是javax.ws.rs的2.0版本。所以,我有点困惑。

代码语言:javascript
复制
public PowerBIController() throws Exception {
    client = ClientBuilder.newClient();
    service = Executors.newSingleThreadExecutor();
    context = new AuthenticationContext(AUTH_URI, VALIDATE_AUTHORITY, service);
    String powerBIAccessToken = getToken(RESOURCE_URI, NATIVE_CLIENT_ID, USER_AT_TENANT, PASSWORD);    
    post(biTarget, powerBIAccessToken);
}
private void post(WebTarget biTarget, String powerBIAccessToken) throws URISyntaxException, IOException, ExecutionException, InterruptedException {
    Response response = target
    Invocation.Builder builder = biTarget.request(MediaType.APPLICATION_JSON);
    Invocation.Builder header = builder.header("Authorization",
                                               "Bearer " +    powerBIAccessToken);
    response = header.get();
    System.out.println("header: " + header.toString());
    System.out.println("status: " + response.getStatus());
    System.out.println("body:" + response.readEntity(String.class));
}

我在http://docs.powerbi.apiary.io/查过了。在这里,我必须登录到我的Office 365帐户,然后我可以使用相同的代码来获取数据集列表。在这里,我不需要进行身份验证,这可能会产生不同的效果,但是当我作为调试运行时,我可以清楚地看到我有一个访问程序。下面是他们说可以正确调用get请求的代码。显然,这不起作用,我也很确定目标有排字:

代码语言:javascript
复制
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;

Client client = ClientBuilder.newClient();
Response response = client.target("https://api.powerbi.com/beta/myorghttps://api.powerbi.com/beta/myorg/datasets{?defaultRetentionPolicy}")
  .request(MediaType.TEXT_PLAIN_TYPE)
  .header("undefined", "")
  .get();

System.out.println("status: " + response.getStatus());
System.out.println("headers: " + response.getHeaders());
System.out.println("body:" + response.readEntity(String.class));

我试着用Fiddler来看看我跑步的时候到底发生了什么。但是,Fiddler根本没有显示任何活动(即使我检查了https选项)。

最后,这里是我对这段代码的依赖关系:

代码语言:javascript
复制
<dependency>
  <groupId>javax.ws.rs</groupId>
   <artifactId>javax.ws.rs-api</artifactId>
  <version>2.0</version>
</dependency>
<dependency>
  <groupId>org.jboss.resteasy</groupId>
   <artifactId>resteasy-client</artifactId>
  <version>3.0.2.Final</version>
</dependency>
<dependency>
  <groupId>com.microsoft.azure</groupId>
   <artifactId>adal4j</artifactId>
  <version>1.0.0</version>
</dependency>

我真的很期待得到任何帮助。如果我的问题有什么问题,请说出来。我尽我最大的努力来澄清和遵守这个论坛的规则,但我可能错过了一些东西。

事先非常感谢

答:我也使用了蓝色媒体0.6.0作为我的部分程序.这包括球衣核心1.3.1.结论:尽管我认为我是从javax.ws.rs 2.0中导入的(它甚至说过,如果您看一下类型),它实际上是从Jersey1.3.1获得它的对象定义。这不仅仅是对媒体的依赖。

因此,我将发布需要排除的依赖项和必要的最终依赖项。

代码语言:javascript
复制
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-management</artifactId>
<version>0.7.0</version>
<exclusions>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
    </exclusion>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-json</artifactId>
    </exclusion>
</exclusions>
</dependency>
<dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-servicebus</artifactId>
<version>0.7.0</version>
<exclusions>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
    </exclusion>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-json</artifactId>
    </exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-serviceruntime</artifactId>
<version>0.6.0</version>
<exclusions>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
    </exclusion>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-json</artifactId>
    </exclusion>
</exclusions>
</dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-media</artifactId>
<version>0.6.0</version>
<exclusions>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-client</artifactId>
    </exclusion>
  <exclusion>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-json</artifactId>
    </exclusion>
</exclusions>
</dependency>

必要的依赖关系:

代码语言:javascript
复制
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>3.0.2.Final</version>
</dependency>
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>adal4j</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.19</version>
</dependency>
</dependencies>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-14 06:57:57

因此,问题是我使用了几个Maven依赖项,它们在层次结构中有部分重叠的依赖项。

例如,我包括了Jersey v2.1.9以及,后者使用了泽西客户端v1.13。

这个答案的要点如下:当您使用Azure和Power时,很有可能会弄乱依赖项。检查您的依赖关系层次结构,以查看哪些依赖项被多次使用。

票数 1
EN

Stack Overflow用户

发布于 2015-07-06 16:43:56

这是错误吗?

响应响应=client.target("https://api.powerbi.com/beta/myorghttps://api.powerbi.com/beta/myorg/datasets{?defaultRetentionPolicy}")

下面是一篇逐步完成的文章:https://msdn.microsoft.com/en-US/library/dn877545.aspx,对于Power身份验证,请参考“您需要什么来验证一个Power客户端应用程序”部分。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31250150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档