Прогноз Google ML-Engine от C # Аутентификация - PullRequest
0 голосов
/ 03 мая 2018

подписок

OAuth пример

успешно получает токен на предъявителя, но ответ:

{StatusCode: 401, ReasonPhrase: 'Unauthorized', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Vary: X-Origin
  Vary: Referer
  Vary: Origin
  Vary: Accept-Encoding
  X-XSS-Protection: 1; mode=block
  X-Frame-Options: SAMEORIGIN
  X-Content-Type-Options: nosniff
  Alt-Svc: hq=":443"; ma=2592000; quic=51303433; quic=51303432; quic=51303431; quic=51303339; quic=51303335,quic=":443"; ma=2592000; v="43,42,41,39,35"
  Transfer-Encoding: chunked
  Accept-Ranges: none
  Cache-Control: private
  Date: Thu, 03 May 2018 13:29:53 GMT
  Server: ESF
  WWW-Authenticate: Bearer realm="https://accounts.google.com/"
  Content-Type: application/json; charset=UTF-8
}}

с использованием служебной учетной записи с ролью ML Engine Developer. Вот код:

        var url = $"{googleapiprojecturl}/models/{modelname}/versions/{version}:predict";
        GoogleCredential credential;
        using (Stream stream = new FileStream(@"C:\serviceacctkey.json", FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            credential = GoogleCredential.FromStream(stream);
        }
        var bearer_token = await credential.UnderlyingCredential.GetAccessTokenForRequestAsync(url);
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearer_token);
        var content = new StringContent(payloadJsonString, Encoding.UTF8, "application/json");
        var responseMessage = await client.PostAsync(url, content);
        responseMessage.EnsureSuccessStatusCode();

где googleapiprojecturl = https://ml.googleapis.com/v1/projects/{projectID}

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Как сказал Крис выше, в качестве комментария на вопрос ответом был объем полномочий, прежде чем запрашивать токен:

credential = GoogleCredential.FromStream(stream).CreateScoped(new[] { CloudMachineLearningEngineService.Scope.CloudPlatform });
0 голосов
/ 03 мая 2018

Я не делал этого в C #, но у меня также были проблемы в Python со следующим похожим кодом:

# Doesn't work
# creds = GoogleCredentials.from_stream(SERVICE_ACCOUNT_FILE)

В Python сработало следующее:

from oauth2client import service_account
creds = service_account.ServiceAccountCredentials.from_json_keyfile_name('key.json', SCOPES)
creds.get_access_token()

В C # похоже, что вы используете класс ServiceAccountCredentials.

...