Page 1 of 2

Google2 Plug In & OAuth & Google Analytics

PostPosted: Fri Apr 24, 2015 6:02 pm
by rafig
Hi,
I am trying to use Patrick’s Google2 plug-in from ServoyForge, but there is no sample solution or much in the way of documentation.
I am actually trying to use it to allow me to access the Google Analytics API’s which require ‘oauth2’, which it looks like this plugin uses.
I think I have set all of the Google stuff up correctly, so I can do the first bit
Code: Select all
   fv_ga_scopes = ['https://www.googleapis.com/auth/analytics'] ;
   
   plugins.Google2.setupApplication('MYAPPNAME', scopes.globals.ga_client_id, scopes.globals.ga_certificate_fingerprint) ;
   
   var _ga_url = plugins.Google2.getAuthorizationUrl(fv_ga_scopes) ;
   
   //sets the relative URL of the HTML_AREA field
   elements.html_area.URL = _ga_url;

where ‘elements.html_area’ is an HTML area I am displaying on a form.
This displays a Google page that seems to want a password entered & has a ‘Sign In’ button.
I enter my Google password and click button, but then nothing happens (& I do not get a token as the Google2 Wiki states)
I have also tried just opening the URL in a web browser using application.showURL, but then get an error page
The redirect URI in the request: urn:ietf:wg:oauth:2.0:oob did not match a registered redirect URI.
Request Details
scope=https://www.googleapis.com/auth/analytics
response_type=code
redirect_uri=urn:ietf:wg:oauth:2.0:oob
client_id=


I am at a loss as to how to proceed, so was wondering, is there a sample solution or some code I can use to get me back the data I need for the token (from Wiki:-)
Once the user logged into his account and granted the requested access, he will be presented with a code (token). That token is then used to authorize your application:

plugins.Google2.authorize(code, userId, scopes)
Please not that the code has a validity, so it will expire rather quickly. The result of the method is the refresh token that you need to store.

so I can use the refresh token to make my GA calls??

Or if anyone else knows how I can get a token to call GA API's??

Thanks

Rafi

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Mon Apr 27, 2015 9:30 am
by patrick
I have never tried this inside a html area. Maybe that simply won't work. I suggest you try that in a real browser.

The login is necessary of course. The process is: you login into your Google account and then grant access to whatever application.

I'm not sure how the plugin can help you with analytics at this point. Once you have the token, how do you want to proceed?

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Mon Apr 27, 2015 3:30 pm
by rafig
Hi Patrick,

patrick wrote:I have never tried this inside a html area. Maybe that simply won't work. I suggest you try that in a real browser.

I am, but I am still getting the error
400. That’s an error.

Error: redirect_uri_mismatch

The redirect URI in the request: urn:ietf:wg:oauth:2.0:oob did not match a registered redirect URI.

Request Details
scope=https://www.googleapis.com/auth/analytics
response_type=code
redirect_uri=urn:ietf:wg:oauth:2.0:oob
client_id=


patrick wrote:The login is necessary of course. The process is: you login into your Google account and then grant access to whatever application.

That is what I am trying to do. Maybe I am using something incorrectly, as the current Google Console for Developers in API section doesn't seem to match exactly what you put in Wiki for ServoyForge plugin
GoogleOAuth_web.jpg
GoogleOAuth_web.jpg (81.46 KiB) Viewed 12503 times

I am using the client ID as detailed, but I have tried my certificate fingerprint and the standard secret as my 'client secret', but it still doesn't help :(
What should I be passing?

patrick wrote:I'm not sure how the plugin can help you with analytics at this point. Once you have the token, how do you want to proceed?

I can request analytics data using a GET URL, but need an Oauth token in it, so wanted to use the token your plugin generates in my call.
I guess I'm just trying to use your plugin as a basic Google OAuth token generator ;-)

Do you have a sample/test Servoy solution file for the Google2 plugin I can work with?

Thanks

Rafi

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Mon Apr 27, 2015 11:33 pm
by Gordon McLean
Hi Patrick/Rafi
Can I Plus 1 on Rafi's request for clarification as I had much the same experience. Brilliant that there is a plugin for this service but not entirely sure the docs match the experience at the Google end. Having said which Google don't help matters by changing the goalposts regularly!!

