2013-06-13 2 views
1

Использование нового Google Cloud Datastore v1beta клиентскую библиотеку, я получаю403 разрешение отказано в Google Cloud Datastore .NET API клиента

{ 
"error": { 
    "errors": [ 
    { 
    "domain": "global", 
    "reason": "PERMISSION_DENIED", 
    "message": "Unauthorized." 
    } 
    ], 
    "code": 403, 
    "message": "Unauthorized." 
} 
} 

для любого запроса. Я создал приложение для приложений, добавил API облачного хранилища данных, настроил учетную запись службы, и я использую ее для аутентификации моих запросов.

[TestMethod] 
public void BasicBlindWrite() 
{ 
    var service = new DatastoreService(new BaseClientService.Initializer() { Authenticator = CreateAuthenticator() }); 

    var request = new GoogleData.BlindWriteRequest(); 
    var entity = new GoogleData.Entity(); 
    entity.Key = new GoogleData.Key(); 
    entity.Key.Path = new List<KeyPathElement>(); 
    entity.Key.Path.Add(new GoogleData.KeyPathElement { Kind = "Consumer", Name = "Consumer-1" }); 
    var firstName = new GoogleData.Property(); 
    firstName.Values = new List<GoogleData.Value>(); 
    firstName.Values.Add(new GoogleData.Value { StringValue = "Samuel"}); 
    entity.Properties = new GoogleData.Entity.PropertiesData(); 
    entity.Properties.Add("FirstName", firstName); 
    request.Mutation = new GoogleData.Mutation(); 
    request.Mutation.Upsert = new List<GoogleData.Entity>(); 
    request.Mutation.Upsert.Add(entity); 

    var response = service.Datasets.BlindWrite(request, "my-appengine-project-id").Fetch(); 
} 

private OAuth2Authenticator<AssertionFlowClient> CreateAuthenticator() 
{ 
    var certificate = new X509Certificate2(TestClientCredentials.ClientCertificateFilePath, "notasecret", 
     X509KeyStorageFlags.Exportable); 

    var provider = new AssertionFlowClient(GoogleAuthenticationServer.Description, certificate) 
    { 
     ServiceAccountId = TestClientCredentials.CertificateEmailAddress, 
     Scope = "https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/datastore" 
    }; 

    var authenticator = new OAuth2Authenticator<AssertionFlowClient>(provider, AssertionFlowClient.GetState); 

    return authenticator; 
} 

Если я использую консоль API для Интернета, она работает.

** UPDATE **

Вот как я создал учетную запись службы:

  1. создания приложения AppEngine.
  2. Перешел на консоль Google API.
  3. Включен API Google Cloud Datastore для приложения AppEngine.
  4. Нажмите «Создать идентификатор клиента OAuth 2.0 ...»
  5. Дал ему фиктивное имя.
  6. Выбрано «Учетная запись службы» в качестве типа приложения.
  7. Нажмите «Создать идентификатор клиента».
  8. Нажмите «Загрузить закрытый ключ» (расположение представлено как TestClientCredentials.ClientCertificateFilePath в коде ниже).
+0

Я думаю, что это тот же самый вопрос, у меня есть? Можете ли вы сравнить свой токен с моим? (http://stackoverflow.com/questions/17094641/google-datastore-token-not-authorized) –

+0

Можете ли вы подробно описать, как вы создали учетную запись службы? – proppy

+0

@proppy см. Обновление выше –

ответ

0

Ответ на этот вопрос question.

Чтобы учетная запись службы была правильно настроена с использованием экземпляра облачного хранилища данных, вы должны создать их, используя Cloud Console, как описано в documentation.

В качестве альтернативы, если вы действительно хотите использовать сервис аккаунт, созданный с помощью [консоль Google APIs] [3], вы можете сделать следующее:

  • Перейти к cloud.google.com/console
  • Нажмите на вашем проекте ID
  • Нажмите на ⚙
  • Нажмите на Команды
  • Нажмите Добавить член
  • Добавить учетную запись службы в качестве просмотра
+0

Это не исправило его, так как создание учетной записи службы фактически добавляет этот адрес электронной почты членам Команды автоматически. Тем не менее, я отследил этот чат [http://chat.stackoverflow.com/rooms/32113/discussion-between-proppy-and-gert-cuykens] между вами и автором в другом сообщении и отключением и повторным включением API Cloud Datastore исправил проблему и для меня. –

Смежные вопросы