2017-01-20 2 views
1

Я использую Google OAuth 2.0 для своего веб-приложения на стороне сервера с помощью PHP 5.4.45 и PHP API для клиентов API API версии 2.1.1.Отсутствует информация из токена идентификатора идентификатора Google в PHP

Я могу успешно обменять authorization code с refresh_token, access_token и id_token, я могу правильно проверить id_token и извлечь данные пользователя от него, но некоторая информация отсутствует.

Я просил profile и email областей, которые, как получить правильно отображаются на экране согласия и настройке приложений пользователя, но, в то время как электронная почта доступна, все претензии, связанные с profile сферами отсутствуют в id_token (имя , картинка и т. д.).

Я пробовал с разными пользователями, и проблема не устранена.

Это код, я использую (только для целей тестирования):

require_once 'php/libs/google_api_client_library/vendor/autoload.php'; 

if(!isset($_GET['code'])){ 
    die("code parameter not set"); 

}else{ 
    //exchange 'code' with access token, refresh token and id token 
    $data = array(
     'code' => $_GET['code'], 
     'client_id' => $MY_CLIENT_ID, 
     'client_secret' => $MY_CLIENT_SECRET, 
     'redirect_uri' => 'https://www.mywebsite.com/oauth2callback.php', 
     'grant_type' => 'authorization_code' 
    ); 
    $options = array(
     'http' => array(
      'header' => "Content-type: application/x-www-form-urlencoded\r\n", 
      'method' => 'POST', 
      'content' => http_build_query($data) 
     ) 
    ); 
    $response = file_get_contents('https://accounts.google.com/o/oauth2/token', false, stream_context_create($options)); 

    if($response){ 
     $tokens = json_decode($response); 

     $client = new Google_Client(); 

     //validate idToken and get user info 
     $idtoken = $client->verifyIdToken($tokens->id_token); 

     echo "<h1>ID_TOKEN</h1>"; 
     var_dump($idtoken); 
    } 
} 

самое странное в том, что он имел обыкновение работать правильно, прежде чем, а потом вдруг стал вести себя так, и я дон Не забудьте внести какие-либо изменения в этот код.

Я также заметил, что это происходит только на стороне сервера, с PHP, потому что все хорошо с клиентской библиотекой JavaScript API.

Любые идеи, почему это происходит?

Сообщите мне, если вам нужна дополнительная информация и спасибо заранее!

+0

Что вы пробовали? –

+0

Я пробовал использовать разные учетные записи Google как в режиме онлайн, так и в автономном режиме «access_type», но ничего не изменилось. Я также пытался включить 'fetch_basic_profile = true' в строку запроса и' openid' в 'scopes', потому что я видел это в некоторых примерах, но не повезло. Я также проверил, что данные, извлеченные из id_token с помощью библиотеки PHP, совпадают с данными, возвращаемыми конечной точкой tokeninfo Google. –

ответ

0

Я не знаю, что именно была проблема, но с помощью некоторых примеров, которые я нашел в Интернете, я использовал Google_Service_Oauth2 класс и отредактирован мой код выглядит следующим образом:

require_once 'php/libs/google_api_client_library/vendor/autoload.php'; 

if(!isset($_GET['code'])){ 
    die("code parameter not set"); 

}else{ 
    $client = new Google_Client(); 
    $client->setClientId($MY_CLIENT_ID); 
    $client->setClientSecret($MY_CLIENT_SECRET); 
    $client->setApplicationName('MyApplicationName'); 
    $client->setRedirectUri('https://www.mywebsite.com/oauth2callback.php'); 
    $oauth = new Google_Service_Oauth2($client); 

    $client->authenticate($_GET['code']); //exchange 'code' with access token, refresh token and id token 

    $accessToken = $client->getAccessToken(); 

    $userData = $oauth->userinfo->get(); //get user info 

    echo "<h1>USER DATA</h1>"; 
    var_dump($userData); 
} 

и теперь все работает просто хорошо!

Смежные вопросы