我正在尝试使用服务帐户访问Google Directory。我已经摆弄DriveService example来获取此代码:
public static void Main(string[] args)
{
var service = BuildDirectoryService();
var results = service.Orgunits.List(customerID).Execute();
Console.WriteLine("OrgUnits");
foreach (var orgUnit in results.OrganizationUnits)
{
Console.WriteLine(orgUnit.Name);
}
Console.ReadKey();
}
static DirectoryService BuildDirectoryService()
{
X509Certificate2 certificate = new X509Certificate2(SERVICE_ACCOUNT_PKCS12_FILE_PATH, "notasecret",
X509KeyStorageFlags.Exportable);
var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
{
ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
Scope = DirectoryService.Scopes.AdminDirectoryOrgunit.GetStringValue()
};
var auth = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState);
return new DirectoryService(new BaseClientService.Initializer()
{
Authenticator = auth,
ApplicationName = "TestProject1",
});
}
当我运行它时,我得到了
ArgumentException: Precondition failed.: !string.IsNullOrEmpty(authorization.RefreshToken)
我在Google文档中绕圈子。我可以找到关于RefreshTokens的唯一内容似乎是当个人授权应用程序并且应用程序可能需要脱机工作时。请任何人帮忙或指出我的文件方向。
答案 0 :(得分:0)
服务帐户授权实际上不会返回刷新令牌 - 因此此错误有意义。你知道这是从哪里来的吗?
我对.NET客户端库不太熟悉,但拥有完整的错误跟踪会有所帮助。
作为一个远景 - 错误可能是一个错误的错误 -
答案 1 :(得分:0)
如果用以下代码替换提供程序块,则上述代码将起作用:
var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate)
{
ServiceAccountId = SERVICE_ACCOUNT_EMAIL,
Scope = DirectoryService.Scopes.AdminDirectoryOrgunit.GetStringValue(),
ServiceAccountUser = SERVICE_ACCOUNT_USER //"my.admin.account@my.domain.com"
};
我在另一篇文章中看过这个并用我的标准用户帐户尝试过它并没有用。然后我读了一些建议必须用管理员帐户完成的事情。所以,我使用我的管理员帐户创建了一个全新的项目,包括创建一个新的服务帐户,并对其进行授权。当我尝试它时,它工作。所以,然后我把旧的服务帐户详细信息放回去,但是留下了管理员帐户。这也很有用。