GoogleCredential.getApplicationDefault()不返回GCE实例凭据

时间:2017-03-18 15:19:46

标签: java google-cloud-platform google-compute-engine

我在GCE上运行Java应用程序。我正在尝试从此实例中获取Google Cloud凭据以在我的应用程序中使用。在GCE上运行时,即使我使用的是应用程序默认凭据,返回的凭据也不是实例凭据。这是我的完整代码:

package test;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.util.Utils;
import com.google.api.client.http.HttpTransport;

import java.util.Arrays;

public class Test {
    public static void main(String[] args) throws Exception {
        HttpTransport transport = Utils.getDefaultTransport();
        GoogleCredential credential = GoogleCredential.getApplicationDefault(transport, Utils.getDefaultJsonFactory());
        credential = credential.createScoped(Arrays.asList("https://www.googleapis.com/auth/userinfo.email"));
        System.out.println(credential.getServiceAccountId());
    }
}

我的gradle文件:

repositories {
    mavenCentral()
}

apply plugin: 'java'
apply plugin: 'application'

sourceCompatibility = '1.8'
targetCompatibility = '1.8'

project.mainClassName = 'test.Test'

dependencies {
    compile group: 'com.google.api-client', name: 'google-api-client', version: '1.22.0'
}

我已使用:assembleDist gradle目标将其构建到分发中。我已将汇编的分发复制到GCE实例。 gcloud auth list的结果是:

Credentialed Accounts:
 - ##########-compute@developer.gserviceaccount.com ACTIVE
To set the active account, run:
    $ gcloud config set account `ACCOUNT`

当我运行我的代码时,输​​出是:

java -jar test-1.0-all.jar 
null

1 个答案:

答案 0 :(得分:0)

问题在于" userinfo.email"机器上没有范围。选择"允许完全访问Cloud API时,此范围将永远不存在。在实例创建期间。看起来像谷歌的一个错误。