Google Calendar OAuth access_token не работает для функций POST

У меня возникают проблемы с вызовом Calendar:Insert через API Google https://www.googleapis.com/calendar/v3/calendars

Я не думаю, что есть проблемы с авторизацией/разрешением, access_token приобретается через refresh_token со следующей областью действия: "https://www.googleapis.com/auth/calendar"

Когда я использую действительный access_token для выполнения GET, проблем нет, но это POST, и я постоянно получаю этот ответ:

 {"error": 
   { "errors": 
     [{ "domain": "global", 
       "reason": "authError", 
       "message": "Invalid Credentials",
       "locationType": "header",
       "location": "Authorization"
     }], 
     "code": 401, 
     "message": "Invalid Credentials" 
   } 
 }

Вот код Railo, который я запускаю, я лишил его всех притворств и нюансов:

<cfhttp url="https://www.googleapis.com/calendar/v3/calendars" charset="utf-8" method="post">
    <cfhttpparam type="header" name="Authorization" value="bearer #arguments.access_token#" />
    <cfhttpparam type="formfield" name="summary" value='hello world' />
</cfhttp>

Вот пример get, который отлично работает:

<cfhttp url="https://www.googleapis.com/calendar/v3/calendars/#arguments.calendarID#/events?access_token=#arguments.access_token#" charset="utf-8" method="get" />

До сих пор я пытался разместить access_token разными способами. Как параметр запроса, как структура json в cfhttpparam type="body" без везения

Этот вопрос о переполнении стека указывает, что В документации API Календаря Google не упоминается обязательный параметр «minAccessRole». Я тоже возился с этим безрезультатно.


person Peter James Chang    schedule 20.02.2014    source источник


Ответы (1)


Некоторое время, удаленное от проблемы, часто вносит ясность.

Методом проб и ошибок мне удалось получить код ошибки от API. В какой-то момент мне стало известно, что Content-Type, который я отправлял, был «octet-stream».

Я добавил следующую строку, чтобы указать Content-Type. Я выбрал "application/json", так как https://developers.google.com/oauthplayground/ это как тип содержимого по умолчанию для операции: вставка календаря.

<cfhttpparam type="header" name="Content-Type" value="application/json" />

Затем мне пришло в голову, что я пытаюсь отправить поля формы в API, а не в JSON. Окончательный рабочий код calls выглядит примерно так:

<cfhttp url="https://www.googleapis.com/calendar/v3/calendars" charset="utf-8" method="post">
    <cfhttpparam type="header" name="Content-Type" value="application/json" />
    <cfhttpparam type="header" name="Authorization" value="bearer #arguments.access_token#" />
    <cfhttpparam type="body" value='{"summary":"newCalendar"}' />
</cfhttp>
person Peter James Chang    schedule 16.04.2014