Spr*_*ose 5 java oauth-2.0 google-bigquery
我正在尝试使用oauth API通过Java API对Google服务帐户进行身份验证.我希望用它来访问Google Bigquery.我从API请求中返回"无效授权".
以下是代码,它是基本身份验证示例的副本(不适用于Bigquery ..而是另一个Google API):
/** Global instance of the HTTP transport. */
private static final HttpTransport HTTP_TRANSPORT = new NetHttpTransport();
/** Global instance of the JSON factory. */
private static final JsonFactory JSON_FACTORY = new JacksonFactory();
private static Bigquery bigquery;
public ServiceAccountExample() {
try {
try {
GoogleCredential credential = new GoogleCredential.Builder().setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
.setServiceAccountScopes(BigqueryScopes.BIGQUERY)
.setServiceAccountPrivateKeyFromP12File(new File("GoogleBigQuery-privatekey.p12"))
//.setRefreshListeners(refreshListeners)
//.setServiceAccountUser("email.com")
.build();
credential.refreshToken();
bigquery = new Bigquery.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential)
//.setApplicationName("GoogleBigQuery/1.0")
.build();
listDatasets(bigquery, "publicdata");
return;
} catch (IOException e) {
System.err.println(e.getMessage());
}
} catch (Throwable t) {
t.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
SERVICE_ACCOUNT_EMAIL是表格的电子邮件地址:XXXXXXX@developer.gserviceaccount.com
如果我删除了credential.refreshToken()行,它在第一次调用Bigquery时在listsDatasets中失败...否则它在credential.refreshToken()上失败并且具有相同的错误.
BigQuery不接受服务帐户身份验证吗?
我相信我已经通过API控制台正确完成了所有工作.我有:
我错过了什么吗?还有什么我需要做的吗?
谢谢..
服务帐户授权方法适用于BigQuery.你不需要打电话credential.refreshToken().确保可以从您的应用程序中读取您的私钥文件.这是一个例子:
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.bigquery.Bigquery;
import com.google.api.services.bigquery.BigqueryScopes;
import com.google.api.services.bigquery.Bigquery.Projects;
import com.google.api.services.bigquery.model.*;
import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.List;
public class BigQueryJavaServiceAccount {
public static void main(String[] args) throws IOException, InterruptedException, GeneralSecurityException {
final HttpTransport TRANSPORT = new NetHttpTransport();
final JsonFactory JSON_FACTORY = new JacksonFactory();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(TRANSPORT)
.setJsonFactory(JSON_FACTORY)
.setServiceAccountId("SOMETHING@developer.gserviceaccount.com")
.setServiceAccountScopes(BigqueryScopes.BIGQUERY)
.setServiceAccountPrivateKeyFromP12File(new File("key.p12"))
.build();
Bigquery bigquery = Bigquery.builder(TRANSPORT, JSON_FACTORY)
.setHttpRequestInitializer(credential)
.build();
Projects.List projectListRequest = bigquery.projects().list();
ProjectList projectList = projectListRequest.execute();
List<ProjectList.Projects> projects = projectList.getProjects();
System.out.println("Available projects\n----------------\n");
for (ProjectList.Projects project : projects) {
System.out.format("%s\n", project.getProjectReference().getProjectId());
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12470 次 |
| 最近记录: |