从Google中的客户电子邮件和私钥(服务帐户)获取令牌

时间:2015-10-05 17:17:23

标签: c# python google-analytics google-oauth

我花了很多时间尝试获取身份验证令牌。

我需要向用户展示收集的一些Google Analytics信息(我是Google Analytics的所有者)。我已经创建了一个服务帐户,我已经用这个例子测试了所有,并且一切正常(当然使用Nuget包)。

示例:Link

代码示例工作:

string[] scopes = new string[] {AnalyticsService.Scope.Analytics}; // view and manage your Google Analytics data

var keyFilePath = @"c:\file.p12" ;    // Downloaded from https://console.developers.google.com
var serviceAccountEmail = "xx@developer.gserviceaccount.com";  // found https://console.developers.google.com

//loading the Key file
var certificate = new X509Certificate2(keyFilePath, "notasecret", X509KeyStorageFlags.Exportable);
var credential = new ServiceAccountCredential( new ServiceAccountCredential.Initializer(serviceAccountEmail) {
                                                   Scopes = scopes}.FromCertificate(certificate));

我使用过Fiddler,我可以看到令牌是"飞行"谷歌和我的应用程序之间,但我没有任何选择。

我需要这样做,类似Python上的代码,但在C#中使用Embed API

# service-account.py

import json
from oauth2client.client import SignedJwtAssertionCredentials

# The scope for the OAuth2 request.
SCOPE = 'https://www.googleapis.com/auth/analytics.readonly'

# The location of the key file with the key data.
KEY_FILEPATH = 'path/to/json-key.json'

# Load the key file's private data.
with open(KEY_FILEPATH) as key_file:
  _key_data = json.load(key_file)

# Construct a credentials objects from the key data and OAuth2 scope.
_credentials = SignedJwtAssertionCredentials(
    _key_data['client_email'], _key_data['private_key'], SCOPE)

# Defines a method to get an access token from the credentials object.
# The access token is automatically refreshed if it has expired.
def get_access_token():
  return _credentials.get_access_token().access_token

如果您阅读有关嵌入Api的文档,您会发现需要令牌......

 /**
   * Authorize the user with an access token obtained server side.
   */
  gapi.analytics.auth.authorize({
    'serverAuth': {
      'access_token': '{{ ACCESS_TOKEN_FROM_SERVICE_ACCOUNT }}'
    }
  });

有了所有这些信息......我怎样才能获得服务令牌?谢谢!

3 个答案:

答案 0 :(得分:3)

这对我有用

c#c​​ode:

gapi.analytics.auth.authorize({
    'serverAuth': {
        'access_token': '<%=bearer%>'
    }
});

Javascript代码:

DataProviderClass

答案 1 :(得分:0)

因此,您在创建ServiceAccountCredential方面表现得非常出色。您接下来需要做的是在RequestAccessTokenAsync()实例上调用ServiceAccountCredential,之后该实例将使用访问令牌填充令牌属性,例如

if (await credential.RequestAccessTokenAsync(new CancellationToken())) {
    var token = credential.Token.AccessToken;
}

然后,您可以在javascript中使用该令牌。

答案 2 :(得分:0)

只需添加到https://stackoverflow.com/a/38218844/5334191, .netcore中相同:

    public async Task<string> Token(Microsoft.AspNetCore.Hosting.IWebHostEnvironment webenv)
    {
            var root = webenv.ContentRootPath;
            var file = System.IO.Path.Combine(root, "googleanalytics.json");
            Google.Apis.Auth.OAuth2.GoogleCredential credential = GoogleCredential.FromFile(file);
            credential = credential.CreateScoped(new[] {"https://www.googleapis.com/auth/analytics.readonly" });
            var result = await ((ITokenAccess)credential).GetAccessTokenForRequestAsync();
            return result;
    }