Токен Google oauth дает ошибку 405

Я пытаюсь опубликовать, используя приведенный ниже код. Я ожидаю, что он вернет токен, но возвращает ошибку 405 Метод запрещен.

<cfhttp method="POST" url="http://accounts.google.com/o/oauth2/token" >
    <cfhttpparam type="Formfield" name="code" value="#url.CODE#">
    <cfhttpparam type="Formfield" name="client_id" value="458381219741.apps.googleusercontent.com">
    <cfhttpparam type="Formfield" name="client_secret" value="XXXXXXX">
    <cfhttpparam type="Formfield" name="redirect_uri" value="http://console.mbwebportal.com/oauth2callback">
    <cfhttpparam type="Formfield" name="grant_type" value="authorization_code">
</cfhttp>

Приведенный выше код находится на http://console.mbwebportal.com/oauth2callback и получает код по URL-адресу после того, как пользователь разрешит доступ к приложению.

Пожалуйста помоги!!


person Deepak Yadav    schedule 08.11.2012    source источник
comment
разве вы не должны использовать протокол httpS в своем запросе? со страницы Google developers.google.com/accounts/docs/OAuth2WebServer: этот запрос сообщение HTTP и включает следующие параметры ...   -  person azawaza    schedule 09.11.2012
comment
отсутствие https дает другую ошибку (например, страница не найдена). Согласно документации Google, это должен быть запрос HTTP 1.1, который автоматически вызывает адрес https. Попробуйте вставить accounts.google.com/o/oauth2/token в свой браузер, вы увидит, что он конвертируется в https.   -  person Deepak Yadav    schedule 09.11.2012


Ответы (2)


Я нашел ответ: ключ заключался в использовании типа cfhttpparam 'body'. Согласно liveocs «body: указывает тело HTTP-запроса. ColdFusion не устанавливает автоматически заголовок типа содержимого или URL-адрес, кодирующий содержимое тела. Чтобы указать тип содержимого, используйте отдельный тег cfhttp с type = header».

Код ниже возвращает мне токен доступа :)

<cfset client_id = "458381219741.apps.googleusercontent.com">
<cfset client_secret = "**********">
<cfset callback = "http://console.mbwebportal.com/oauth2callback">

<cfset postBody = "code=" & UrlEncodedFormat(url.code) & "&">
<cfset postBody = postBody & "client_id=" & UrlEncodedFormat(client_id) & "&">
<cfset postBody = postBody & "client_secret=" & UrlEncodedFormat(client_secret) & "&">
<cfset postBody = postBody & "redirect_uri=" & UrlEncodedFormat(callback) & "&">
<cfset postBody = postBody & "grant_type=authorization_code">
<cfhttp method="post" url="https://accounts.google.com/o/oauth2/token">
    <cfhttpparam name="Content-Type" type="header" value="application/x-www-form-urlencoded">
    <cfhttpparam type="body" value="#postBody#">
</cfhttp>
person Deepak Yadav    schedule 09.11.2012

Нашел похожий пост здесь Авторизация Google OAuth 2 - замена кода на токен . Ответ для них заключался в том, чтобы URL-адрес закодировал секретный ключ клиента и перенаправил URI. В ColdFusion вы можете использовать функцию URLEncodedFormat(), чтобы сделать это за вас.

<cfhttp method="POST" url="http://accounts.google.com/o/oauth2/token" >
    <cfhttpparam type="Formfield" name="code" value="#url.CODE#">
    <cfhttpparam type="Formfield" name="client_id" value="458381219741.apps.googleusercontent.com">
    <cfhttpparam type="Formfield" name="client_secret" value="#URLEncodedFormat(XXXXXXX)#">
    <cfhttpparam type="Formfield" name="redirect_uri" value="#URLEncodedFormat("http://console.mbwebportal.com/oauth2callback")#">
    <cfhttpparam type="Formfield" name="grant_type" value="authorization_code">
</cfhttp>

И, пожалуйста, проверьте свое значение url.CODE перед его использованием, так как в URL можно передать все, что угодно.

person Miguel-F    schedule 08.11.2012