我正在使用后端应用程序中的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?
编辑:下面是委派的应用程序权限的屏幕截图。
你检查了你得到的令牌吗?您可以使用像jwt.io这样的网站来检查其内容。但是除非它与之前一起使用它发生了变化,否则PBI REST API只允许委托调用。这意味着你必须在用户的上下文中运行它们。 – juunas
@juunas感谢您的提示。我已经检查过验证结果中的令牌类型和过期时间,并且jwt.io显示这两个令牌都是有效的。用户名/密码组合生成的信息在有效载荷中具有更多信息,具体涉及用户帐户。这可能会支持您只允许委托呼叫的声明。将不得不尝试得到这个报价,但如果这是真的,我想这个选项是创建一个专门的帐户与一个永不过期的密码,这有点令人失望。 –
如果仅应用程序认证导致为应用程序提供某些角色(也称为应用程序权限),则令牌应该包含角色。在委托调用中,令牌中有“范围”(scp声明)。 – juunas