Вот код (я использовал переменные):

ая / Резюме: У меня есть приложение "Действия", разработанное в Google DialogFlow, и я хочу, чтобы пользователь мог создавать событие Календаря Google с помощью приложения (из Google Assistant). Другими словами, аутентифицируйте пользователя, чтобы разрешитьмой приложение для использованияего Календарь для создания событий.

Что сделано:

Поскольку в Google Actions не разрешено использование конечных точек Google Auth / Token, я решил использоватьhttp://www.auth0.com.

Создан аккаунт (использовал мой аккаунт Google) наauth0.comсоздал приложение и настроил следующие значения с помощью панели управления (Домен, CliendId а такжеClientSecret генерируется auth0):

Создан идентификатор клиента OAuth на странице учетных данных консоли Google Cloud:

Настроенные действия Аккаунт Связывание выглядит так:

Вернулся на auth0.com> Подключения> Социальные сети> Включенный Google:

Проверено «Требуется вход» в DialogFlow> Интеграции> Google Assistant:

Написал журнал в первой строке моего метода DialogFlow Webhook для записи следующего ответа:

  {
  "originalRequest":{
     "source":"google",
     "version":"2",
     "data":{
        "isInSandbox":true,
        "surface":{
           "capabilities":[
              {
                 "name":"actions.capability.AUDIO_OUTPUT"
              },
              {
                 "name":"actions.capability.WEB_BROWSER"
              },
              {
                 "name":"actions.capability.MEDIA_RESPONSE_AUDIO"
              },
              {
                 "name":"actions.capability.SCREEN_OUTPUT"
              }
           ]
        },
        "inputs":[
           {
              "rawInputs":[
                 {
                    "query":"test",
                    "inputType":"KEYBOARD"
                 }
              ],
              "arguments":[
                 {
                    "rawText":"test",
                    "textValue":"test",
                    "name":"text"
                 }
              ],
              "intent":"actions.intent.TEXT"
           }
        ],
        "user":{
           "lastSeen":"2018-05-03T11:40:57Z",
           "accessToken":"4CfRs-Lt5lWVQuyOYODvf1xxxxxxx",
           "locale":"en-US",
           "userId":"15229245xxxxx"
        },
        "conversation":{
           "conversationId":"15253476xxxxx",
           "type":"ACTIVE",
           "conversationToken":"[\"authentication\",\"wh_patient-details\"]"
        },
        "availableSurfaces":[
           {
              "capabilities":[
                 {
                    "name":"actions.capability.AUDIO_OUTPUT"
                 },
                 {
                    "name":"actions.capability.SCREEN_OUTPUT"
                 }
              ]
           }
        ]
     }
  },
  "id":"1d6ed865-0803-49ca-bbac-xxxx",
  "timestamp":"2018-05-03T11:42:22.835Z",
  "lang":"en-us",
  "result":{
     "source":"agent",
     "resolvedQuery":"test",
     "speech":"",
     "action":"v00.xxxxx",
     "actionIncomplete":false,
     "parameters":{
        "CallEnum":"Test"
     },
     "contexts":[
        {
           "name":"authentication",
           "parameters":{
              "CallEnum":"Test",
              "CallEnum.original":""
           },
           "lifespan":1
        },
        {
           "name":"actions_capability_screen_output",
           "parameters":{
              "CallEnum":"Test",
              "CallEnum.original":""
           },
           "lifespan":0
        },
        {
           "name":"actions_capability_audio_output",
           "parameters":{
              "CallEnum":"Test",
              "CallEnum.original":""
           },
           "lifespan":0
        },
        {
           "name":"wh_patient-details",
           "parameters":{
              "patientId":0,
              "CallEnum":"Test",
              "fallbackLifespan":0,
              "providerId":0,
              "practiceId":0,
              "CallEnum.original":"",
              "fullDob":"01 January, 0001"
           },
           "lifespan":199
        },
        {
           "name":"google_assistant_input_type_keyboard",
           "parameters":{
              "CallEnum":"Test",
              "CallEnum.original":""
           },
           "lifespan":0
        },
        {
           "name":"actions_capability_web_browser",
           "parameters":{
              "CallEnum":"Test",
              "CallEnum.original":""
           },
           "lifespan":0
        },
        {
           "name":"actions_capability_media_response_audio",
           "parameters":{
              "CallEnum":"Test",
              "CallEnum.original":""
           },
           "lifespan":0
        }
     ],
     "metadata":{
        "intentName":"v00xxxx",
        "isResponseToSlotfilling":false,
        "intentId":"c7bd9113-d5b4-4312-8851-xxxxxxx",
        "webhookUsed":"true",
        "webhookForSlotFillingUsed":"false",
        "nluResponseTime":556
     },
     "fulfillment":{
        "speech":"Test",
        "messages":[
           {
              "type":0,
              "speech":"Test"
           }
        ]
     },
     "score":0.8399999737739563
  },
  "status":{
     "code":200,
     "errorType":"success"
  },
  "sessionId":"152534xxxxxxx",
  "isStackdriverLoggingEnabled":false

}

