Jon*_*ers 5 php oauth-2.0 etsy
我试图在一张截图中讲述整个故事,所以请在继续阅读之前先看一下它。在我告诉你问题是什么之前,你可能已经注意到了这个问题。
(这是实时生产代码,但所有敏感信息都以亮紫色进行了编辑。我是我自己的客户,所以这是我要分享的信息,但如果我不小心分享了一些不应该分享的内容,请告诉我。)
我正在尝试获取 Etsy API 的访问令牌。有关如何执行此操作的文档可以在此处找到:https ://developer.etsy.com/documentation/essentials/authentication/
注意:这全部适用于 API v3,而不是 v2。以前的版本有很多文档,但没有一个适用于这里。
我以前获得过一次访问令牌,但那是很久以前的事了。我不知道我的登录方式是否与上次不同,或者 API 自上次以来是否发生了变化。我上次成功登录是使用 Postman,但那是很久以前的事了。我相当有信心进行的调用应该与上次使用 Postman 完全相同的调用也得到了下面描述的完全相同的错误。(尽管我不排除我忘记保存工作呼叫的可能性,也许我最近找到并尝试的呼叫从未工作过。)
左侧的代码运行(在实时网站之外),如右侧所示。此屏幕截图是在单击“登录”按钮后拍摄的。这次,电子邮件地址和密码都是空白,但无论在两个框中输入什么内容,都会出现相同的错误。
“发生了错误。请再试一次!” 仅在单击后出现。
我知道我需要能够登录才能授予自己访问令牌,因为我以前做过一次,但是这次我无法登录。我做错了什么?
该代码又是:
<?php
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://www.etsy.com/oauth/connect?response_type=code&client_id=/*redacted*/&scope=address_r%2520address_w%2520billing_r%2520cart_r%2520cart_w%2520email_r%2520favorites_r%2520favorites_w%2520feedback_r%2520listings_d%2520listings_r%2520listings_w%2520profile_r%2520profile_w%2520recommend_r%2520recommend_w%2520shops_r%2520shops_w%2520transactions_r%2520transactions_w' . '&code_challenge=DSWlW2Abh-cf8CeLL8-g3hQ2WQyYdKyiu83u_s7nRhI&code_challenge_method=S256',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_HTTPHEADER => array(
'Cookie: /*redacted*/'
),
));
$response = curl_exec($curl);
curl_close($curl);
echo $response;
Run Code Online (Sandbox Code Playgroud)
我自己解决了这个问题,尽管回想起来这感觉像是一个愚蠢的问题(不是吗?)这是它应得的答案:
这一切都源于对文档的根本误解。它说:
要开始流程,请使用包含以下 URL 参数的 GET 请求将用户引导至https://www.etsy.com/oauth/connect :
我对这句话的误读是:
要开始流程,请对https://www.etsy.com/oauth/connect执行 GET 请求,其中包括以下 URL 参数,然后将用户定向到响应正文中的 URL。
如果您已经可以看到这两个句子是完全不同的指令,那么您已经确切地知道我做错了什么。
需要理解的关键一点是,访问网站是一个 GET 请求。推而广之,访问带 URL 参数的网站(例如https://www.example.com?parameter1=value1¶meter2=value2)就是带参数的 GET 请求。
因此,通过带参数的 GET 请求将用户定向到网站只是将参数写入 URL 路径。它并不意味着在服务器端执行请求并尝试在响应中查找 URL 路径。