2017-02-07 22 views
3

Я делал это аутентификации Google учебник, чтобы лучше понять, как использовать Google для входа в аккаунт апи и я недавно получил эту ошибку:Фатальная ошибка: Вызов функции-члена GetAttributes() на массиве

Fatal error: Call to a member function getAttributes() on array. 

It происходит всякий раз, когда я пытаюсь:

$this->client->verifyIdToken()->getAttributes(); 

в функции getPayload(). Я не знаю, почему это происходит. Моя конфигурация - Windows 10, и я использую WAMP-сервер для запуска этого приложения. Любая помощь будет оценена по достоинству.

<?php class GoogleAuth { 
private $db; 
private $client; 
public function __construct(Google_Client $googleClient) 
{ 
    $this->client = $googleClient; 
    $this->client->setClientId('234sfsdfasdfasdf3223jgfhjghsdsdfge3.apps.googleusercontent.com'); 
    $this->client->setClientSecret('fD5g4-B6e5dCDGASefsd-'); 
    $this->client->setRedirectUri('http://localhost:9080/GoogleSigninTutorial/index.php'); 
    $this->client->setScopes('email'); 
} 

public function checkToken() 
{ 
    if(isset($_SESSION['access_token']) && !empty($_SESSION['access_token'])) 
    { 
    $this->client->setAccessToken($_SESSION['access_token']); 
    } 
    else 
    { 
    return $this->client->createAuthUrl(); 
    } 
    return ''; 
} 

public function login() 
{ 
    if(isset($_GET['code'])) 
    { 
    $this->client->authenticate($_GET['code']); 
    $_SESSION['access_token'] = $this->client->getAccessToken(); 
    return true; 
    } 
    return false; 
} 

public function logout() 
{ 
    unset($_SESSION['access_token']); 
} 

public function getPayload() 
{ 
    return $this->client->verifyIdToken()->getAttributes(); 
} 
} 
?> 

ответ

5

У меня была та же проблема. Из того, что я, кажется, понял,

$attributes = $this->client->verifyIdToken()->getAttributes(); 

является устаревшим способом получить доступ к массиву должна возвращать информацию учетной записи Google (т.е. после выполнения этой строки, $ атрибуты, как ожидается, будет массив со всеми информация учетной записи Google, соответствующий маркер.)

Попробуйте вместо

$this->client->verifyIdToken(); 

кажется, что в последнем апи (до сих пор), эта линия сама по себе возвращает массив с ожидаемой информации (это почему u получите ошибку при добавлении ->getAttributes(), потому что эта функция недействительна при вызове в массиве.) Так просто запустите эту строку выше, чтобы сгенерировать массив, и поместите его в эхо, если хотите увидеть значения, например

echo '<pre>', print_r($attributes), '</pre>'; 

Если вы не видите какой-либо массив отображается, может быть, что у вас есть header('Location: url') где-то, что перенаправление на другой URL-адрес сразу после выполнения этого эхо-сигнал, таким образом, он никогда не показывает. (Или die)

Вы можете также непосредственно получить доступ к конкретным атрибутам, таким как email, name, given_name, family_name делая

$this->client->verifyIdToken()['email']; 
$this->client->verifyIdToken()['name']; 
//so on 

Надеется, что это может помочь.

+1

Спасибо !!! Спасло меня! Только одно: при настройке областей укажите, что вы хотите ... проверьте здесь ... http: //stackoverflow.com/questions/14007560/get-userinfo-from-google-oauth-2-0-php-api – Albeis

+0

Хорошая точка Альбис! Кроме того, вы можете найти все области здесь https://developers.google.com/identity/protocols/googlescopes Просто используйте Ctrl + F (Cmd + F), чтобы найти конкретное ключевое слово в области, в которой вы нуждаетесь, если вы не уверен, что это называется. – user