Google API via API key ipv oauth2.0

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Moffin
  • Registratie: Augustus 2003
  • Laatst online: 12-05 15:48
Voor het gebruik van de google API: https://analyticsreportin...om/v4/userActivity:search
heb ik een postman project aangemaakt waarmee ik via oauth 2.0 gegevens op kan halen.
Dit werkt goed.
Probleem
Nu zou ik graag dagelijks deze gegevens met een ETL tool naar een database willen schrijven. Het oauth 2.0 principe via postman geeft een pop-up waarmee ik me 'tijdelijk' kan autoriseren, dit is voor mijn dagelijkse job dus niet toepasbaar.
Van de leverancier van de ETL tool heb ik begrepen dat ik het api request via een service account kan doen. Echter krijg ik dit niet voor elkaar.
Mijn vraag
Nu wil ik uitwijken naar het toepassen van een API key, echter krijg ik bij een aanroep via postman een error.

Endpoint:
https://analyticsreportin...arch?key="mijnprivatekey"

Raw body
code:
1
2
3
4
5
6
7
8
9
10
11
{
    "viewId": "23423423432",
    "user": {
        "type": "CLIENT_ID",
        "userId": "234234324.23423432"
    },
    "dateRange": {
        "startDate": "2021-01-01",
        "endDate": "2021-12-31",
    }
}

* id's heb ik maar wat ingetikt om anoniem te maken.

Error:
code:
1
2
3
4
5
6
7
{
    "error": {
        "code": 401,
        "message": "Request is missing required authentication credential. Expected OAuth 2 access token, login cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.",
        "status": "UNAUTHENTICATED"
    }
}


Zoals ik het nu zie zouden alle drie de methode op de API die ik wil aanroepen mogelijk moeten zijn omdat het authenticatie proces voor de API plaatsvindt. Of zie ik dit verkeerd? Maar toch krijg ik een error waarin verwezen wordt naar OAuth 2.
Relevante software en hardware die ik gebruik
  • Postman
  • Google API
  • Google Cloud Platform (APIs and services)
Wat ik al gevonden of geprobeerd heb
Documentatie api
https://developers.google...st/v4/userActivity/search
Klik je op search links, kan je 'try this api' (rechts) de api gebruiken. Met mijn request body kan ik via google OAuth 2.0 een juiste respons krijgen. Vink ik google OAuth 2.0 uit, is met geen mogelijkheid via de nog aangevinkte API key gegevens terugkrijgen. Door deze optie verwacht ik wel dat het mogelijk moet zijn.
API keywaarde:
https://cloud.google.com/docs/authentication/api-keys?

Goed om te vermelden ik nog niet zo veel ervaring hebben met het aanroepen van API's en wellicht daarom wat noob-vragen / terminologien door elkaar haal. Excuses.

p.s. ik ben er al 3 dagen mee bezig, maar blijf vanwege mijn kennis gebruik in cirkeltjes dezelfde bronnen tegen komen. Uiteindelijke lijkt de enige optie een Oauth service account. Maar log ik in op het google cloud platform en dan ga naar API,s en services kom ik drie methoden tegen.
  • API keys
  • OAuth 2.0 client IDs
  • Service accounts

[ Voor 6% gewijzigd door Moffin op 14-07-2021 20:32 ]

[ pvoutput | 5760 wp @ O 45° - Z 10° - W 45°]

Alle reacties


Acties:
  • 0 Henk 'm!

  • itons
  • Registratie: Oktober 2003
  • Niet online
Stuur je letterlijk
code:
1
?key=“mijnprivatekey”
? Probeer eens zonder quotes in dat geval

Acties:
  • 0 Henk 'm!

  • Moffin
  • Registratie: Augustus 2003
  • Laatst online: 12-05 15:48
ik stuur hier

code:
1
?key=AIzaSy..............

* maar dan uiteraard e volledige code

Dus de key die overeenkomt met de key uit: Google Cloud Platform (APIs and services)

[ Voor 11% gewijzigd door Moffin op 14-07-2021 22:18 ]

[ pvoutput | 5760 wp @ O 45° - Z 10° - W 45°]


Acties:
  • 0 Henk 'm!

  • RedFox
  • Registratie: November 2001
  • Laatst online: 11:59

RedFox

Heb je een OV ofzo?

Volgens mij dien je voor deze API altijd met oAuth te authenticeren:
Your application must use OAuth 2.0 to authorize requests. No other authorization protocols are supported.
https://developers.google...ing/core/v4/authorization

Er zijn andere api's waar alleen een api key wel voldoende is, maar dat zal meer publieke data zijn.

You are not special. You are not a beautiful or unique snowflake. You're the same decaying organic matter as everything else.


