Я нашел решение на данный момент. Сначала я решил, что мне нужен код, который возвращает URL-адрес аутентификации из Google, и когда я проверял пакет Socialite, я нашел защищенный метод getCode()
в \vendor\laravel\socialite\src\Two\AbstractProvider.php
, который возвращает код из URL-адреса. Я отредактировал исходный файл пакета и изменил тип метода с protected
на public
, что позволило использовать этот метод вне класса, что позволило мне получить доступ к коду из URL-адреса, а затем сохранить его в БД для дальнейшего использования. требования аутентификации. Но были проблемы с этой настройкой, во-первых, я должен найти способ сохранить этот пакет без каких-либо обновлений, так как любое обновление откатит изменения, которые я внес в исходный файл. Вторая проблема, с которой я столкнулся, заключалась в том, как я храню токены. По умолчанию Google Client API возвращает массив, содержащий поля 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\AuthController@redirectToProvider'
]);
Route::get('auth/google/callback', [
'as' => 'googleLoginCallback',
'uses' => 'Auth\AuthController@handleProviderCallback'
]);
А это методы 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 Console, в указанную папку, у вас это может быть иначе. Я также изменил файл миграции, чтобы он соответствовал требуемым сегментам. После этих шагов я могу относиться к этому пользователю как к простому пользователю, который зарегистрировался с помощью базовой аутентификации 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 помогал мне тысячи раз, надеюсь, это поможет кому-то заставить все работать.
person
Burak Karakan
schedule
09.07.2016