Проверка подлинности запроса с помощью Google.Apis.DialogFlow.V2 - PullRequest
0 голосов
/ 02 октября 2018

Я обновил свой клиент C # DialogFlow с Google.Cloud.DialogFlow.V2 до Google.Apis.DialogFlow.v2, однако при подключении к DialogFlow я получаю ошибку 401.

Вот мой код:

Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", cloudKeyFile);
var response = new 
  Google.Apis.Dialogflow.v2.DialogflowService().Projects.Agent.Sessions.DetectIntent(
            new Google.Apis.Dialogflow.v2.Data.GoogleCloudDialogflowV2DetectIntentRequest
            {
                QueryInput = new Google.Apis.Dialogflow.v2.Data.GoogleCloudDialogflowV2QueryInput
                {
                    Text = new Google.Apis.Dialogflow.v2.Data.GoogleCloudDialogflowV2TextInput
                    {
                        Text = queryText,
                        LanguageCode = languageCode
                    }
                }
            },
            $"projects/{ProjectId}/agent/sessions/{sessionId}")
            .Execute();

Ошибка:

Google.Apis.Requests.RequestError В запросе отсутствуют необходимые учетные данные для проверки подлинности.Ожидаемый токен доступа OAuth 2, файл cookie для входа или другие действительные учетные данные для аутентификации.См. https://developers.google.com/identity/sign-in/web/devconsole-project. [401]

ПРИМЕЧАНИЕ. CloudKeyFile - это действительный файл ключа auth2, который работал с предыдущей платформой.(Google.Cloud.DialogFlow.V2)

Может кто-нибудь подсказать мне, что делать?

Заранее спасибо

Ответы [ 4 ]

0 голосов
/ 23 июля 2019

Другие ответы были полезны для меня, но не работали, возможно, из-за изменения API.Вот что у меня сработало:

            var dialogFlowConfigurationBytes = BlobManager.GetBytesByBlobUrl("your json path"); // get bytes from file using BlobManager class (utility class created by me, you could get the stream directly)

            var credentials = GoogleCredential.FromStream(new MemoryStream(dialogFlowConfigurationBytes));
            Channel channel = new Channel(IntentsClient.DefaultEndpoint.Host, IntentsClient.DefaultEndpoint.Port, credentials.ToChannelCredentials());
            var client = SessionsClient.Create(channel);

            foreach (var text in texts)
            {
                var response = client.DetectIntent(
                    session: new SessionName(dialogFlowConfiguration.ProjectId, sessionId),
                    queryInput: new QueryInput()
                    {
                        Text = new TextInput()
                        {
                            Text = text,
                            LanguageCode = languageCode
                        }
                    }
                );
            }
0 голосов
/ 03 октября 2018

Ok нашел решение, программно добавив кредиты к запросу следующим образом:

var creds = GoogleCredential.FromFile(cloudKeyFile);
var scopedCreds = creds.CreateScoped(DialogflowService.Scope.CloudPlatform);
var response = new DialogflowService(new BaseClientService.Initializer
        {
            HttpClientInitializer = scopedCreds,
            ApplicationName = ProjectId
        }).Projects.Agent.Sessions.DetectIntent(
            new GoogleCloudDialogflowV2DetectIntentRequest
            {
                QueryInput = new GoogleCloudDialogflowV2QueryInput
                {
                    Text = new GoogleCloudDialogflowV2TextInput
                    {
                        Text = queryText,
                        LanguageCode = languageCode
                    }
                }
            },
            $"projects/{ProjectId}/agent/sessions/{sessionId}")
            .Execute();

ПРИМЕЧАНИЕ - не забудьте добавить соответствующие флаги Scope!

Пример, который принес ясность: https://developers.google.com/api-client-library/dotnet/guide/batch

0 голосов
/ 29 ноября 2018

Следуя ответу Godsayer's, мне удалось заставить его работать с несколькими строками кода при использовании ac # webclient.

Сначала убедитесь, что вы создали учетную запись службы Google и предоставили ей соответствующие разрешения дляDialogFlow.Мне нужно было получить доступ к Intents, Utterances и т. Д., Поэтому я предоставил его DialogFlow API Admin.

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

В Visual Studio я затем установил пакет nuget Google.Apis.Dialogflow.v2.

В своем консольном приложении я добавил следующие строки кода, и я в игре!

using Google.Apis.Auth.OAuth2;
using Google.Apis.Dialogflow.v2;

var credentials = GoogleCredential.FromFile(@"C:\pathtofile\abc123.json");
var scopedCredentials = credentials.CreateScoped(DialogflowService.Scope.CloudPlatform);
    _oAuthToken = scopedCredentials.UnderlyingCredential.GetAccessTokenForRequestAsync().Result;
WebClient webclient = new WebClient();
webclient.Headers.Add(HttpRequestHeader.ContentType, "application/json");
webclient.Headers.Add(HttpRequestHeader.Authorization, $"Bearer {_oAuthToken}");
0 голосов
/ 02 октября 2018

Аутентификация API Dialogflow существенно меняется с v1 на v2.Вместо использования токенов доступа клиента и разработчика необходимо использовать учетную запись службы OAuth2 или OAuth2 с надлежащими областями (https://www.googleapis.com/auth/cloud-platform) и ролями (Dialogflow API Admin, Dialogflow API Client или Dialogflow API Reader)

Источники:

...