2016-08-08 5 views
0

Google Admin SDK APIにアクセスして、ドメイン内のユーザーの抽出を試みています。しかし私は401の許可されていない例外が与えられています。以下のコードは、APIを呼び出すための私のメソッドを含む私の設定クラスです。TokenResponseException:401 Admin SDK Google APIにアクセスしようとしたときに不正な例外が発生しました。

package com.brookfieldres.operations; 

    import java.io.File; 
    import java.io.IOException; 
    import java.security.GeneralSecurityException; 
    import java.util.ArrayList; 
    import java.util.ResourceBundle; 

    import org.apache.log4j.Logger; 

    import com.brookfieldres.common.Constants; 
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; 
    import com.google.api.client.googleapis.auth.oauth2.GoogleCredential.Builder; 
    import com.google.api.services.admin.directory.Directory; 
    import com.google.api.services.admin.directory.DirectoryScopes; 

    public class GCAuthentication { 

     private static final Logger _Log =  Logger.getLogger(GCAuthentication.class.getName()); 

    static ResourceBundle resources = ResourceBundle.getBundle("Resources"); 

// public static String serviceAcc = resources.getString("SERVICE_ACC_EMAIL"); 
// public static String privKeyPath = resources.getString("PRIVATE_KEY_PATH"); 
// public static String userEmail = resources.getString("ADMIN_ACC"); 



    public static Directory getDirectoryService(String serviceAcc, String privKeyPath, String userEmail) throws IOException, GeneralSecurityException, NullPointerException { 

    // final ArrayList<String> dirScopes = new ArrayList<String>(); 
    //  dirScopes.add(DirectoryScopes.ADMIN_DIRECTORY_USER); 


     Constants.dirScopes = new ArrayList<String>(); 
     Constants.dirScopes.add(DirectoryScopes.ADMIN_DIRECTORY_USER); 
     Constants.dirScopes.add(DirectoryScopes.ADMIN_DIRECTORY_CUSTOMER); 
     Constants.dirScopes.add(DirectoryScopes.ADMIN_DIRECTORY_ORGUNIT); 

     GoogleCredential gCreds = new GoogleCredential.Builder() 
     .setJsonFactory(Constants.JSON_FACTORY) 
     .setTransport(Constants.HTTP_TRANSPORT) 
     .setServiceAccountId(serviceAcc) 
     .setServiceAccountUser(userEmail) 
     .setServiceAccountPrivateKeyFromP12File(new File(privKeyPath)) 
     .setServiceAccountScopes(Constants.dirScopes) 
     .build(); 

     Directory directory = new Directory.Builder(Constants.HTTP_TRANSPORT, Constants.JSON_FACTORY, gCreds).setApplicationName(Constants.APPLICATION_NAME).build(); 

     return directory; 

    } 


} 

以下のコードは、私は自分のドメインからユーザーを引っ張って使用しています私のテストケースである:

package com.brookfieldres.library.test; 

import org.junit.Before; 
import org.junit.Test; 

import static org.junit.Assert.assertFalse; 

import java.io.IOException; 
import java.security.GeneralSecurityException; 
import org.junit.After; 

import com.brookfieldres.operations.GCAuthentication; 
import com.google.api.client.repackaged.com.google.common.base.Strings; 
import com.google.api.services.admin.directory.Directory; 
import com.google.api.services.admin.directory.model.Customer; 
import com.google.api.services.admin.directory.model.User; 

public class ExtractionTest { 

@Before 
    public void setUp(){} 

@Test 
    public void getEmails() throws IOException, NullPointerException, GeneralSecurityException{ 

     try { 

      Directory directory = GCAuthentication.getDirectoryService("XXXXXXX", "XXXXXXXX", "XXXXXXX"); 
      System.out.println("The connection to Google is established"); 
      User user1 = directory.users().get("[email protected]").execute(); 
      System.out.println("User is pulled."); 

    //  assertFalse(user1 == null); 

    //  if(user1 != null){ 
    //   System.out.println("Name= " + user1.getName()); 
    //  } 

     }catch(NullPointerException e) { 
      e.printStackTrace(); 
     }catch (IOException e){ 
      e.printStackTrace(); 
     }catch (GeneralSecurityException e) { 
      e.printStackTrace(); 
     } 


    } 

@After 
    public void tearDown(){ } 

} 

と最後にここで私が直面していた例外です。

The connection to Google is established 
com.google.api.client.auth.oauth2.TokenResponseException: 401 Unauthorized 
    at com.google.api.client.auth.oauth2.TokenResponseException.from(TokenResponseException.java:105) 
    at com.google.api.client.auth.oauth2.TokenRequest.executeUnparsed(TokenRequest.java:287) 
    at com.google.api.client.auth.oauth2.TokenRequest.execute(TokenRequest.java:307) 
    at com.google.api.client.googleapis.auth.oauth2.GoogleCredential.executeRefreshToken(GoogleCredential.java:384) 
    at com.google.api.client.auth.oauth2.Credential.refreshToken(Credential.java:489) 
    at com.google.api.client.auth.oauth2.Credential.intercept(Credential.java:217) 
    at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:868) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:419) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352) 
    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469) 
    at com.brookfieldres.library.test.ExtractionTest.getEmails(ExtractionTest.java:36) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

喜んで歓迎されます!このthreadから基づい

答えて

2

TokenResponseException:401権限は、無効なクライアントIDを持つ、クライアントの秘密やスコープを発生します。しかし、リフレッシュ・トークンの過度使用によるものでもあります。限定された寿命を有するので、必要であれば、Refresh the access token。アプリケーションが単一のアクセストークンの存続期間を超えてGoogle APIにアクセスする必要がある場合は、リフレッシュトークンを取得できます。リフレッシュ・トークンにより、アプリケーションは新しいアクセス・トークンを取得できます。

は、これらの関連スレッドをチェックしてください:

この情報がお役に立てば幸い!

関連する問題