Java 如何在不需要OAuth授权的情况下代表我们的组织用户提供密码

Java 如何在不需要OAuth授权的情况下代表我们的组织用户提供密码,java,google-admin-sdk,Java,Google Admin Sdk,根据目前已弃用的Google Apps Provisioning API,我们的组织能够代表我们的用户提供密码,只需授权为超级管理员用户,如下所示: User userService = new UserService(GoogleAppsPasswordSyncConnector.class.getSimpleName()); AuthTokenFactory authTokenFactory = AuthTokenFactoryThreadLocal.getAuthTokenFactor

根据目前已弃用的Google Apps Provisioning API,我们的组织能够代表我们的用户提供密码,只需授权为超级管理员用户,如下所示:

 User userService = new UserService(GoogleAppsPasswordSyncConnector.class.getSimpleName());
 AuthTokenFactory authTokenFactory = AuthTokenFactoryThreadLocal.getAuthTokenFactory(adminUsername, adminPassword);
 userService.setAuthTokenFactory(authTokenFactory);
然而,对于新的目录API,根据,要求“对目录API的所有请求必须由经过身份验证的用户授权”。这是基于OAuth 2.0来授权请求的

我们如何代表我们的组织用户设置密码,而不要求他们授权请求

请注意,在某些情况下,我们可能手头有他们当前的Google密码,因此我们可能会以编程方式代表他们进行授权。但是,对于新的Google帐户,我们不知道设置的密码


请注意,我们利用“GADS”(谷歌应用程序目录同步)来提供新的谷歌帐户。

无论您如何看待它,您都必须在链接时通过OAuth验证。然而,如果你不想做重物搬运,你可能想看看其他的工具。如果您在.Net/C中的Windows中工作,请查看我的项目,该项目在最基本的级别上是一个,但也提供了PowerShell cmdlet,您可以编写脚本

在PowerShell中,完成一次性身份验证后,您可以使用以下方式编程更新用户密码:

Set-GAUser MyUser -NewPassword ThisIsTheNewPassword
或者你可以让它为你生成一个,如果你愿意的话

如果您计划使用Python或希望使用命令行,请查看这也是一个很好的资源

对于新帐户,您应该仍然能够使用GADS创建新帐户和密码。如果您没有将其用于密码,您应该能够使用上述方法之一来绑定到现有代码


最后,如果您没有像我在这里假设的那样使用Windows,那么我提到的两个项目都是开源的,您可以浏览代码以获得如何进行身份验证的示例,虽然您已经找到的Google资源可能更直截了当。

在Google开发者控制台()API和Auth凭据中创建服务帐户类型OAuth client id并在API项目中启用Admin SDK后,然后将API作用域“”添加到安全性“Manage API Client access”中https admin.google.com/AdminHome的作用域中,我可以使用以下代码设置密码。请注意,用于建立上述配置的帐户对相关谷歌电子邮件具有管理权限

        HttpTransport httpTransport = new NetHttpTransport();
        JsonFactory jsonFactory = new JacksonFactory();

        Credential credential = new GoogleCredential.Builder()
                .setTransport(httpTransport)
                .setJsonFactory(jsonFactory)
                .setServiceAccountId(clientEmail)
                .setServiceAccountUser(adminUser)
                .setServiceAccountPrivateKeyFromP12File(new File(privateKeyStoreLocation))
                .setServiceAccountScopes(scopes).build();

        Directory directory = new Directory.Builder(httpTransport, jsonFactory, credential)
                .setApplicationName(applicationName)
                .build();

        Directory.Users.Get get = directory.users().get(userEmail);
        User user = get.execute();
        user.setPassword(newPassword);
        directory.users().patch(userEmail, user).execute();

对不起,我帮不上忙了。不管是哪种方式,您仍然需要进行身份验证并启动OAuth工作流。幸运的是,新的API看起来都非常相似,因此我提到的两个项目中的可用代码可能会帮助您朝着正确的方向前进(可能不会)。你可以从他们的想法中找到用处。(对于将来的问题,请确保使用
Java
标记或任何合适的标记来标记您的帖子,以便您获得更有针对性的帮助!)Java是我们选择的开发平台,我将在其中构建密码设置解决方案。我仍然想知道API是否需要用户当前密码来授权密码更改请求(我将以编程方式代表他们执行),或者我是否可以简单地使用一些系统级凭据(例如,客户端id、客户端机密、系统私钥)对于任何用户密码更改。我已经在Google的API和Auth下,在他们的开发者控制台中创建了一个“服务帐户”凭据,我希望能够单独使用这些凭据执行密码更改。我正在考虑为此目的构建一个Google凭据:
GoogleCredential credential=new GoogleCredential.Builder().setTransport(httpTransport).setJsonFactory(jsonFactory).setServiceAccountId(clientId).setServiceAccountUser(clientEmail).setServiceAccountScopes(scopes).SetServiceAccountPrivateKeyFromp12文件(新java.io.File(privateKeyStoreLocation)).build()
但是,我不确定这是否能达到我的目标。我相信服务帐户通常用于代表用户通过API访问数据,例如编辑驱动器或日历中的内容。我很确定您将无法使用服务帐户更改密码(因为这在Admin SDK中,需要管理员权限,用户不能使用api更改自己的密码)。如所述,“通常,当应用程序使用Google api处理自己的数据而不是用户的数据时,应用程序使用服务帐户。”