【问题标题】:curl in PHP to get access_token OAuth2 return error: "invalid_client"curl 在 PHP 中获取 access_token OAuth2 返回错误:“invalid_client”
【发布时间】:2017-10-16 03:22:34
【问题描述】:

我从 OAuth2 服务器获取 access_token 时遇到问题。我在 PHP 中使用 curl 来获取 access_token,但它失败并返回:

error: "invalid_client",
error_description: "Client authentication failed."

奇怪的是,如果我在命令提示符下使用 curl:

curl -d "client_id=f3d259ddd3ed8ff3843839b&client_secret=4c7f6f8fa93d59c45502c0ae8c4a95b&redirect_uri=http://application.dev/oauth/handle&grant_type=authorization_code&code=rZCQQBXVSQqKi2IRro1gYkSsRhyUcLsNODACjwPw" http://oauth-server.dev/oauth/access_token

成功并返回access_token:

"access_token":"fI7APDRZygrsF1BiegAQCS1yUT8vnm1LgD5bIu2U",
"token_type":"Bearer",
"expires_in":3600

我正在使用 Laravel 5.2,这是我从 OAuth 服务器处理以获取 access_token 的代码:

public function getOAuthHandle(Request $request){
    $url = 'http://oauth-server.dev/oauth/access_token';
    $code = $request->code;
    $client_id = 'f3d259ddd3ed8ff3843839b';
    $client_secret = '4c7f6f8fa93d59c45502c0ae8c4a95b';
    $redirect_uri = 'http://application.dev/oauth/handle';

    $clienttoken_post = array(
                "code" => $code,
                "client_id" => $client_id,
                "client_secret" => $client_secret,
                "redirect_uri" => $redirect_uri,
                "grant_type" => "authorization_code"
            );

            $curl = curl_init($url);

            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post);
            curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
            curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

            $json_response = curl_exec($curl);
            curl_close($curl);

            return $json_response;
}

我已尝试从 Internet 和 stackoverflow 获取另一个脚本并重新启动 Apache 和 PHP,但它仍然无法正常工作。

有什么办法可以解决这个问题吗?我应该检查什么?

感谢您的帮助和回答。

【问题讨论】:

  • 你试过在 curl 头文件中添加grant_type 吗?
  • 没有。我没试过那个。该怎么做?

标签: php laravel curl oauth-2.0 laravel-5.2


【解决方案1】:

尝试在 curl 标头上发送请求。

    $curl = \curl_init();

    \curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 600,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_HTTPHEADER => $clienttoken_post,
        CURLINFO_HEADER_OUT => true,
    ));

    $response = \curl_exec($curl);

要么在标题上发送grant_type,然后将client_secretclient_id 作为帖子发送,或者将它们发送到标题上试试看。顺便说一句。 $request->code 应该在传递给 curl 请求之前检查。所有url, client_secret, client_id 必须在.env 中,并通过config/services 获取。

【讨论】:

  • 我尝试过,但它返回error: MethodNotAllowedHttpException in RouteCollection.php line 218。你是什​​么意思$request->code 应该在通过卷曲之前检查?什么样的检查?然后,我尝试在.env 中设置url, client_secret, client_id,但仍然相同。 config/services 是在 OAuth 服务器中,而不是在客户端服务器中。因为我在客户端服务器上的代码错误不在 OAuth 服务器上。
  • 如果我必须在.env 中设置url, client_secret, client_id 并让它们通过config/services,那么服务的名称是什么?是否由我来命名服务?我如何从服务中访问它们?抱歉我的愚蠢问题,因为我是 OAuth2 的新手。并感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2014-12-25
  • 1970-01-01
  • 2017-04-24
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多