【问题标题】:Google OAuth2.0 returns 'invalid_request' when getting access_token with PHP cURL使用 PHP cURL 获取 access_token 时,Google OAuth2.0 返回“invalid_request”
【发布时间】:2016-09-02 14:42:34
【问题描述】:

我遇到了与此处所述相同的问题“POST using CURL in PHP gives invalid request Error。在看到该帖子之前,我的代码已经像接受的答案一样设置好了。

// First I get the access code like so
function get_oauth_code($wpoa) {
    $params = array(
        'response_type' => 'code',
        'client_id' => CLIENT_ID,
        'scope' => SCOPE,
        'state' => uniqid('', true),
        'redirect_uri' => REDIRECT_URI,
    );
    $_SESSION['WPOA']['STATE'] = $params['state'];
    $url = URL_AUTH . http_build_query($params);
    header("Location: $url");
    exit;
}

$params = array(
    'grant_type' => 'authorization_code',
    'client_id' => CLIENT_ID,
    'client_secret' => CLIENT_SECRET,
    'code' => $_GET['code'],
    'redirect_uri' => REDIRECT_URI,
);
$url_params = http_build_query($params);
$url = URL_TOKEN . $url_params;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $params);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, (get_option('wpoa_http_util_verify_ssl') == 1 ? 1 : 0));
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, (get_option('wpoa_http_util_verify_ssl') == 1 ? 2 : 0));
        $result = curl_exec($curl);

当我第一次尝试登录时,它工作正常,但如果我注销并重新尝试(不是每次,但始终如一),它会返回以下错误响应

Array ( [error] => invalid_request )

由于对该答案的以下评论,我认为access_code 可能正在以某种方式被重用,但我运行 unset 只是为了确保问题仍然存在。这里证明当收到invalid_request 错误时,我确实有一个访问代码:

Array( 
    [state] => 57c8b107a5a021.27458568 
    [code] => 4/Q8bswW3yheJ6tLFQnTd-pkfG6zVdbMk9UehgroR7f60 
)

总的来说,我是 OAuth 的新手,但整个星期都在处理它,所以变得非常熟悉,但希望有人比我知道的更多,可以帮助我解决这个问题。我想确保用户永远不会因为服务器端脚本中的一些会话细节而在登录时遇到问题。

注意:这是与Perry Butler's WP-OAuth plugin合作的

【问题讨论】:

    标签: php wordpress curl oauth-2.0 google-api


    【解决方案1】:

    我对 google oauth 并不熟悉,我想回答这个问题是权威,但我从您的代码中看到了一些问题。

    1,您有很多明显超出本代码范围的定义。 2,您的网址被附加了所有应该应用于请求帖子的参数。

    我要尝试的第一件事是更改此行:

    $url = URL_TOKEN . $url_params;
    

    收件人:

    $url = URL_TOKEN;
    

    在请求中也添加一些调试,并显示正在调用的 $url。似乎没有任何不正常的东西。

    【讨论】:

    • 这似乎解决了 access_token 的问题,但由于某种原因,它在尝试通过 googleapis.com/plus/v1/people/me 获取 oauth 身份时中断。因此,对于这一步,我将其保留为$url = URL_TOKEN . $url_params;,它似乎一直在工作。感谢您的回复
    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 2012-08-05
    • 2022-11-11
    • 2014-04-15
    • 2013-08-09
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多