我正在使用Microsoft aad:adal4j来处理来自Mobile的动态crm登录.实施后我得到以下例外.
我究竟做错了什么?
错误
java.lang.NoSuchMethodError: No static method encodeBase64URLSafeString([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.boot.jar)
java.util.concurrent.ExecutionException: java.lang.NoSuchMethodError: No static method encodeBase64URLSafeString([B)Ljava/lang/String; in class Lorg/apache/commons/codec/binary/Base64; or its super classes (declaration of 'org.apache.commons.codec.binary.Base64' appears in /system/framework/org.apache.http.legacy.boot.jar)
at java.util.concurrent.FutureTask.report(FutureTask.java:94)
at java.util.concurrent.FutureTask.get(FutureTask.java:164)
at com.sampleadal.MainActivity.onCreate(MainActivity.java:33)
at android.app.Activity.performCreate(Activity.java:6237)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NoSuchMethodError: No static method encodeBase64URLSafeString([B)Ljava/lang/String; in …
Run Code Online (Sandbox Code Playgroud) 我使用 adal4j(版本 1.2.0)从后端应用程序获取访问令牌,以便能够使用 PowerBI REST API 嵌入报告(更具体地说,是GenerateToken 方法)。我已在 Azure 中注册了一个本机应用程序,并为其提供了必要的权限。我可以使用用户名/密码组合获取访问令牌,如下所示:
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);
Run Code Online (Sandbox Code Playgroud)
然后使用令牌成功对 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);
Run Code Online (Sandbox Code Playgroud)
客户端 ID 是注册的本机应用程序的应用程序 ID,客户端密钥是通过向应用程序添加密钥来定义的。我再次获得了令牌,但现在我无法再使用它对 API 进行身份验证(HTTP 403,没有任何进一步的详细信息)。
所以我的问题是,这是一个应该首先工作的有效场景,和/或者我是否只是缺少 Azure 或使用 adal4j 的技术信息?
编辑:下面是委派应用程序权限的屏幕截图。