2016-07-08 3 views
3

Я пытаюсь создать веб-приложение с простой информационной панелью с данными Google Analytics для учетных записей, которые вошли в систему с Google. Я использую Laravel с пакетом Socialite, и я могу регистрировать пользователей в Google в настоящее время. У меня есть клиентский ключ разработчика и клиентский секрет. Я устанавливал области для Google Analytics только для чтения и автономный доступ, и я хранили имя клиента, адрес электронной почты, идентификатор Google, токен доступа и токен обновления в моей базе данных. Я могу войти в систему без каких-либо проблем.laravel - Аутентификация API Google Analytics

Что я хочу сделать сейчас, просто войдите в профили, которые есть в аккаунте Analytics. Я выполнил примеры документации API API, но не смог заставить его работать. Поскольку я храню токен доступа и токен обновления, я думаю, что должен иметь возможность аутентифицировать текущего пользователя и получать данные Google Analytics, но я не мог найти никаких простых методов из библиотек клиентов и аналитики. Мне нужно будет получить доступ к их данным в Google Analytics в автономном режиме, и поэтому я думаю, что я должен авторизовать свои запросы с токеном доступа и обновлять токен, но я не получаю никаких конкретных данных Analytics из процесса входа в систему. Теперь я полностью потерялся, как мне разрешить мои запросы к API Anayltics? Я использую AdWords API уже более 8 месяцев, и все ясно в документации API AdWords, но я не мог получить что-либо, работая с API Google Analytics.

Это мои пользовательские методы входа:

public function redirectToProvider() 
{ 
    $parameters = ['access_type' => 'offline']; 
    return Socialite::driver('google') 
     ->scopes(['https://www.googleapis.com/auth/analytics.readonly']) 
     ->with($parameters) 
     ->redirect(); 
} 

/** 
* Obtain the user information from Google. 
* 
* @return Response 
*/ 
public function handleProviderCallback() 
{ 
    $outsiderLogin = Socialite::driver('google')->stateless()->user(); 


    $user = User::where('googleID', $outsiderLogin->id)->first(); 

    // Register the user if there is no user with that id. 
    if (!$user) { 
     $user = new User; 
     $user->name   = $outsiderLogin->name; 
     $user->googleID  = $outsiderLogin->id; 
     $user->email  = $outsiderLogin->email; 
     $user->token  = $outsiderLogin->token; 
     $user->refreshToken = $outsiderLogin->refreshToken; 
     $user->save(); 
    } 
    // Log the user in. 
    Auth::login($user); 

    return redirect('/home'); 
} 

Большое спасибо.

ответ

4

Я нашел решение сейчас. Сначала я понял, что мне нужен код, который возвращается с URL-адресом проверки подлинности от Google, и когда я проверяю пакет Socialite, я нашел защищенный метод getCode() в \vendor\laravel\socialite\src\Two\AbstractProvider.php, который возвращает код из URL-адреса. Я отредактировал исходный файл пакета и изменил тип метода с protected на public, что позволило использовать этот метод вне класса, что позволило мне получить доступ к коду из URL-адреса, а затем сохранить его в БД для дальнейшего требования к аутентификации. Но были проблемы с этой настройкой, прежде всего, я должен найти способ сохранить этот пакет без какого-либо обновления, так как любое обновление откатит изменения, внесенные мной в исходный файл. Вторая проблема, с которой я столкнулся, - это то, как я храню токены. По умолчанию API клиента Google возвращает массив, который содержит поля access_token, refresh_token, expires_in, id и created, и с этими полями он аутентифицирует запросы на сервер Analytics.В моем случае не было стандартного массива, возвращающегося из основного процесса входа в систему Socialite. Были переменные access_token, refresh_token и expires, и я сохранил их все в своей базе данных. Это вызвало проблему с библиотекой Google, попросило структурированный массив, и у меня даже не было переменных expires_in и created, поэтому я настраиваю поддельный массив, который сообщает Google обновлять токен с каждым запросом, и это было не очень хорошо Практика.

В конце концов, я не мог понять, как использовать какой-либо пакет онлайн, и я написал свою собственную простую аутентификацию, и я не знаю, есть ли у нее какие-либо уязвимости, но она работает для меня, она также может работать для тех, кто нуждается в этом.

Вот мои маршруты линии:

Route::get('auth/google', [ 
      'as' => 'googleLogin', 
      'uses' => 'Auth\[email protected]' 
]); 
Route::get('auth/google/callback', [ 
      'as' => 'googleLoginCallback', 
      'uses' => 'Auth\[email protected]' 
]); 

И вот AuthController методы:

/** 
* Redirect the user to the Google authentication 
*/ 
public function redirectToProvider() 
{ 
    // Create the client object and set the authorization configuration from JSON file. 
    $client = new Google_Client(); 
    $client->setAuthConfig('/home/vagrant/Analytics/client_secret.json'); 
    $client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/auth/google/callback'); 
    $client->addScope(Google_Service_Analytics::ANALYTICS_READONLY); 
    $client->addScope("email"); 
    $client->addScope("profile"); 
    $client->setAccessType("offline"); 

    $auth_url = $client->createAuthUrl(); 
    return redirect($auth_url); 

} 

