【问题标题】:Get Yahoo user info after getting OAuth2 access token获取 OAuth2 访问令牌后获取 Yahoo 用户信息
【发布时间】: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 ,我还尝试将访问令牌作为 url 中的参数传递,也作为发布参数。

无论我做什么,我都会得到一个空字符串作为响应。有人处理过雅虎的用户 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.1Host: 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


【解决方案1】:

使用邮递员后,我得到了正确的请求,你应该在 url 中将 id_token 作为参数传递(他们没有在他们的指南中指定),如下所示:

https://api.login.yahoo.com/openid/v1/userinfo?id_token=<id_token>

唯一需要的标题(至少在邮递员中)是:

Authorization: Bearer <access_token>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-05
    • 2019-06-06
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    • 2019-12-11
    • 2013-07-29
    • 1970-01-01
    相关资源
    最近更新 更多