ArgumentException:前提条件失败:!string.IsNullOrEmpty(authorization.RefreshToken),带有Google Admin SDK服务帐户目录访问权限

时间:2013-10-11 15:13:13

标签: google-oauth google-admin-sdk google-api-dotnet-client

我正在尝试使用服务帐户访问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的唯一内容似乎是当个人授权应用程序并且应用程序可能需要脱机工作时。请任何人帮忙或指出我的文件方向。

2 个答案:

答案 0 :(得分:0)

服务帐户授权实际上不会返回刷新令牌 - 因此此错误有意义。你知道这是从哪里来的吗?

我对.NET客户端库不太熟悉,但拥有完整的错误跟踪会有所帮助。

作为一个远景 - 错误可能是一个错误的错误 -

  • 您是否可以确认您已在此项目的API控制台中启用了Admin SDK
  • 您是否可以确认已将您正在测试的域中的服务帐户的客户端ID列入白名单(以及Admin SDK范围)

答案 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"
};

我在另一篇文章中看过这个并用我的标准用户帐户尝试过它并没有用。然后我读了一些建议必须用管理员帐户完成的事情。所以,我使用我的管理员帐户创建了一个全新的项目,包括创建一个新的服务帐户,并对其进行授权。当我尝试它时,它工作。所以,然后我把旧的服务帐户详细信息放回去,但是留下了管理员帐户。这也很有用。