Gordon

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Thu Apr 30, 2015 3:28 pm
by patrick
I think the documentation on ServoyForge is correct and matches the Google management console.

What you need is a Client ID for an installed application:

step1.png
step1.png (27.9 KiB) Viewed 12438 times


This will give you something like this:

step1a.png
step1a.png (11.88 KiB) Viewed 12438 times

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Thu Apr 30, 2015 3:33 pm
by Gordon McLean
Thanks Patrick, its was the selection of the 'installed app' and 'other' that I had got wrong.

Appreciate the time you took to create the plugin and help here many thanks

Gordon

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Thu Apr 30, 2015 3:34 pm
by patrick
Then you need to enable the analytics or whatever app you want for your application:

step2.png
step2.png (80.46 KiB) Viewed 12437 times


Once done, you can start using the plugins methods. For example:

Code: Select all
function setupAnalytics() {
   plugins.Google2.setupApplication("Google plugin for Servoy", clientID, clientSecret);
   var scopesToGetAccessFor = [plugins.Google2.AUTHENTICATION_SCOPE.DRIVE, "https://www.googleapis.com/auth/analytics.readonly"];
   var url = plugins.Google2.getAuthorizationUrl(scopesToGetAccessFor);
   application.output(url);
}


Note that the plugin does not yet support analytics, so it doesn't offer the scope (you have to figure it out). In the example above, you request access to google Drive and Analytics in read only mode.

The URL created can the be opened in a browser and it will look like this:

step4.png
step4.png (31.95 KiB) Viewed 12437 times


If you as a user allow this, you will see this:

step5.png
step5.png (8.52 KiB) Viewed 12437 times


This is the request token your user has to copy. With that you have to call:

Code: Select all
function authorizeAnalytics() {
   var token = plugins.Google2.authorize("4/PnM4Df_weblqwm4WYS1Hph8i9wjEPeeXmbxj6epjOQg.sv33e8FB5AIfyjz_MlCJoi2Yk_YUmgI",userId,[plugins.Google2.AUTHENTICATION_SCOPE.DRIVE, "https://www.googleapis.com/auth/analytics.readonly"])
   application.output(token);
}


which will output the refresh token that you need to store.

Now you have a token that gives you access to analytics. But what do you do now?

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Thu Apr 30, 2015 6:50 pm
by patrick
What is it that you want from Google analytics? The plugin can, of course, easily be enhanced...

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Thu Apr 30, 2015 10:41 pm
by rafig
Hi Patrick,
firstly, thanks for all the other posts, I will try them out tomorrow and let you know how they went.

patrick wrote:What is it that you want from Google analytics? The plugin can, of course, easily be enhanced...


I want to be able to pick up various values, like how many times a landing page has been hit so that I can then trigger something else, like sending an email...

When I've got my token working, I will maybe post an example of a call I make.

Again, thanks :D

Rafi

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Fri May 01, 2015 3:23 pm
by rafig
Hi Patrick,
I have had a chance to have another go now and thanks to your earlier clarification of how to get client ID, I have now got a Google auth page to display that then gives me an access code.

I can then get a refresh token, but now when I try to send a simple GET URL request, it's not working because I need the 'access_token' that goes along with the refresh token...
patrick wrote:The plugin can, of course, easily be enhanced...

From my perspective, if you could also return for me the 'access_token', then I can put that in the header of my request like this
Code: Select all
var _url = 'https://www.googleapis.com/analytics/v3/data/ga' ;
   _url += '?ids=ga_my_id' ;
   _url += '&start-date=2015-01-01' ;
   _url += '&end-date=2015-04-30' ;
   _url += '&metrics=ga%3Apageviews' ;
   _url += '&dimensions=ga:browser' ;
   _url += '&prettyprint=true' ;

        scopes.globals.ga_header_bearer = 'Bearer ' + scopes.globals.ga_access_token ; // this is the other token returned by your plugin with refresh token
   var client = plugins.http.createNewHttpClient();
   var request = client.createGetRequest(_url);
   request.addHeader('Authorization', scopes.globals.ga_header_bearer) ;
   var response = request.executeRequest(my_gmail_email,my_gmail_pwd);
   var httpCode = response.getStatusCode(); // httpCode 200 is ok"
   fv_pageData = response.getResponseBody();

