2

我正在尝试使用以下代码发布。我希望它返回令牌,但它返回错误 405 Method Not Allowed

<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 中的代码。

请帮忙!!

4

2 回答 2

2

我找到了答案:关键是使用 cfhttpparam 类型“ body ”。根据 livedocs “body:指定 HTTP 请求的正文。ColdFusion 不会自动设置内容类型标头或 URL 对正文内容进行编码。要指定内容类型,请使用带有 type=header 的单独 cfhttp 标记。”

下面的代码现在返回给我访问令牌:)

<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>
于 2012-11-09T19:21:23.333 回答
0

在这里找到了一个类似的帖子Google OAuth 2 authentication-swaping code for token。他们的答案是对客户端密钥进行 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 中传递。

于 2012-11-08T13:16:32.300 回答