Acties:
  • 0 Henk 'm!

  • Moffin
  • Registratie: Augustus 2003
  • Laatst online: 12-05 15:48
Mmm, daar was ik al bang voor.

Dan moet ik toch naar het service account kijken.

https://developers.google...rization#service_accounts

Het service account dat ik heb aangemaakt bevat de volgende type gegevens;
  • Unique ID
  • e-mail (GeneratedID.iam.gserviceaccount.com)
  • Key
Ik weet alleen niet hoe ik deze gegevens in bijvoorbeeld postman moet gebruiken.
Kies ik voor OAuth 2.0 op basis van GrantType passwordcredentials dan verschijnen oa de velden
  • Client ID
  • Client secret
  • Username
  • Password
Kies ik voor OAuth 2.0 op basis van GrantType clientcredentials dan verschijnen oa de velden
  • Client ID
  • Client secret
Andere GrandType mogelijkheden zijn;
  • Autorization Code
  • Autorization Code (with PKCE)
  • Implicit

[ pvoutput | 5760 wp @ O 45° - Z 10° - W 45°]


Acties:
  • 0 Henk 'm!

  • OverloadOfRed
  • Registratie: Maart 2010
  • Laatst online: 06-07 22:24

OverloadOfRed

Bla, blabla

De client credentials grant is hiervoor geschikt. authorization_code en refresh_token zijn voor user gebruik, met client_credentials kan je api calls server-to-server doen.
Ik neem dan aan dat Uniqe ID en Key de client ID en client secret zijn, maar dat kan je vast even proberen of in de documentatie terugvinden

Ik ben chatman, supersnel met MSN. Er is niemand die me niet kent


Acties:
  • 0 Henk 'm!

  • Moffin
  • Registratie: Augustus 2003
  • Laatst online: 12-05 15:48
Mmm, ik ben voor me gevoel wel een stapje verder gekomen. Nu kwam ik erachter een json file kan 'downloaden', echter weet ik niet goed wat ik daarmee moet doen?

De file zie ik ook in de documentatie terug:
https://developers.google...rization#service_accounts ( Zie nummer 2 )
Choose whether to download the service account's public/private key as a standard P12 file, or as a JSON file that can be loaded by a Google API client library.
Hoe stuur ik waarden zoals de GrandType, Scope en Token met de API mee?
Is dat gewoon via de header?

[ pvoutput | 5760 wp @ O 45° - Z 10° - W 45°]


Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 30-05 18:01
Ik heb even wat rondgeklikt bij Google, maar ik heb geen Google Workspace account dus kan het niet helemaal testen.

Waar het hier om gaat is dat je een API wil aanroepen die gegevens van een gebruiker teruggeeft. Daar moet die gebruiker toestemming voor geven. Een gewone API key is alleen om jouw eigen "app" te identificeren. Als jouw "app" (dat kan dus ook een request in Postman zijn) alleen wat tekst wil vertalen, een video wil transcoden, etc. is een API key voldoende. Maar voor analytics reporting is toestemming van het account nodig dat jouw app bij de gegevens van het account met de analytics gegevens kan.

Als alternatief voor het OAuth consent screen lees ik inderdaad dat een service account gebruikt kan worden. Klik wat verder door en dan lees je dat je het "client ID" van het service account kan gebruiken om toegang te geven tot API's. Daarvoor moet je eerst het vinkje "Enable Google Workspace Domain-wide Delegation" aanzetten, en volgens deze handleiding toegang geven tot de Workspace (met daarin de user met de Analytics gegevens). Daar moet je scopes "https://www.googleapis.com/auth/analytics,https://www.googleapis.com/auth/analytics.readonly" invullen.

Heb je dat gedaan, dan moet je de private key gebruiken om een JWT te signeren met daarin als subject ("sub" property in JWT) het e-mail adres van het account met de analytics gegevens (het account dat je normaal selecteert in het OAuth consent screen). Het JWT stuur je naar https://oauth2.googleapis.com/token en dan krijg je een token dat je kan gebruiken in de "Authorization: Bearer [token]" header voor requests naar de Analytics Reporting API, waarmee je dus een user "impersoneert" zonder een OAuth consent screen. Het token is maximaal een uur geldig voordat je een nieuw token moet opvragen met een JWT (omdat hierin de tijd verwerkt zit moet je het opnieuw signeren).

Voor Postman zijn er scripts te vinden die dit doen - inclusief automatisch verversen, zie bijvoorbeeld dit pre-request script. Let op dat je het wel wat moet aanpassen, zoals de scopes, de expiry tijd is standaard 5 minuten (kan je ophogen naar 60 minuten), en er staat in de "payload" dus nog geen "sub". De JSON met daarin de private key moet je voor dit script in de Postman environment variabele "serviceAccountKey" opslaan.

Succes :)
Pagina: 1