1

让我首先感谢您抽出宝贵的时间。我是新手,所以如果您需要更多信息,请告诉我。

所以我试图在 Laravel 中设置一个 OAUTH2 客户端来连接到CLIO提供的 API 。我正在使用PHPLeague 的 OAuth2 客户端库,它使用GUZZLE来处理 HTTP。

我能够将客户端设置为重定向到 Clio 的授权页面,授权访问,重定向到我的应用程序并接收授权码。

在我需要发送请求以获取访问令牌的下一步中,出现问题!

这是我收到的错误:

类型错误:传递给 League\OAuth2\Client\Provider\AbstractProvider::prepareAccessTokenResponse() 的参数 1 必须是数组类型,给定字符串,在 /Users/patrick/Sites/ssacorp/vendor/league/oauth2-client/ 中调用第565行的 src/Provider/AbstractProvider.php


现在,为了追踪它,我知道调用了以下方法来开始获取访问令牌:

public function getAccessToken($grant, array $options = [])
{
    $grant = $this->verifyGrant($grant);
    $params = [
        'client_id'     => $this->clientId,
        'client_secret' => $this->clientSecret,
        'redirect_uri'  => $this->redirectUri,
    ];
    $params   = $grant->prepareRequestParameters($params, $options);
    $request  = $this->getAccessTokenRequest($params);
    $response = $this->getParsedResponse($request);
    $prepared = $this->prepareAccessTokenResponse($response);
    $token    = $this->createAccessToken($prepared, $grant);
    return $token;
}

我丢弃了这些属性,我得到:

$参数

array(5) { ["client_id"]=> string(40) "*************************************" ["client_secret"]=> string(40) "************************************" ["redirect_uri"]=> string(26) "http://app.ssadv.org/oauth" ["grant_type"]=> string(18) "authorization_code" ["code"]=> string(20) "******************" }

所以这里的一切似乎都很正常。我当然不会分享这些凭据。

$请求

object(GuzzleHttp\Psr7\Request)#179 (7) { ["method":"GuzzleHttp\Psr7\Request":private]=> string(4) "POST" ["requestTarget":"GuzzleHttp\Psr7\Request":private]=> NULL ["uri":"GuzzleHttp\Psr7\Request":private]=> object(GuzzleHttp\Psr7\Uri)#181 (7) { ["scheme":"GuzzleHttp\Psr7\Uri":private]=> string(4) "http" ["userInfo":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" ["host":"GuzzleHttp\Psr7\Uri":private]=> string(12) "app.clio.com" ["port":"GuzzleHttp\Psr7\Uri":private]=> NULL ["path":"GuzzleHttp\Psr7\Uri":private]=> string(12) "/oauth/token" ["query":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" ["fragment":"GuzzleHttp\Psr7\Uri":private]=> string(0) "" } ["headers":"GuzzleHttp\Psr7\Request":private]=> array(2) { ["Host"]=> array(1) { [0]=> string(12) "app.clio.com" } ["content-type"]=> array(1) { [0]=> string(33) "application/x-www-form-urlencoded" } } ["headerNames":"GuzzleHttp\Psr7\Request":private]=> array(2) { ["content-type"]=> string(12) "content-type" ["host"]=> string(4) "Host" } ["protocol":"GuzzleHttp\Psr7\Request":private]=> string(3) "1.1" ["stream":"GuzzleHttp\Psr7\Request":private]=> object(GuzzleHttp\Psr7\Stream)#183 (7) { ["stream":"GuzzleHttp\Psr7\Stream":private]=> resource(262) of type (stream) ["size":"GuzzleHttp\Psr7\Stream":private]=> NULL ["seekable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["readable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["writable":"GuzzleHttp\Psr7\Stream":private]=> bool(true) ["uri":"GuzzleHttp\Psr7\Stream":private]=> string(10) "php://temp" ["customMetadata":"GuzzleHttp\Psr7\Stream":private]=> array(0) { } } } inside Transfer

$响应

这实际上是进入方法 prepareAccessTokenResponse() 的字符串,该方法应该是一个数组并导致主要错误。转储它表明它实际上是 CLIO 的 404 HTML 页面:

!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"\n
       "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n
\n
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">\n
\n
<head>\n
  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />\n
  <title>The page you were looking for doesn't exist (404)</title>\n
</head>\n
\n
<body>\n
  <!-- This file lives in public/404.html -->\n
\n
  <div class="dialog">\n
    <h1>The page you were looking for doesn't exist.</h1>\n
    <p>You may have mistyped the address or the page may have moved.</p>\n
  </div>\n
</body>\n
\n
</html>


我已经在 Postman 中测试了链接和参数,并确认访问令牌实际上是使用我的 $params 中的相同 URI 和信息返回的。当我的 URI 正确并且 $request 说它必须使用 POST 方法时,为什么我会得到 404。不过,为了确认这一点,我尝试使用 Chrome 的 Dev Tools Network 工具,但无法找到对该链接的 POST 调用。我还应该如何解决这个问题以确保 Guzzle 将正确的数据发送到正确的地址?

4

2 回答 2

0

我对 Curl 有同样的问题,我不得不CURLOPT_SSL_VERIFYPEER, false);

于 2017-11-20T21:26:08.927 回答
0

似乎问题是我必须使用 https 与 http 来通过 POST 请求。令牌授予。问题已解决。

于 2017-02-17T23:21:22.410 回答