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

刚开始使用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文件“轻松实现”?

亲切的问候

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

 using (var fs = new FileStream("key.json", FileMode.Open, FileAccess.Read)) { var credentialParameters = NewtonsoftJsonSerializer.Instance.Deserialize(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这样做,请随时给我一个提示;)

下面的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 /

这是一种更简单的方法

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