2017-06-21 53 views
3

我正在使用后端应用程序中的adal4j(版本1.2.0)来获取访问令牌,以便能够使用PowerBI REST API嵌入报表(更具体地说,GenerateToken方法)。我已经在Azure中注册了一个本地应用程序,并为其提供了必要的权限。我可以使用用户名/密码组合如下获得访问令牌:使用客户端凭证从Azure AD获取访问令牌以进行本地应用程序注册(PowerBI)

AuthenticationContext ac = new AuthenticationContext("https://login.windows.net/TENANT_ID/oauth2/authorize", false, es); 
Future<AuthenticationResult> f = ac.acquireToken("https://analysis.windows.net/powerbi/api", CLIENT_ID, USERNAME, PASSWORD, null); 

然后使用令牌认证成功的API,以及最终显示嵌入式报表。但是,我的情况,我想当然使用客户端凭据(客户端ID,客户端密码)而不是用户帐户。

AuthenticationContext("https://login.windows.net/TENANT_ID/oauth2/authorize", false, es); 
ClientCredential cc = new ClientCredential(CLIENT_ID, CLIENT_SECRET); 
Future<AuthenticationResult> f = ac.acquireToken("https://analysis.windows.net/powerbi/api", cc,null); 

客户端ID是注册的本地应用程序的应用程序ID和客户端密钥是通过将关键应用程序定义的:我可以按如下再次获得令牌。 同样,我得到令牌,但现在我无法使用它对API进行认证(HTTP 403,没有任何进一步的细节)。

所以我的问题是,这是一个有效的方案,应该在第一时间工作,和/或我只是错过了一条技术信息在Azure或使用adal4j?

编辑:下面是委派的应用程序权限的屏幕截图。

enter image description here

+0

你检查了你得到的令牌吗?您可以使用像jwt.io这样的网站来检查其内容。但是除非它与之前一起使用它发生了变化,否则PBI REST API只允许委托调用。这意味着你必须在用户的上下文中运行它们。 – juunas

+0

@juunas感谢您的提示。我已经检查过验证结果中的令牌类型和过期时间,并且jwt.io显示这两个令牌都是有效的。用户名/密码组合生成的信息在有效载荷中具有更多信息,具体涉及用户帐户。这可能会支持您只允许委托呼叫的声明。将不得不尝试得到这个报价,但如果这是真的,我想这个选项是创建一个专门的帐户与一个永不过期的密码,这有点令人失望。 –

+0

如果仅应用程序认证导致为应用程序提供某些角色(也称为应用程序权限),则令牌应该包含角色。在委托调用中,令牌中有“范围”(scp声明)。 – juunas

回答

3

据我所知,电力BI REST API仅支持委派的权限,但不支持任何应用程序的权限。您将在Azure门户中找不到应用程序许可。因此,如果没有用户身份,Power BI REST API不允许客户端凭证流。相关线程herehere供您参考。

如果要从服务连接到Power BI REST API,可以使用Resource Owner Password Credentials Grant flow

+0

是的,密码授权是唯一允许无人值守的呼叫。但OP必须确保密码不会过期,并且没有MFA等。 – juunas

+0

好的,谢谢,我认为我关于有效方案的原始问题已得到解答。 –

+0

是的,正如@juunas所说的,资源所有者流程有一些限制,你可以参考[本博客](http://www.cloudidentity.com/blog/2014/07/08/using-adal-net-to- authenticate-users-via-usernamepassword /)获取更多详细信息。 –

相关问题