Получите информацию о пользователе Yahoo после получения токена доступа OAuth2

#php #authentication #oauth-2.0 #yahoo-api

#php #аутентификация #oauth-2.0 #yahoo-api

Вопрос:

Я пытался реализовать опцию «Войти в систему с помощью Yahoo» на моем PHP-сайте. Я смог сделать первый шаг, который заключается в получении токена доступа, как описано здесь: 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 <access_token> , я также попытался передать токен доступа в качестве параметра в URL, а также в качестве параметра post.

Что бы я ни делал, я просто получаю пустую строку в качестве ответа. Кто-нибудь имел дело с конечной точкой пользовательского API Yahoo?

Это мой код (после получения токена доступа):

 $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_tokenamp;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);
 

** РЕДАКТИРОВАТЬ **

После использования postman я получил правильный запрос, предполагается, что вы должны передать id_token в качестве параметра в URL (они НЕ указывают это в своем руководстве), например:

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

И единственный необходимый заголовок (по крайней мере, в postman):

 Authorization: Bearer <access_token>
 

Однако, несмотря на то, что я получаю пользовательские данные в postman, я все равно получаю только пустую строку в своем php-скрипте. Есть идеи, почему это может происходить?

Комментарии:

1. Отправка GET /openid/v1/userinfo HTTP/1.1 и Host: api.login.yahoo.com в качестве дополнительных заголовков, вероятно, имеет мало смысла. Запрошенный URL-адрес уже был указан через CURLOPT_URL (хотя там вы добавили дополнительную косую черту, не уверен, может ли API быть чувствительным к этому.)

2. Также может иметь смысл сначала протестировать с помощью такого инструмента, как Postman. Сначала правильно определите детали запроса, а затем реализуйте его в PHP. Таким образом, по крайней мере, вам не нужно гадать, связана ли ошибка с данными / strcuture или специфична для кодирования.

3. @CBroe Да. Для меня это тоже не имело смысла, но то, как они показывают это в своем руководстве, выглядит как заголовок, и, поскольку они не очень понятны, я просто попробовал. Кроме того, я смог вернуть пользовательские данные обратно в postman. Однако, несмотря на то, что я исправил запрос в своем скрипте, я все равно получаю пустую строку в качестве ответа. Есть идеи, почему?

4. Это более общий способ показать, как должен выглядеть HTTP-запрос, но это не значит, что вам нужно самостоятельно задавать фактическую строку запроса или заголовок хоста, cURL сделает это, основываясь только на CURLOPT_URL . // Попробуйте и проверьте, есть ли curl_error что сообщить.

5. @CBroe curl_error ничего не показывает. Однако я только что проверил http-код и получил 401, что странно, потому что я получаю 200 с тем же запросом в postman

Ответ №1:

После использования postman я получил правильный запрос, предполагается, что вы должны передать id_token в качестве параметра в URL (они НЕ указывают это в своем руководстве), например:

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

И единственный необходимый заголовок (по крайней мере, в postman):

 Authorization: Bearer <access_token>