由json私钥文件(ServiceAccount)创建的GoogleCredential - 如何设置用户进行模拟?

时间:2016-07-21 06:49:29

标签: c# .net google-api google-api-dotnet-client

刚开始使用Google Apis。 在我的Google Cloud Platform帐户中,我为域范围委派创建了一个服务帐户。我为此服务帐户保存了json格式的私钥文件。

在我的测试应用程序中,我正在创建一个GoogleCredential实例:

var credential = 
            GoogleCredential.FromStream(new FileStream("privatekey.json", FileMode.Open, FileAccess.Read))
            .CreateScoped(Scopes);

如何设置我想要模仿的用户? 使用p12私钥时,我可以执行以下操作:

var credential = new ServiceAccountCredential(
    new ServiceAccountCredential.Initializer("xxx@developer.gserviceaccount.com") //service Account id
    {
       Scopes = Scopes,
       User = "admin@xxx.com" //the user to be impersonated                    
    }.FromCertificate(new X509Certificate2(@"xxx.p12", "notasecret", X509KeyStorageFlags.Exportable)));

但我怎么能做到这一点"简单的方法"使用GoogleCredential和json privatkey文件?

亲切的问候

3 个答案:

答案 0 :(得分:7)

好的,我现在通过复制GoogleCredential内部代码和内部类DefaultCredentialProvider来解决它

using (var fs = new FileStream("key.json", FileMode.Open, FileAccess.Read))
{
    var credentialParameters =
        NewtonsoftJsonSerializer.Instance.Deserialize<JsonCredentialParameters>(fs);
    if (credentialParameters.Type != "service_account" 
        || string.IsNullOrEmpty(credentialParameters.ClientEmail) 
        || string.IsNullOrEmpty(credentialParameters.PrivateKey))
            throw new InvalidOperationException("JSON data does not represent a valid service account credential.");
    return new ServiceAccountCredential(
        new ServiceAccountCredential.Initializer(credentialParameters.ClientEmail)
        {
            Scopes = Scopes,
            User = _adminUser //the user to be impersonated
        }.FromPrivateKey(credentialParameters.PrivateKey));
}

如果有人(也许peleyal)有更好的想法直接通过GoogleCredential这样做,请随时给我一个提示;)

答案 1 :(得分:0)

下面是Javascript但你可以在#C中做类似的我确定。

我使用client_id和client_secret方法

function tokenRefresh(){

  var uri = "https://accounts.google.com/o/oauth2/token";

  var payload =
      {
        'client_id' : 'XXXXXXXX.apps.googleusercontent.com',
        'client_secret' : 'XXXXXXXX',
        'grant_type' : 'refresh_token',
        'content_type' : 'application/x-www-form-urlencoded',
        'refresh_token' : 'XXXXXXXX'
      };

  var options = 
      { "method" : "POST",
       "muteHttpExceptions" : false,
       "payload" : payload
      };

  var response = UrlFetchApp.fetch(uri, options),
      response_json = JSON.parse(response.getContentText()),
      token = response_json.access_token;
  return(token);
}

假设您拥有正确的范围权限,则每次都会为您提供一个新令牌。

每次要访问API时都需要附加access_key(而不是某些Google文档中指示的'key =')

有关如何让范围随时查看我写的内容的更多信息:http://thisistony.com/blog/googleanalytics/google-analytics-api-oauth-ever-wondered-how-to-get-the-access_token/

答案 2 :(得分:0)

这是一个更简单的方法

var sac = ServiceAccountCredential.FromServiceAccountData(new FileStream("key.json", FileMode.Open));