The above code is just an example of GA data, in this case number of page views by browser, which returns
Code: Select all
--clipped--
"columnHeaders": [
  {
   "name": "ga:browser",
   "columnType": "DIMENSION",
   "dataType": "STRING"
  },
  {
   "name": "ga:pageviews",
   "columnType": "METRIC",
   "dataType": "INTEGER"
  }
],
"totalsForAllResults": {
  "ga:pageviews": "697"
},
"rows": [
  [
   "(not set)",
   "10"
  ],
  [
   "Chrome",
   "539"
  ],
  [
   "Firefox",
   "25"
  ],
  [
   "Internet Explorer",
   "9"
  ],
  [
   "Java",
   "8"
  ],
  [
   "Maxthon",
   "1"
  ],
  [
   "Mozilla",
   "1"
  ],
  [
   "Mozilla Compatible Agent",
   "51"
  ],
  [
   "Opera",
   "4"
  ],
  [
   "Safari",
   "48"
  ],
  [
   "YaBrowser",
   "1"
  ]
]
}


patrick wrote:What is it that you want from Google analytics?

... but for this client, I want the number of conversions/goal for a landing page
If you could make another function in your plugin like
Code: Select all
var myJSONReturnObject = plugins.Google2.getGoogleDataViaURL(_url,refreshToken)

where '_url' is created by me (like sample above) with whatever I need, from wherever I have asked for a scopes for and your function wraps it up properly with the correct tokens and returns the JSON from Google??
And then we could parse the JSON object for the data needed?? :D :D :D

If you can do something like that, your plugin usefulness suddenly explodes :lol:

Thanks

Rafi

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Fri May 01, 2015 4:08 pm
by patrick
Makes sense. I have added a method getAccessToken(refreshToken) that returns the access token you need to access any authorized API. With that you can send your request. (see https://www.servoyforge.net/news/490)

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Fri May 01, 2015 5:30 pm
by rafig
Hi Patrick,

patrick wrote:Makes sense. I have added a method getAccessToken(refreshToken) that returns the access token you need to access any authorized API. With that you can send your request. (see https://www.servoyforge.net/news/490)


WOW!!
You are amazing!
That works great, thank you! :D

What is the time frame validity for the access token? Is it the default 1 hour?

Whatever that time frame is, do I then just need to call 'getAccessToken(refreshToken)' again after that time to get a new access token?
Is the refresh token valid until I revoke it, so that my client can do a one off launch of system that goes to browser for access code and once that's been put in to the solution & I get a refresh token, I can just store that for however long and re-use as with getAccessToken(refreshToken) ??

Thanks

Rafi

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Fri May 01, 2015 7:10 pm
by patrick
You simply store the refresh token and get your access token per session. Not sure how long that is valid, but you can get a new one any time. The refresh token should be valid until revoked.

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Fri May 01, 2015 7:42 pm
by rafig
patrick wrote:You simply store the refresh token and get your access token per session. Not sure how long that is valid, but you can get a new one any time. The refresh token should be valid until revoked.

Fantastic!
Thanks

Re: Google2 Plug In & OAuth & Google Analytics

PostPosted: Fri May 22, 2015 6:20 pm
by rafig
Hi Patrick,
patrick wrote:You simply store the refresh token and get your access token per session. Not sure how long that is valid, but you can get a new one any time. The refresh token should be valid until revoked.

this all seems to be working in Smart Client (although I'm not 100% sure if I am 'refreshing' my token correctly as sometimes I have to get a new access code...
However, if I try and do everything in Web Client, when I try
Code: Select all
         ga_access_token = plugins.Google2.getAccessToken(ga_refresh_token);

I am getting a
Wrapped java.lang.NullPointerException

error :(
I was hoping that I might be able get this all running in web client (WC) and actually, at some point, the call to GA [& the call to get access token] will be happening in headless client (HC).
Will it run in HC??
I can probably cope while testing with it not working in WC, but maybe it is pointing to some other issue...??

Thanks
Rafi