где соответствующий раздел:

"user":{
           "lastSeen":"2018-05-03T11:40:57Z",
           "accessToken":"4CfRs-Lt5lWVQuyOYODvf1xxxxxxx",
           "locale":"en-US",
           "userId":"15229245xxxxx"
        }
Из этого поста:Смотрите ответ @Prisoner

Токен авторизации (который вы выдали, поскольку вы являетесь сервером OAuth) будет отправлен в объект JSON по адресу originalRequest.data.user.accessToken.

Поэтому я использовал токен авторизации сверху в приведенном ниже коде:

string clientId = "361385932727-ksg6jgjxxxxxSNIP";
string clientSecret = "rc2K1UUyntxxxxxxSNIP";
string accessToken = jsonObject.SelectToken("originalRequest.data.user.accessToken");
string userId = jsonObject.SelectToken("originalRequest.data.user.userId");

IAuthorizationCodeFlow flow =
        new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
        {
            ClientSecrets = new ClientSecrets
            {
                ClientId = clientId,
                ClientSecret = clientSecret
            },
            Scopes = new[] { CalendarService.Scope.Calendar }
        });

TokenResponse token = flow.ExchangeCodeForTokenAsync(userId, accessToken, 
    "https://oauth-redirect.googleusercontent.com/r/xxxxxxxxx", CancellationToken.None).Result;

UserCredential credential = new UserCredential(flow, userId, new TokenResponse { AccessToken = token.AccessToken });
CalendarService service = new CalendarService(new BaseClientService.Initializer()
{
    HttpClientInitializer = credential,
    ApplicationName = "Test Auth0",
});

var list = service.CalendarList.List().Execute().Items;

И исключение:

Error:"invalid_grant", Description:"Malformed auth code.", Uri:""
Stacktrace:    at Google.Apis.Auth.OAuth2.Requests.TokenRequestExtenstions.<ExecuteAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.<FetchTokenAsync>d__35.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.<FetchTokenAsync>d__35.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.<ExchangeCodeForTokenAsync>d__30.MoveNext()

И когда я изменяю ClientId / ClientSecret в приведенном выше коде на код с auth0.com, исключение:

Error:"invalid_client", Description:"The OAuth client was not found.", Uri:""
Stacktrace:    at Google.Apis.Auth.OAuth2.Requests.TokenRequestExtenstions.<ExecuteAsync>d__0.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.<FetchTokenAsync>d__35.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.<FetchTokenAsync>d__35.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Google.Apis.Auth.OAuth2.Flows.AuthorizationCodeFlow.<ExchangeCodeForTokenAsync>d__30.MoveNext()

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

Ответы на вопрос(1)

Ваш ответ на вопрос