guess icon indicating copy to clipboard operation
guess copied to clipboard

Can't perform authentication with guess-ga

Open slavoroi opened this issue 5 years ago • 11 comments

  1. I created a project in google console.
  2. I created a private key with no restrictions
  3. I opened a google analytics account
  4. I added analytics.js and used angulartics2 for Angular (and the routes recordings worked)
  5. Running :
  plugins: [
    new GuessPlugin({
      debug: true,
      GA: viewId,
      runtime: {
        delegate: false
      },
      routeProvider() {
        return parseRoutes('.');
      }
    })
  ]
};

Can't seem to pass this code in main.js:

 client = google_oauth2_node_1.auth({
                  clientId: clientId,
                  clientSecret: clientSecret,
                  scope: scope
              }).then(function (token) {

Opens a new chrome tab and clicking on my user get's me:

Sign in with Google temporarily disabled for this app This app has not been verified yet by Google in order to use Google Sign In.

Also when trying:

fetch({
  key,
  viewId,
  period: {
    startDate: new Date('2016-1-1'),
    endDate: new Date('2020-3-3')
  }
}).then(g => {
  writeFileSync('data.json', JSON.stringify(g, null, 2));
}).catch((err) => {
  console.log(err);
  throw err;
});

throws Login Required. I tried to give guess js read only permissions by email (mgechev@...) in google analytics but it didn't work.

versions: "guess-parser": "0.4.15", "guess-webpack": "0.4.15", "guess-ga": "0.4.14" Angular 8.2.14

slavoroi avatar Feb 07 '20 12:02 slavoroi

Dont know about the plugin, but for the second case (using fetch), the documentation is out of date.

What you really need is to generate a JWT auth client like so:

import {fetch} from 'guess-ga';
import {JWT} from 'google-auth-library'

import credentials from './credentials.json';

const auth = new JWT(
  credentials.client_email,
  null,
  credentials.private_key,
  ['https://www.googleapis.com/auth/analytics.readonly']
);

fetch({
  auth,
  viewId,
  period: {
    startDate: new Date('2019-10-01'),
    endDate: new Date('2020-2-01')
  }
})

https://github.com/googleapis/google-auth-library-nodejs#json-web-tokens

edit: changed the scope to analytics.readonly

kasperstorgaard avatar Feb 07 '20 13:02 kasperstorgaard

Yeah! you'r right, except the relevant scope is: 'https://www.googleapis.com/auth/analytics.readonly' and not 'https://www.googleapis.com/auth/cloud-platform'. Thanks! The fetch works and the Docs should be updated.

*** The DOCS should also mention opening a new service account in google and giving it a view permission for google analytics api (and exporting it to a json) and connecting this email to google analytics api. The relevant key is not the API key but the key from the JSON which is created from the service account. *** And using guess plugin with guess ga still doens't work.

slavoroi avatar Feb 07 '20 13:02 slavoroi

ah cool, I was getting an issue with that scope too

kasperstorgaard avatar Feb 07 '20 14:02 kasperstorgaard

@kasperstorgaard thanks for pointing this out! Would you have a moment to fix the documentation?

mgechev avatar Feb 08 '20 04:02 mgechev

@mgechev I'll take a stab at it

kasperstorgaard avatar Feb 08 '20 11:02 kasperstorgaard

Any update on the issue of using :

module.exports = {
  plugins: [
    new GuessPlugin({
      debug: true,
      GA: viewId,
      runtime: {
        delegate: false
      },
      routeProvider() {
        return parseRoutes('.');
      }
    })
  ]
};

Screenshot from 2020-02-11 12-21-58

slavoroi avatar Feb 11 '20 10:02 slavoroi

@slavoroi you can check the guide by @kasperstorgaard https://github.com/guess-js/guess/tree/master/packages/guess-ga#ga.

mgechev avatar Feb 11 '20 22:02 mgechev

@slavoroi update, so it turns out the jwt option was not meant for an auth client, just the credentials. (it then creates the JWT client on the inside)

const {GuessPlugin} = require('guess-webpack');
const {parseRoutes} = require('guess-parser');
const credentials = require('./credentials.json');
const viewId = '123456789';

module.exports = {
  plugins: [
    new GuessPlugin({
      debug: true,
      jwt: credentials,
      GA: viewId,
      routeProvider() {
        return parseRoutes('.');
      },
      // not sure what this does, I could make it work without it
      runtime: {
        delegate: false
      }
    })
  ]
};

kasperstorgaard avatar Feb 12 '20 20:02 kasperstorgaard

Yap! it works :) Works amazing. Please update your guess-webpack docs and types.

slavoroi avatar Feb 12 '20 21:02 slavoroi

@slavoroi would you open a PR to update what's missing?

mgechev avatar Feb 16 '20 04:02 mgechev

yap :+1:

slavoroi avatar Feb 16 '20 06:02 slavoroi