【发布时间】:2021-03-27 04:17:24
【问题描述】:
我一直在尝试在我的 PHP 站点中实现“使用 Yahoo 登录”选项。我能够完成第一步,即获取访问令牌,如下所述:https://developer.yahoo.com/oauth2/guide/flows_authcode/
但我正在努力获取用户数据。对我来说,他们的方向并不完全清楚:https://developer.yahoo.com/oauth2/guide/get-user-inf/Get-User-Info-API.html
我尝试调用 https://api.login.yahoo.com/openid/v1/userinfo 并在标头中传递访问令牌,如下所示: Authorization: Bearer
无论我做什么,我都会得到一个空字符串作为响应。有人处理过雅虎的用户 api 端点吗?
这是我的代码(获取访问令牌后):
$access_token = $res->access_token;
$token_type = $res->token_type;
$expires_in = $res->expires_in;
$refresh_token = $res->refresh_token;
$id_token = $res->id_token;
$host = urlencode("api.login.yahoo.com");
$userbody = "access_token=$access_token&Host=$host";
$userch = curl_init();
curl_setopt($userch, CURLOPT_URL, "https://api.login.yahoo.com/openid/v1/userinfo/");
curl_setopt($userch, CURLINFO_HEADER_OUT, true);
curl_setopt($userch, CURLINFO_HEADER, true);
curl_setopt($userch, CURLOPT_HTTPHEADER, array("GET /openid/v1/userinfo HTTP/1.1",
"Host: api.login.yahoo.com",
"Authorization: Bearer $access_token"));
curl_setopt($userch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($userch,CURLOPT_AUTOREFERER, true);
$user = curl_exec($userch);
curl_close($userch);
var_dump($user);
** 编辑 **
使用邮递员后,我得到了正确的请求,您应该将 id_token 作为 url 中的参数传递(他们没有在他们的指南中指定),如下所示:
https://api.login.yahoo.com/openid/v1/userinfo?id_token=<id_token>
唯一需要的标题(至少在邮递员中)是:
Authorization: Bearer <access_token>
但是,即使我在邮递员中获取了用户数据,我的 php 脚本中仍然只得到一个空字符串。知道为什么会发生这种情况吗?
【问题讨论】:
-
将
GET /openid/v1/userinfo HTTP/1.1和Host: api.login.yahoo.com作为附加标头发送,可能没什么意义。请求的 URL 已经通过 CURLOPT_URL 指定(尽管您在其中包含了一个额外的尾部斜杠,但不确定 API 是否对此敏感。) -
首先使用 Postman 之类的工具进行测试也可能有意义。首先正确获取请求的详细信息,然后在 PHP 中实现它。这样,至少您不必猜测错误是在数据/结构中,还是特定于编码。
-
@CBroe 是的。这对我来说也没有意义,但他们在指南中显示它的方式看起来像一个标题,而且由于他们不是很清楚,我只是尝试了一下。此外,我能够在邮递员中取回用户数据。但是,即使我在脚本中修复了请求,我仍然得到一个空字符串作为响应。知道为什么吗?
-
这是一种更通用的方式来显示 HTTP 请求的外观,但这并不意味着您必须自己设置实际的请求行或主机标头,cURL 会这样做,仅基于 CURLOPT_URL。 // 尝试检查
curl_error是否有任何要报告的内容。 -
@CBroe curl_error 没有显示任何内容。但是我刚刚检查了 http 代码并得到了 401,这很奇怪,因为我在邮递员中得到了具有相同请求的 200
标签: php authentication oauth-2.0 yahoo-api