0

在这里,我尝试在 Azure 数据目录中注册来自 Data Lake Store 的数据资产。我正在尝试获取 Azure 数据目录的身份验证令牌,然后我将在标题中设置如下

request.setRequestProperty("Authorization","Bearer "+accesstoken);

我用来获取令牌的代码

//This method sends request and gets the reponse
public static String SetRequestAndGetResponse(HttpsURLConnection request, String payload)
{ 
    String accesstoken=null;
    ExecutorService service = null;

    Future<AuthenticationResult> FutureResult;
    AuthenticationResult result;
    AuthenticationCallback callback = null;

    //Creating the credential object for DataCatalog with Client ID and Client secret picked up from the vault

    ClientCredential credential = new ClientCredential("client_ID", "client_secret");

    try
    {
        service = Executors.newFixedThreadPool(1);
        AuthenticationContext context = new AuthenticationContext("https://login.windows.net/tenant_ID/oauth2/token",true,service);

        /* 
         * getting the authentication result object using the App ID URI from Azure AD as suggested in
         * 
         * https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-code
         */

        FutureResult = context.acquireToken("App ID URI from Azure AD/login/aad", credential,null);
        while(!(FutureResult.isDone()))
        {}
        accesstoken=FutureResult.get().getAccessToken();
        //System.out.println("result "+accesstoken);
    }
    catch(Exception e)
    {System.out.println("ex "+e.getMessage());
    e.printStackTrace();}

但是,我得到了如下所示的异常

ex com.microsoft.aad.adal4j.AuthenticationException:
{"error_description":"AADSTS50001: 在名为 tenant_id 的租户中找不到名为 https://abc.onmicrosoft.com/somecode/login/aad 的应用程序。
如果发生这种情况该应用程序尚未由租户的管理员安装或未经租户中的任何用户同意。
您可能将身份验证请求发送给了错误的租户。

跟踪 ID:some_id

相关 ID:some_id

时间戳:2017-04-06 09:57:01Z","error":"invalid_resource"}

在 com.microsoft.aad.adal4j.AdalTokenRequest.executeOAuthRequestAndProcessResponse(AdalTokenRequest.java:107)

在 com.microsoft.aad.adal4j.AuthenticationContext.acquireTokenCommon(AuthenticationContext.java:816)

在 com.microsoft.aad.adal4j.AuthenticationContext.access$100(AuthenticationContext.java:64)

在 com.microsoft.aad.adal4j.AuthenticationContext$1.call(AuthenticationContext.java:172)

在 com.microsoft.aad.adal4j.AuthenticationContext$1.call(AuthenticationContext.java:161)

在 java.util.concurrent.FutureTask.run(FutureTask.java:266)

在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

在 java.lang.Thread.run(Thread.java:745)

***************** 编辑 ******************* 谢谢!但是,我尝试使用“ https://graph.windows.net ”作为资源 URI 以使用身份验证上下文获取令牌,但服务器仍以未经授权的请求响应。顺便说一句,我使用下面的代码片段来创建一个请求对象。

String fullUri = String.format("https://api.azuredatacatalog.com/catalogs/"+catalogName+"/views/tables?api-version=2016-03-30");
    URL url = null;
    try {
        //sETTING UP url connection to azure data catalog api 
        url = new URL(fullUri);
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        System.out.println("Malformed URL Exception");
    }
    HttpsURLConnection request;
    try {
        request = (HttpsURLConnection) url.openConnection();
        }
        catch(Exception e){ e.printStackTrace();}

请帮助我解决这个问题。

谢谢。

4

2 回答 2

0

这是您应该使用的:

string authorityUri = "https://login.windows.net/common/oauth2/authorize";
AuthenticationContext authContext = new AuthenticationContext(authorityUri);

此外,传递给AcquireToken方法的资源字符串应该是“ https://api.azuredatacatalog.com ”。

于 2017-04-21T21:46:44.750 回答
0

方法的第一个参数AuthenticationContext.acquireToken应该是图形资源,而不是 Azure AD 中的 App ID URI。

请更改以下代码行:

FutureResult = context.acquireToken("https://graph.windows.net", credential, null);

有关详细信息,请参阅:https ://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-devquickstarts-webapp-java

于 2017-04-07T06:39:17.500 回答