2017-04-06 142 views
0

此处我试图从Data Lake Store中的数据资产注册到Azure数据目录中。 我试图获得Azure的数据目录,我会随后在头设置如下使用Java对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:应用程序命名为https://abc.onmicrosoft.com/somecode/login/aad不是在发现名为tenant_id的租户。
如果应用程序尚未由租户的管理员安装或由租户中的任何用户同意,则可能会发生这种情况。
您可能已将验证请求发送给错误的承租人。

跟踪ID:SOME_ID

相关ID:SOME_ID

时间戳:2017年4月6日09:57:01Z”, “错误”: “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();} 

请帮我解释一下如何解决这个问题。

谢谢。

回答

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

+0

谢谢!但是,我尝试过,但仍然是服务器响应未经授权的请求。我已经添加了关于这个问题的更多细节 –

0

这里是你应该使用什么:

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

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

相关问题