如何为客户端设置 google 分析 api?

How to setup google analytics api for client?

我对 google 登录和 google 分析还很陌生。我正在创建一个项目,用户(客户端)可以使用 google 登录并允许我访问他的 google 分析帐户。然后我会根据分析数据给他看一些图表。

到目前为止,我只为我的帐户完成了此操作。我在 google 控制台上创建了一个新帐户,下载了 cred.json 文件,在我的 google 分析仪表板上授予该帐户权限,现在我正在使用来自 npm 的 @google-analytics/data 库获取数据并发送给前端。

我想要的是用户只需在客户端登录,让我访问他的分析(当 google 登录提示出现时),然后我将使用该访问权限令牌在后端进行 API 调用,然后将他的数据发送给他。

我尝试使用谷歌搜索,但找不到任何相关结果。我知道这样的东西已经存在,因为我看到网站使用它。所以请指导我如何实现它。 我正在使用 MERN Stack。

I am creating a project where the user (client-side) can sign in with google and give permission to me to access his google analytics account.

您混淆了条款,登录就是登录,您想要的是用户授予您的应用程序访问其数据的权限,这是 Oauth2。

Then I will show him some charts and graphs based on the analytics data.

请记住,从 api 返回的数据是 Json 的形式,如果您想向它们显示字符和图形,则需要自己创建这些。

So far I have done this for my account only. I created a new account on google console, downloaded the cred.json file give permission to that account on my google analytics dashboard.

cred.json 文件仅使您的应用程序能够让用户同意访问您的应用程序。它未链接到任何 google 分析帐户。用户仍需要授予您的应用程序访问其数据的权限。

What I want is for the user can just sign-in on the client-side, give me access to his analytics (when the google sign in prompt comes), and then I will use that access token to make API call on the backend and then send him his data.

这称为 Oauth2,用户同意您访问他们的数据。

Node.js 没有带有 google 分析 api 的官方示例。 几年前我创建了一个教程,可以帮助您入门。 Google analytics Node.js

const fs = require('fs');
const readline = require('readline');
const {google} = require('googleapis');
const dotenv = require('dotenv');
dotenv.config();
const CRED_FILE_PATH = process.env.API_CREDS;
console.log(`Your cred path is ${CRED_FILE_PATH}`); // ../creds.json
const VIEW_ID = process.env.VIEW_ID;
console.log(`Your view id is ${VIEW_ID}`);

// If modifying these scopes, delete token.json.
const SCOPES = ['https://www.googleapis.com/auth/analytics.readonly'];
// The file token.json stores the user's access and refresh tokens, and is
// created automatically when the authorization flow completes for the first
// time.
const TOKEN_PATH = 'token.json';

// Load client secrets from a local file.
fs.readFile(CRED_FILE_PATH, (err, content) => {
    if (err) return console.log('Error loading client secret file:', err);
    // Authorize a client with credentials, then call the Google Drive API.
    authorize(JSON.parse(content), getUserReport);
});

/**
 * Create an OAuth2 client with the given credentials, and then execute the
 * given callback function.
 * @param {Object} credentials The authorization client credentials.
 * @param {function} callback The callback to call with the authorized client.
 */
function authorize(credentials, callback) {
    const {client_secret, client_id, redirect_uris} = credentials.installed;
    const oAuth2Client = new google.auth.OAuth2(
        client_id, client_secret, redirect_uris[0]);

    // Check if we have previously stored a token.
    fs.readFile(TOKEN_PATH, (err, token) => {
        if (err) return getAccessToken(oAuth2Client, callback);
        oAuth2Client.setCredentials(JSON.parse(token));
        callback(oAuth2Client);
    });
}

/**
 * Get and store new token after prompting for user authorization, and then
 * execute the given callback with the authorized OAuth2 client.
 * @param {google.auth.OAuth2} oAuth2Client The OAuth2 client to get token for.
 * @param {getEventsCallback} callback The callback for the authorized client.
 */
function getAccessToken(oAuth2Client, callback) {
    const authUrl = oAuth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES,
    });
    console.log('Authorize this app by visiting this url:', authUrl);
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
    });
    rl.question('Enter the code from that page here: ', (code) => {
        rl.close();
        oAuth2Client.getToken(code, (err, token) => {
            if (err) return console.error('Error retrieving access token', err);
            oAuth2Client.setCredentials(token);
            // Store the token to disk for later program executions
            fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
                if (err) return console.error(err);
                console.log('Token stored to', TOKEN_PATH);
            });
            callback(oAuth2Client);
        });
    });
}

/**
 * Number of users between last week and two weeks ago.
 * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
 */
function getUserReport(auth) {
    const service = google.analyticsreporting({version: 'v4', auth});
    const googleAnalyticsReports = {
        resource: {
            reportRequests: [{
                viewId: VIEW_ID,
                dateRanges: [
                    {
                        startDate: '14daysAgo',
                        endDate: '7daysAgo'
                    }
                ],
                metrics: [
                    {
                        expression: 'ga:users'
                    }
                ]
            }]
        }
    };

    service.reports.batchGet(googleAnalyticsReports, (err, res) => {
        if (err) return console.log('The API returned an error: ' + err);
        const reports = res.data.reports;
        if (reports.length) {
            console.log('Reports:');
            reports.forEach(report => {
                console.log('\tMetrics:');
                report.columnHeader.metricHeader.metricHeaderEntries.forEach(metricHeader => console.log('\t\t', metricHeader.name))
                report.data.rows.forEach(row => console.log('\t\t', row.metrics))
                }
            );

        } else {
            console.log('No data found.');
        }
    });
}