/** 
* Obtain the user information from Google. 
* 
* @return redirect to the app. 
*/ 
public function handleProviderCallback() 
{ 
    // Handle authorization flow from the server. 
    if (! isset($_GET['code'])) { 
     return redirect('auth/google'); 
    } else { 

     // Authenticate the client, and get required informations. 
     $client = new Google_Client(); 
     $client->setAuthConfig('/home/vagrant/Analytics/client_secret.json'); 
     $client->authenticate($_GET['code']); 

     // Store the tokens in the session. 
     Session::put('token', $client->getAccessToken()); 

     $service = new Google_Service_Oauth2($client); 
     $userInfo = $service->userinfo->get(); 

     $user = User::where('googleID', $userInfo->id)->first(); 

     // If no match, register the user. 
     if(!$user) { 
      $user = new User; 
      $user->name = $userInfo->name; 
      $user->googleID = $userInfo->id; 
      $user->email = $userInfo->email; 
      $user->refreshToken = $client->getRefreshToken(); 
      $user->code = $_GET['code']; 
      $user->save(); 
     } 

     Auth::login($user); 
     return redirect('/home'); 
    } 

} 

Я поместил в client_secret.json файл, который я скачал с Google API консоли в указанную папку, это может отличаться для вас. Я также модифицировал файл миграции, чтобы соответствовать требуемым segemnts. После этих шагов я могу обращаться с этим пользователем, так как это простой пользователь, зарегистрированный в базовом режиме Laravel.

Теперь я могу запросить, скажем, счета в пользователя аккаунта Google Analytics, как это:

/** 
* @var $client to be authorized by Google. 
*/ 
private $client; 

/** 
* @var $analytics Analytics object to be used. 
*/ 
private $analytics; 

public function __construct() 
{ 
    $this->client = $this->AuthenticateCurrentClient(); 
    $this->analytics = new Google_Service_Analytics($this->client); 
} 

private function AuthenticateCurrentClient(){ 
    $user = Auth::user(); 
    $token = Session::get('token'); 

    // Authenticate the client. 
    $client = new Google_Client(); 
    $client->setAccessToken($token); 
    $client->authenticate($user->code); 
    return $client; 
} 

public function GetAccounts(){ 

    try { 
     $accountsObject = $this->analytics->management_accounts->listManagementAccounts(); 
     $accounts = $accountsObject->getItems(); 

     return $accounts; 

    } catch (apiServiceException $e) { 
     print 'There was an Analytics API service error ' 
      . $e->getCode() . ':' . $e->getMessage(); 

    } catch (apiException $e) { 
     print 'There was a general API error ' 
      . $e->getCode() . ':' . $e->getMessage(); 
    } 

} 

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

2

Вы не действительно, чтобы найти то, что вы ищете, с пакетом Socialite, поставляемым с Laravel (который больше используется для входа в систему, и это о нем).

Однако вы можете найти много пакетов Google Аналитические (наряду со многими другими комплектами Laravel) здесь, которые должны помочь вам сделать API вызовы:

http://packalyst.com/s/google%20analytics

Более конкретно, этот пакет: https://github.com/spatie/laravel-analytics

Это, или запустите свои собственные скрипты Gozle и cURL. Я использую Guzzle, когда мне нужно что-то быстро, без создания полноценного API.

Однако здесь есть интересная статья об использовании Socialite для доступа к данным GA. Но ты совсем ограничен. Если вы создаете панели управления, управляемые пользователем, я бы выбрал отдельный пакет.

https://laracasts.com/discuss/channels/tips/how-i-made-google-analytics-work-with-socialite

+0

Прежде всего, большое спасибо. Я видел большинство этих пакетов, но для этих пакетов требуется идентификатор просмотра Google Analytics, который выглядит как «ga-123456», и я не думаю, что это хороший пользовательский интерфейс. Как пользователь, я хотел бы, чтобы эта веб-страница получала все данные без дополнительных усилий после успешной аутентификации. Здесь все усложняется, мне нужно получить данные из GA, но нет идентификатора вида или ничего не происходит с процессом авторизации, вот где я застрял. У меня есть токены доступа, но ни один из этих пакетов не работает с этими токенами доступа? –

+0

Общение не является вашим ответом. Поэтому вам нужно посмотреть разные варианты. Я использую этот пакет для всех своих сервисов Google API. Но найдите Packalyst и найдите тот, с которым вам больше всего нравится. https://github.com/pulkitjalan/google-apiclient –

+1

Большое спасибо. На данный момент я нашел свой путь с Socialite, и поскольку у меня есть крайний срок для проекта, я думаю, что буду использовать его, как сейчас, до MVP. Я думаю, что я перейду на пакет, который вы используете, он выглядит довольно простым в использовании. Спасибо, ты помог мне разобраться. –

0

Я также пытаюсь сделать то же самое. На данный момент у меня есть аутентификация пользователя на месте с пакетом oAuth 2.0 и Socialite. Мне нужен список сайтов, которые будут выведены из GA. И я полностью застрял там. Было бы здорово, если бы вы могли вести меня как о том, как я должен двигаться дальше ..

+0

Socialite не является ответом на такие процессы аутентификации или API-связи. Вам необходимо обновить исходный код пакета Socialite, что не имеет смысла, поскольку вам нужно будет обновлять свои изменения при каждом обновлении. Socialite - это просто для простых операций входа в систему, где вам просто нужна информация пользователя. Вы проверили мой ответ здесь? Я предоставил код для получения учетных записей. Я не уверен, есть ли прямой способ для загрузки сайтов, но вы можете получить учетные записи GA, а затем Properties, которые содержат URL-адреса для каждого из свойств. –

+0

если вы можете нажать код на Github? – NewBee

+0

Какой код? Весь код здесь, а остальные части кода связаны с бизнесом. Вы можете войти в систему и получить отчет о счетах с помощью этих методов в сообщении. Возможно, я смогу создать суть или что-то еще, когда я найду время, если вы захотите. –

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