Php laravel-谷歌分析API认证

Php laravel-谷歌分析API认证,php,api,laravel,google-analytics,laravel-socialite,Php,Api,Laravel,Google Analytics,Laravel Socialite,我正在尝试创建一个带有简单仪表板的web应用程序,其中包含登录Google的帐户的分析数据。我正在使用社交名媛软件包Laravel,目前我可以让用户登录谷歌。我有我的开发者客户端密钥和客户端密码。我为分析设置只读和脱机访问范围,并在数据库中存储客户姓名、电子邮件、谷歌ID、访问令牌和刷新令牌。我可以登录用户没有任何问题 我现在想做的是,只需访问分析帐户当前拥有的配置文件。我遵循了AnalyticsAPI文档示例,但无法使其正常工作。由于我存储了一个访问令牌和一个刷新令牌,我认为我应该能够验证当前

我正在尝试创建一个带有简单仪表板的web应用程序,其中包含登录Google的帐户的分析数据。我正在使用社交名媛软件包Laravel,目前我可以让用户登录谷歌。我有我的开发者客户端密钥和客户端密码。我为分析设置只读和脱机访问范围,并在数据库中存储客户姓名、电子邮件、谷歌ID、访问令牌和刷新令牌。我可以登录用户没有任何问题

我现在想做的是,只需访问分析帐户当前拥有的配置文件。我遵循了AnalyticsAPI文档示例,但无法使其正常工作。由于我存储了一个访问令牌和一个刷新令牌,我认为我应该能够验证当前用户并获取他们的分析数据,但我无法从客户端和分析库中找到任何简单的方法。我需要离线访问他们的分析数据,这就是为什么我认为我应该能够使用访问令牌和刷新令牌来授权我的请求,但我没有从用户登录过程中获得任何特定于分析的数据。我现在完全迷路了,如何将我的请求授权给Anayltics API?我已经使用AdWords API超过8个月了,AdWords API文档中的所有内容都非常清晰,但我无法使用Analytics API

以下是我的用户登录方法:

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');
}
非常感谢。

Laravel附带的社交名媛套餐(更多用于登录,仅此而已)不会让你真正找到你想要的东西

但是,您可以在这里找到许多Google分析包(以及许多其他Laravel捆绑包),它们应该可以帮助您进行API调用:

更具体地说,这个包:

或者运行自己的Guzzle和cURL脚本。当我需要一些快速的东西而不构建完整的API时,我会使用Guzzle

然而,这里有一篇关于使用社交名媛访问GA数据的有趣帖子。但是你很有限。如果您要创建用户驱动的仪表板,我会选择一个单独的软件包


我现在已经找到了解决办法。起初,我认为我需要从Google返回带有身份验证URL的代码,当我检查Socialite包时,我在
\vendor\laravel\Socialite\src\Two\AbstractProvider.php
中找到了一个受保护的方法
getCode()
,它从URL返回代码。我编辑了包的源文件,并将方法类型从
protected
更改为
public
,这样就可以在类外使用该方法,从而允许我从URL访问代码,然后将其存储在DB中以满足进一步的身份验证要求。但是这个设置有一些问题,首先,我应该找到一种不进行任何更新就保存该包的方法,因为任何更新都会回滚我对源文件所做的更改。我面临的第二个问题是存储代币的方式。默认情况下,Google客户端API返回一个数组,其中包含字段
access\u token
refresh\u token
expires\u in
id
created
,并使用这些字段验证对Analytics server的请求。在我的场景中,基本社交名流登录过程没有返回标准数组。有
access\u-token
refresh\u-token
expires
变量,我也将它们全部存储在数据库中。这导致Google library出现问题,它要求使用结构化数组,而我甚至没有在和中创建变量
expires\u,这就是为什么我设置了一个假数组,告诉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');
    }

}
我已将从Google API控制台下载的
client\u secret.json
文件放入指定的文件夹中,这对您可能有所不同。我还修改了迁移文件以匹配所需的分段。在这些步骤之后,我可以将该用户视为注册了基本Laravel auth的简单用户

现在,我可以像这样查询用户的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();
    }

}

有数千次堆栈溢出对我有帮助,我希望这能帮助别人工作。

我也在尝试做同样的事情。到目前为止,我已经使用oAuth 2.0和社交名媛软件包实现了用户身份验证。我需要的网站名单要从GA。我完全卡在那里。如果您能指导我如何继续前进,那就太好了。

首先,非常感谢您。我已经看过这些软件包中的大多数,但是这些软件包似乎需要一个谷歌分析视图ID,看起来像是
ga-123456
,我认为这不是一个好的用户体验。作为一个用户,我希望在成功的身份验证后,无需我额外的努力就可以让该网页获取所有数据。这就是事情变得复杂的地方,我需要从GA获取数据,但没有视图ID或授权过程中没有任何内容,这就是我陷入困境的地方。我有访问令牌,但这些包都不能使用访问令牌?社交名流不是你的答案。所以你需要考虑不同的选择。我所有的谷歌API服务都使用这个软件包。但是搜索Packalyst并找到一个你最喜欢的。非常感谢你。现在我已经找到了社交名媛的方式,因为我有一个项目的最后期限,我想我会一直使用它,直到MVP。我想我会迁移到您使用的包,它是