我要提前道歉,我可能遗漏了一些信息,让任何人都知道我的设置是正确的。请让我知道我还需要说明什么。我在一所大学工作,我们通过 Google 托管学生电子邮件帐户。他们经常忘记密码并且必须重置密码。如果他们验证了有关自己的足够信息,我们有一个页面可以设置他们的密码。我们一直在使用的代码已被 Google 弃用,取而代之的是他们的 Directory API。我的任务是转换这个旧代码:
//changes a password
@Override
public void reset ( final String username, final String password ) throws ResetException
{
try
{
Validate.notEmpty( username );
Validate.notEmpty( password );
final AppsForYourDomainClient client = ClientFactory.getClient(); //admin-user account
final UserEntry entry = client.retrieveUser( username );
Validate.isTrue( !entry.getLogin().getSuspended(), "Account is suspended." );
entry.getLogin().setPassword( password );
client.updateUser( username, entry );
}
catch ( final Exception e )
{
throw new ResetException( e );
}
}
使用他们的新 API。我已经阅读了很多文档和几个示例,但似乎都没有帮助。我已经通过他们的 Admin Console 为我们的管理员帐户启用了 Admin SDK,并注册了我的应用程序并从他们的开发者控制台获得了一个密钥,但我似乎无法收到任何返回我想要的东西的请求。现在我只是想获取用户列表:
public void testList () throws Exception
{
InputStream is = null;
final String accessToken = getAccessToken();
final NetHttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
final JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
final File p12 = new File( GoogleResetterTest.class.getClassLoader().getResource("ead05e56893a.p12").toURI() );
GoogleCredential credential = new GoogleCredential.Builder().setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId( SERVICE_ACCOUNT_EMAIL )
.setServiceAccountScopes( PlusScopes.all() )
.setServiceAccountPrivateKeyFromP12File( p12 ) //password: notasecret
.setClientSecrets(CLIENT_ID, CLIENT_SECRET)
.build();
final Directory dir = new Directory.Builder( httpTransport, jsonFactory, credential)
.setApplicationName( "API Project" )
.build();
final Directory.Users diruser = dir.users();
final Directory.Users.List diruserlist = diruser.list().setDomain( EMAIL_DOMAIN );
final HttpResponse response = diruserlist.executeUsingHead();
is = response.getContent();
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");
String theString = writer.toString();
IOUtils.closeQuietly( is );
}
在 diruserlist.executeUsingHead(); 我得到这个回复:
com.google.api.client.auth.oauth2.TokenResponseException: 400 错误请求 { "error" : "invalid_grant" }
对我来说,这是一条非常无用的错误消息,因为似乎有 4 或 5 件可能出错导致该响应。
我可以帮助我想我把这件事弄得太复杂了。我喜欢原始代码的简单性,而对新 API 的一些回应批评它更复杂。有没有人必须这样做并且可以指出我解决这个问题的正确路径?