【问题标题】:Authenticate and get token for Azure Data Catalog using Java使用 Java 对 Azure 数据目录进行身份验证并获取令牌
【发布时间】:2017-04-06 10:13:59
【问题描述】:

我正在尝试从 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();}

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

例如 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 以使用身份验证上下文获取令牌,但服务器仍以未经授权的请求响应。 顺便说一下,我正在使用下面的 sn-p 来创建一个请求对象。

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();}

请帮助我解决这个问题。

谢谢。

【问题讨论】:

    标签: java azure azure-data-catalog


    【解决方案1】:

    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

    【讨论】:

    • 谢谢!但是,我试过了,但服务器仍然响应未经授权的请求。我已添加有关此问题的更多详细信息
    【解决方案2】:

    这是你应该使用的:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      相关资源
      最近更新 更多