在 laravel5.8 中来自 guzzle 的 oauth2 访问密钥请求

Posted

技术标签:

【中文标题】在 laravel5.8 中来自 guzzle 的 oauth2 访问密钥请求【英文标题】:access key request from guzzle for oauth2 in laravel5.8 【发布时间】:2019-10-16 19:19:41 【问题描述】:

我想从 mailchimp oauth2 获取访问令牌,但每次尝试都失败了。在这里我使用了 guzzle,我的实际要求是

卷曲--请求发布\ --url 'https://login.mailchimp.com/oauth2/token' \ --data "grant_type=authorization_code&client_id=client_id&client_secret=client_secret&redirect_uri=encoded_url&code=code" \ --包括

我已经尝试过 curl 和 javascript,但 mailchimp 不接受 javascript 请求 这是我使用的代码:

$http = new Client(['base_uri' => 'https://login.mailchimp.com/oauth2', 
 'defaults' => [
                'exceptions' => false ],
    'header' => [
        'Accept' => 'application/json',
        'Content-Type' => 'application/x-www-form-urlencoded'
    ],
    'verify' => false
    ]);
    $result = $http->request('POST','/token', [
    'form_params' => [
        'grant_type' => 'authorization_code',
        'client_id' => $this->client_id,
        'client_secret' => $this->client_secret,
        'redirect_uri' => $this->redirect_uri,
        'code' => $code,
        ],
    ]);
    $response = $result->send();
    $responseBody = $response->getBody(true);
    var_dump($responseBody);
    die();

预期的实际结果是: "access_token":"5c6ccc561059aa386da9d112215bae55","expires_in":0,"scope":null 但我的错误客户端错误: POST https://login.mailchimp.com/token 导致 404 Not Found 响应:

【问题讨论】:

【参考方案1】:

由于 Guzzle 的工作方式,您使用的是绝对 URI。

首先你设置base_uri:

$http = new Client(['base_uri' => 'https://login.mailchimp.com/oauth2']);

然后提出请求:

$http->request('POST', '/token')

因为您已经添加了前导斜线,Guzzle 会认为它有一个绝对 URI 并点击 https://login.mailchimp.com/token,就像它正在做的那样。我的猜测是希望达到的端点是https://login.mailchimp.com/oauth2/token

可以通过在base_uri 中添加尾部斜杠并在执行请求时删除前导斜杠来解决此问题。

来自文档的信息:http://docs.guzzlephp.org/en/stable/quickstart.html#creating-a-client

遵循 RFC3986

【讨论】:

以上是关于在 laravel5.8 中来自 guzzle 的 oauth2 访问密钥请求的主要内容,如果未能解决你的问题,请参考以下文章

来自 Guzzle 响应的条件未设置

来自 Guzzle 的 PHPUnit 和模拟请求

如何从 guzzle 请求中获取和显示图像

php guzzle [curl] 52 来自服务器的空回复

laravel 客户端 api 与 guzzle

在 Guzzle 中设置代理