不支持的内容类型:google plus api oauth2中的multipart / form-data

时间:2015-08-20 00:51:02

标签: api http google-api google-plus google-api-php-client

我正尝试在我的网络应用中使用google plus Api登录。

我从https://developers.google.com/oauthplayground/https://developers.google.com/oauthplayground/搜索了它 我申请了他们。

当我向https://www.googleapis.com/oauth2/v3/token请求时,它会返回

if(isset($_GET['code'])) {
// try to get an access token
$code = $_GET['code'];
$url = 'https://www.googleapis.com/oauth2/v3/token';
$params = array(
    "code" => $code,
    "client_id" => "************************",
    "client_secret" => "************************",
    "redirect_uri" => "http://localhost/googleplus/oauth2callback.php",
    "grant_type" => "authorization_code"
);



$json=CallAPI('POST',$url,$params);

我正在处理正在执行请求的代码片段(作为客户端ID和密码作为星号) 我不明白,也许你可以帮忙。

function CallAPI($method, $url, $data = false)
{

$curl = curl_init();

switch ($method)
{
    case "POST":
        curl_setopt($curl, CURLOPT_POST, 1);

        if ($data)
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        break;
    case "PUT":
        curl_setopt($curl, CURLOPT_PUT, 1);
        break;
    default:
        if ($data){
            $url = sprintf("%s?%s", $url, http_build_query($data));
            echo $url;
        }
}

// Optional Authentication:
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password");

curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($curl);

curl_close($curl);



return $result;
}

和我的CALLAPI函数

{{1}}

4 个答案:

答案 0 :(得分:1)

您的要求是正确的,但遗漏了一些东西 内容类型不是multipart/form-data应该application/x-www-form-urlencoded而是

答案 1 :(得分:0)

我使用OAuth2.0从iOS应用程序访问Gmail时遇到了类似的问题。确实艾哈迈德的建议是正确的我会扩展它:

使用HTTP进行POST时,会有一个标题字段“Content-Type:”。在您的情况下,它的默认值为'multipart / form-data',用于二进制数据。对于Google API OAuth2.0,请务必将其设置为'application / x-www-form-urlencoded'

您可以在此处给出的示例中看到此值: https://developers.google.com/identity/protocols/OAuth2InstalledApp#handlingtheresponse

您可以在此处详细了解“Content-Type”的这两个值: application/x-www-form-urlencoded or multipart/form-data?

在我的iOS框架中,我不得不调用自定义此HTTP标头。不幸的是我不熟悉PHP所以希望有所帮助。

答案 2 :(得分:0)

我有一个非常类似的问题。我终于能够通过向HTTP头添加一些元素(“Content-Type”和“Content-Length”)并手动构建url来解决它(所以我可以使用0代表“Content-Length”)。

$id_token = $_POST['id_token'];
$url = 'https://www.googleapis.com/oauth2/v3/tokeninfo?id_token='.$id_token;
$options = [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_POST => 1,
    CURLOPT_HTTPHEADER => array( "Content-Length: 0", "Content-Type: application/x-www-form-urlencoded"),
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
];

$curlObj = curl_init();
curl_setopt_array($curlObj, $options);
$returnData = curl_exec($curlObj);
if (curl_errno($curlObj)) {
    //error message
    $returnData = curl_error($curlObj);
}

echo $returnData;

答案 3 :(得分:-1)

      if(isset($_REQUEST['code'])){
$ch =curl_init();
$auth_url = "https://www.googleapis.com/oauth2/v4/token";
$post = array(
        'code' =>$_REQUEST['code'],
        'client_id' => '**************',
        'client_secret' => '************',
        'redirect_uri' => 'http://localhost/prakash/redirect.php',
        'grant_type' => 'authorization_code'
        );
$postText = http_build_query($post);
$options = array(
    CURLOPT_URL =>$auth_url,
    CURLOPT_POST => true,
     CURLOPT_SSL_VERIFYPEER =>false,
    CURLOPT_RETURNTRANSFER =>true,
    CURLOPT_POSTFIELDS => $postText
);
//print_r($ch);
curl_setopt_array($ch, $options);
$returnData = curl_exec($ch);
print_r($returnData);
curl_close($ch);
    exit;
}else{
    print_r($_REQUEST);
    exit;
}