【发布时间】:2018-07-17 04:16:57
【问题描述】:
这个问题与其他已经被问过的问题相似,但答案没有帮助,而且我认为缺少一个关键部分。我处于 MailChimp OAuth2 流程的第 4 步,这需要向授权 url (see here) 发送带外帖子。它不断返回错误:invalid_grant,据我所知,它可以指示许多不同的错误。这是我的代码(我使用的是 Yii2)。
// Controller action (authorize)
public function actionMailchimpAuthorize()
{
$redirect_uri = Url::toRoute(['controller/mailchimp-token'], 'https');
$base_uri = 'https://login.mailchimp.com/oauth2/authorize';
$params = '?response_type=code&client_id=' . Model::CLIENT_ID . '&redirect_uri=' . urlencode($redirect_uri);
$authorize_uri = $base_uri . $params;
return $this->render('mailchimpAuthorize', [
'authorize_uri' => $authorize_uri,
]);
}
// Controller action (token)
public function actionMailchimpToken($code=NULL)
{
$redirect_uri = Url::toRoute(['controller/mailchimp-token'], 'https');
$token_uri = 'https://login.mailchimp.com/oauth2/token';
$params = [
'grant_type' => 'authorization_code',
'client_id' => Model::CLIENT_ID,
'client_secret' => Model::CLIENT_SECRET,
'redirect_uri' => urlencode($redirect_uri),
'code' => $code,
];
$user_agent = 'oauth2-draft-v10';
$headers = ['Accept: application/json'];
$res = Utility::post($token_uri, $params, $user_agent, $headers);
var_dump($res);
}
// Utility
public function post($url, $params, $user_agent = NULL, $headers = NULL)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_ENCODING, "");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$post = http_build_query($params);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
isset($user_agent) ? curl_setopt($ch, CURLOPT_USERAGENT, $user_agent) : NULL;
isset($headers) ? curl_setopt($ch, CURLOPT_HTTPHEADER, $headers) : NULL;
$res = curl_exec($ch);
curl_close($ch);
return $res;
}
关于 SO 的答案对重定向 URI 匹配非常重要。但是有三个地方可以输入返回 uri:在注册应用程序时在 Mailchimp 中,在授权 url 和令牌 url 中。这三个都需要精确计算,还是只需要 auth 和 token URI?我尝试了各种组合都无济于事。我的问题可能有所不同,但这是我唯一不清楚的(我认为)。和我之前的许多人一样,我对这个很疯狂。
【问题讨论】:
-
你有没有使用 MailChimp 提供的默认
php库。 -
不,我试过了,但遇到了其他问题。我也试过 Yii 的认证经理。直接编码是最直接的,并且让我走得最远。
-
我在示例库中遇到了这个问题:stackoverflow.com/questions/34645238/…
标签: curl oauth-2.0 yii2 mailchimp