Google Admin sdk 目录 403

2023-12-14

我正在尝试将 googleapi 2.0 与服务帐户一起使用,以在企业域上的用户上使用 Directory gooogle admin sdk。 我已按照建议进行操作(this例如)并准备了一个“希望工作”的poc java代码。

像这样的东西...

package com.mc3info.google.api20.test;

import java.io.File;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
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.jackson2.JacksonFactory;
import com.google.api.services.admin.directory.Directory;
import com.google.api.services.admin.directory.Directory.Members;
import com.google.api.services.admin.directory.Directory.Users.Get;
import com.google.api.services.admin.directory.DirectoryScopes;
import com.google.api.services.admin.directory.Directory.Groups;
import com.google.api.services.admin.directory.Directory.Users;
import com.google.api.services.admin.directory.model.User;

public class TestUsersList {


    public static void main(String[] args) {

        try {
          File f = new File("config/xxxxxxx-privatekey.p12");
          System.out.println(f.getAbsolutePath());
          ArrayList<String> scopes = new ArrayList<String>();
//          scopes.add(DirectoryScopes.ADMIN_DIRECTORY_GROUP);
//          scopes.add(DirectoryScopes.ADMIN_DIRECTORY_GROUP_READONLY );
//          scopes.add(DirectoryScopes.ADMIN_DIRECTORY_GROUP_MEMBER);
//          scopes.add(DirectoryScopes.ADMIN_DIRECTORY_GROUP_MEMBER_READONLY);
          scopes.add(DirectoryScopes.ADMIN_DIRECTORY_USER );
          scopes.add(DirectoryScopes.ADMIN_DIRECTORY_USER_READONLY );
//          scopes.add(DirectoryScopes.ADMIN_DIRECTORY_USER_SECURITY);
            HttpTransport myHttpTransport = new NetHttpTransport();
            JsonFactory JSON_FACTORY = new JacksonFactory();
          GoogleCredential credential = (new GoogleCredential.Builder()
            .setTransport(myHttpTransport )
            .setJsonFactory(JSON_FACTORY)
              .setServiceAccountId("[email protected]")
            .setJsonFactory(JSON_FACTORY)
            .setServiceAccountPrivateKeyFromP12File(f )
            .setServiceAccountScopes(scopes)
            ).build();

            credential.refreshToken();
//          String at = credential.getAccessToken();
            String applicationName = "NYAPPLICATIONNAME"; 


            Directory dir = new Directory.Builder(myHttpTransport, JSON_FACTORY, credential)
                .setApplicationName(applicationName )
                .setHttpRequestInitializer(credential)
                .build();
            com.google.api.services.admin.directory.Directory.Users.List ures = dir.users().list();
            ures.setDomain("genericidoc.it");
            ures.setOrderBy("email");

//            ures.setSortOrder("ASCENDING");
//            ures.setFields("users(agreedToTerms,changePasswordAtNextLogin,creationTime,customerId,deletionTime,etag,hashFunction,id,includeInGlobalAddressList,ipWhitelisted,isAdmin,isDelegatedAdmin,isMailboxSetup,kind,lastLoginTime,name,orgUnitPath,password,primaryEmail,suspended,suspensionReason,thumbnailPhotoUrl");

            com.google.api.services.admin.directory.model.Users lures = ures.execute();
            //HERE print all data 
//            for (){
//              System.out.println("Utente : ");
//            }
//            
            Groups grp = dir.groups();

            com.google.api.services.admin.directory.model.Groups res = grp.list().execute();



//            Directory.Members.List members  = dir.members().list("someexisting email");

            /*
             * Values for getting GoogleCredential, found in the
             * "Service account section" at:
             * https://code.google.com/apis/console/#access
             */
            // serviceAccountId from the "Email address" field.


            // Name of group to get for testing the authentication

        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

但出现 403 错误:

并且...是的,不应要求刷新 Token() 调用,但它确保我至少握手没问题...

403 Forbidden
{
 "code" : 403,
 "errors" : [ {
 "domain" : "global",
 "message" : "Not Authorized to access this resource/api",
 "reason" : "forbidden"
 } ],
 "message" : "Not Authorized to access this resource/api"
}

看看谷歌的文档将服务帐户与 Admin SDK 结合使用以进行域范围的委派.

  • 你没有提到,但你绝对需要授予服务帐户的客户端 ID 对 Admin SDK 范围的访问权限从您的 Google Apps 控制面板。

  • 您的代码缺少一行,例如.setServiceAccountUser(userEmail)它允许服务帐户模拟您的 Google Apps 域中有权搜索目录的用户(可能是超级管理员用户)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google Admin sdk 目录 403 的相关文章

随机推荐

  • 代码在迭代 86 时崩溃

    static void Job47 Args args str path stx TreeNodeIterator iter TreeNode treeNode treeNodeToRelease Map dictMenuDisplay F
  • 循环用户输入,直到用户输入有效的输入

    我学到了一点生锈的知识 通常在我的代码中我喜欢实现一个循环用户输入直到正确的函数 但在这种情况下它不起作用 我不知道为什么 我尝试过一种名为is ok 但这总是返回 false 代码如下 use std io macro rules inp
  • 没有开发者帐户 oAuth 的发布者 API

    我有些疑惑 我就这样坚持了一个星期 我正在开发一个应用程序来获取游戏商店的所有评论 它适用于在 Play 商店拥有帐户的所有最终用户 https developers google com android publisher getting
  • Visual Studio 2019 C++ - 概念标识符未定义

    我尝试在我的 cpp 项目中使用概念 该项目是使用 Visual Studio 2019 版本 16 4 1 编写的 但我收到错误消息 标识符 conecpt 未定义 据我所知 自版本 16 3 以来 Visual Studio 2019
  • Doctrine Regular 与 Fetch 连接

    从理论上讲 常规连接和获取连接有什么区别 我不明白仅仅通过阅读docs regular query em gt createQuery SELECT u FROM User u JOIN u address a WHERE a city B
  • 如何在 Angular 4 中使用多个 Http 请求

    我正在使用 Angular 4 和一个 API 制作一个简单的应用程序 该应用程序有几个页面可以满足他们的请求 例如 我使用此 url 获取前 10 个字符 http swapi co api people 为了获得接下来的 10 个人 我
  • 在使用独立应用程序之前,是否必须在系统上安装 .net core?

    我正在使用 Visual Studio 2019 发布一个独立的 net core 2 1 应用程序 发布期间会发出许多文件 应用程序文件以及核心库 但发布的文件中不包含 dotnet exe 如果没有 dotnet exe 我无法启动已发
  • Chart.js 在条形图和折线图上具有双轴

    我正在使用本主题中的 Quince 的 Chart js 版本Chart js如何获得组合条形图和折线图 条形图和折线图看起来非常漂亮 无论如何 轴必须分为 Y1 和 Y2 我找不到 Quince 的版本支持 我又搜索了一下 发现了这个主题
  • 将列转换为 2D 向量的 C++ 文本文件

    我有一个包含值的文本文件 我想将它们放入二维向量中 我可以用数组来做到这一点 但我不知道如何用向量来做到这一点 矢量大小应该像我事先不知道的 vector2D nColumns nLines 我最多可以在文本文件中包含列数 但不能包含行数
  • Jetpack Compose Text 超链接文本的某些部分

    如何将超链接添加到文本组件文本的某些部分 With buildAnnotatedString我可以设置link蓝色部分并带有下划线 如下图所示 但我怎样才能将该部分变成链接 val annotatedLinkString buildAnno
  • Android EditText 值转为整数

    我正在创建一个抵押计算器 Android 程序 我试图弄清楚如何获取 EditText 值 作为可编辑返回 以转换为整数 以便我可以在抵押计算中使用这些整数 我知道有一个 toString 方法 这是一种可行的方法 然后尝试将其从字符串转换
  • 如何重新定位MKMapView的指南针?

    我想移动 MKMapView 指南针 我想通过这样的方式获得它的参考 let compassView mapView subviews filter 0 is NSClassFromString MKCompassView 然而编译器抱怨
  • ASP.NET Web API 2:如何使用外部身份验证服务登录?

    根据这篇文章http www asp net web api overview security external authentication services 我可以使用local身份验证服务 使用新的 ASP NET 身份框架 但我找
  • 访问 Web 服务的客户端的传入 IP 地址

    我有一个 Web 服务 WCF 并在 IIS 中配置它 现在 有什么方法可以查看尝试访问 Web 服务的客户端 IP 地址 传入 吗 Thanks 请参阅 Keyvan Nayyeri 关于该主题的精彩博客文章 在 WCF 3 5 中检测客
  • 用于选择和取消选择电子表格中所有其他复选框的复选框

    我有一个电子表格 其中包含每个行项目的复选框 我想在顶部放置一个复选框 当选择 取消选择电子表格时 该复选框将选择和取消选择电子表格中的所有其他复选框 以下是我到目前为止的代码 如果选择了 复选框 1 它将选择所有复选框 但如果取消选择 则
  • 如何使用 Roxygen 正确记录来自不同包的泛型的 S3 方法?

    我正在编写一个包 定义一个新类 测量员和print方法 即print surveyor 我的代码工作正常 我使用 roxygen 进行内联文档 但R CMD check发出警告 函数 方法的用途 文档对象 print surveyor 但不
  • 使用数据注释指定日期时间的格式?

    我的视图模型中有这个属性 DataType DataType DateTime public DateTime StartDate get set 如果我想显示日期 或用日期填充文本框 我有这些 每当显示日期时 都会显示如下 01 01 2
  • 为什么 psycopg2 INSERT 需要这么长时间才能循环运行以及如何加快速度?

    我正在尝试在 for 循环中使用 psycopg2 INSERT 将 source lat source long destination lat destination long 行从 Pandas 数据帧插入到 PostgreSQL 表
  • 将编码信息添加到 FOR XML 的结果中[重复]

    这个问题在这里已经有答案了 我有一个脚本 它在 SQL 2008 中使用 FOR XML 返回 XML 有没有办法在输出的开头添加版本和编码信息 最终 我计划将输出保存在文件中 例如 现在我的输出看起来像这样
  • Google Admin sdk 目录 403

    我正在尝试将 googleapi 2 0 与服务帐户一起使用 以在企业域上的用户上使用 Directory gooogle admin sdk 我已按照建议进行操作 this例如 并准备了一个 希望工作 的poc java代码 像这样的东西