2

我正在尝试从 Reports API 获取数据。

我获得服务帐户的访问令牌并在 GET 请求中使用它。始终响应

{
  "error": {
    "errors": [
      {
        "domain": "global",
        "reason": "authError",
        "message": "Access denied. You are not authorized to read activity records.",
        "locationType": "header",
        "location": "Authorization"
      }
    ],
    "code": 401,
    "message": "Access denied. You are not authorized to read activity records."
  }
}

我正在使用 Java 请求。没有 Google API 库(客户端要求)。源代码是

String urlString = "https://www.googleapis.com/admin/reports/v1/activity/users/all/applications/drive?maxResults=25";

        URL url = new URL(urlString);
        HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();

        // optional default is GET
        urlConnection.setRequestMethod("GET");
        urlConnection.setDoInput(true);

        // Add request header.
        urlConnection.setRequestProperty("Authorization", "Bearer " + accessToken.getValue());

        int responseCode = urlConnection.getResponseCode();

        System.out.println("\nSending 'GET' request to URL : " + urlString);
        System.out.println("Response Code : " + responseCode);

        BufferedReader bufferedReader;

        if (responseCode == 200) {
            bufferedReader = new BufferedReader(
                    new InputStreamReader(urlConnection.getInputStream()));
        } else {
            bufferedReader = new BufferedReader(
                    new InputStreamReader(urlConnection.getErrorStream()));
        }

        String inputLine;
        StringBuffer stringBuffer = new StringBuffer();

        while ((inputLine = bufferedReader.readLine()) != null) {
            stringBuffer.append(inputLine);
        }

        bufferedReader.close();

        System.out.println(stringBuffer.toString());

你能帮我解决我的遗漏吗?

问候,亚历克斯。

4

2 回答 2

2

"访问被拒绝。您无权阅读活动记录。",

只是意味着您被授权的用户无权执行您正在尝试执行的操作。要使用此 api 的服务帐户,您需要设置域范围的委派

在企业应用程序中,您可能希望在没有任何手动授权的情况下以编程方式访问用户的数据。在 G Suite 域中,域管理员可以授予第三方应用程序对其用户数据的域范围访问权限——这称为域范围授权。要以这种方式委派权限,域管理员可以使用具有 OAuth 2.0 的服务帐户。

  1. 转到您 G Suite 域的管理控制台。
  2. 从控件列表中选择安全性。如果您没有看到列出的安全性,请从页面底部的灰色栏中选择更多控件,然后从控件列表中选择安全性。
  3. 从选项列表中选择高级设置。
  4. 在身份验证部分中选择管理第三方 OAuth 客户端访问。
  5. 在客户端名称字段中输入服务帐户的客户端 ID。
  6. 在一个或多个 API 范围字段中,输入应授予您的应用程序访问权限的范围列表(见下图)。例如,如果您需要在域范围内访问活动报告,请输入:https ://www.googleapis.com/auth/admin.reports.audit.readonly
  7. 单击授权按钮。
于 2018-08-28T11:45:40.753 回答
0

只是下面的代码。这里有两件事非常重要:电子邮件 ID 即 SERVICE_ACCOUNT_EMAIL 和 json 文件 SERVICE_ACCOUNT_PKCS12_FILE_PATH:

来源:https ://developers.google.com/admin-sdk/reports/v1/guides/delegation

我正在使用它的 GO 版本,花了 2 天后它就像一个魅力:)) (顺便说一下,GO 版本可以在这里找到:https ://developers.google.com/admin-sdk/directory /v1/guides/delegation#go )

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.admin.reports.Reports;
import com.google.api.services.admin.reports.ReportsScopes;
...

/** Email of the Service Account */
private static final String SERVICE_ACCOUNT_EMAIL = "<some-id>@developer.gserviceaccount.com";

/** Path to the Service Account's Private Key file */
private static final String SERVICE_ACCOUNT_PKCS12_FILE_PATH = "/path/to/<public_key_fingerprint>-privatekey.p12";

/**
 * Build and returns a Reports service object authorized with the service accounts
 * that act on behalf of the given user.
 *
 * @param userEmail The email of the user. Needs permissions to access the Admin APIs.
 * @return Reports service object that is ready to make requests.
 */
public static Reports getReportsService(String userEmail) throws GeneralSecurityException,
    IOException, URISyntaxException {
  HttpTransport httpTransport = new NetHttpTransport();
  JacksonFactory jsonFactory = new JacksonFactory();
  GoogleCredential credential = new GoogleCredential.Builder()
      .setTransport(httpTransport)
      .setJsonFactory(jsonFactory)
      .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
      .setServiceAccountScopes(ReportsScopes.ADMIN_REPORTS_AUDIT_READONLY)
      .setServiceAccountUser(userEmail)
      .setServiceAccountPrivateKeyFromP12File(
          new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
      .build();
  Reports service = new Reports.Builder(httpTransport, jsonFactory, null)
      .setHttpRequestInitializer(credential).build();
  return service;
}
于 2021-07-02T20:55:37.357 回答