#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>