2017-07-26 66 views
1

我想设置一个原生的Java应用程序,它将在使用ADAL4j进行身份验证后,利用MS Graph的API访问用户OneDrive。我正在使用this库来获取我的访问令牌。到目前为止,我有这样的代码:Microsoft Graph API访问令牌验证失败(java)

import java.io.BufferedReader; 
import java.io.InputStreamReader; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

import javax.naming.ServiceUnavailableException; 

import com.microsoft.aad.adal4j.AuthenticationContext; 
import com.microsoft.aad.adal4j.AuthenticationResult; 

public class Get { 

    private final static String AUTHORITY = "https://login.windows.net/common/oauth2/v2.0/authorize"; 
    private final static String CLIENT_ID = "29275...011a"; 
    private final static String RESOURCE = "https://graph.windows.net"; 


    public static void main(String[] args) throws Exception { 

     try (BufferedReader br = new BufferedReader(new InputStreamReader(
      System.in))) { 
      System.out.print("Enter username: "); 
      String username = br.readLine(); 
      System.out.print("Enter password: "); 
      String password = br.readLine(); 

      AuthenticationResult result = getAccessTokenFromUserCredentials(
       username, password); 
      System.out.println("Access Token - " + result.getAccessToken()); 
      System.out.println("Refresh Token - " + result.getRefreshToken()); 
      System.out.println("ID Token - " + result.getIdToken()); 
      System.out.println("Expires in - " + result.getExpiresAfter()); 
     } 
    } 

    private static AuthenticationResult getAccessTokenFromUserCredentials(
     String username, String password) throws Exception { 
     AuthenticationContext context = null; 
     AuthenticationResult result = null; 
     ExecutorService service = null; 
     try { 
      service = Executors.newFixedThreadPool(1); 
      context = new AuthenticationContext(AUTHORITY, false, service); 
      Future<AuthenticationResult> future = context.acquireToken(RESOURCE, CLIENT_ID, username, password, null); 
      result = future.get(); 
     } finally { 
      service.shutdown(); 
     } 

     if (result == null) { 
      throw new ServiceUnavailableException(
       "authentication result was null"); 
     } 
     return result; 
    } 

} 

当我运行它,我进入帐户凭据,然后访问令牌,令牌刷新,ID令牌,并在时间结束都打印出来。然后我使用chromes“Advanced Rest Client”插件来测试auth令牌(下面的截图)。

screenshot

然后我得到的截图下方所示的访问令牌验证错误。我不明白令牌不起作用的原因。我在Azure AD中注册的应用上设置了权限,并且该用户已授予该应用的权限。我能想到的唯一的事情是,可能范围没有指定,但我不确定这是问题。如果是我如何指定它们?

+0

嗨,我试图开发使用图形API在Java中OneDrive支持的应用程序。你有没有找到一个SDK来做到这一点? – cyberjoac

+0

有一个用于认证的部分(通过天蓝色完成)称为adal4j,源代码[here](https://github.com/AzureAD/azure-activedirectory-library-for-java)。至于与OneDrive图形进行交互,目前还没有。我最终使用内置的java.net库来调用http来调用图。 –

回答

相关问题