Hello Alexander,

The "401 Unauthorized" error means that the credentials used is not valid 
for that account. Could you try to generate the OAuth credentials and the 
tokens. Also, please make sure that the user authenticating the API call is 
having access to the target account. Please check this guide 
<https://developers.google.com/adwords/api/docs/guides/first-api-call#set_up_oauth2_authentication>
 to 
see the steps to setup OAuth. 

Could you give this a try and let me know how it goes?

Regards,
Sai Teja, AdWords API Team.

On Friday, October 12, 2018 at 7:04:13 AM UTC-4, targaryen...@gmail.com 
wrote:
>
> Hello dear community,
>
> I am stuck with a problem which should be easy to solve but I am no expert 
> and can't get it quite right. Just for clarification: I use Laravel 5.7 and 
> Google Ads Api v201806
>
> So what I am trying to achieve:
>
> 1. User logs in via oauth2.
>
> $oAuth2Credential = new OAuth2([
>       'authorizationUri' => 'https://accounts.google.com/o/oauth2/v2/auth'
> ,
>       'tokenCredentialUri' => 'https://www.googleapis.com/oauth2/v4/token'
> ,
>       'redirectUri' => '-',
>       'clientId' => '-',
>       'clientSecret' => '-',
>       'scope' => 'https://www.googleapis.com/auth/adwords',
>     ]);
>     if (!isset($_GET['code'])) {
>       $oAuth2Credential->setState(sha1(openssl_random_pseudo_bytes(1024
> )));
>       $_SESSION['oauth2state'] = $oAuth2Credential->getState();
>       $config = [
>         'access_type' => 'offline',
>         'prompt' => 'consent',
>       ];
>       header('Location: ' . $oAuth2Credential->buildFullAuthorizationUri(
> $config));
>       exit();
>     } elseif (empty($_GET['state'])
>     || ($_GET['state'] !== $_SESSION['oauth2state'])) {
>       unset($_SESSION['oauth2state']);
>       exit('Invalid state.');
>     } else {
>       $oAuth2Credential->setCode($_GET['code']);
>       $authToken = $oAuth2Credential->fetchAuthToken();
>       $refreshToken = $authToken['refresh_token'];
>     }
>
> 2. Check whether account is MCC or not
> $session = $adWordsSessionBuilder->fromFile(config('app.adsapi_php_path'))
>     ->withOAuth2Credential($oAuth2Credential)
>     ->build();
> $customerService = $adWordsServices->get(
>       $session,
>       CustomerService::class
>     );
> $customerId = $customerService->getCustomers()[0]->getCustomerId();
>
> $canManageClients = $customerService->getCustomers()[0]->
> getCanManageClients();
>
> $session = $adWordsSessionBuilder->fromFile(config('app.adsapi_php_path'))
>     ->withOAuth2Credential($oAuth2Credential)
>     ->withClientCustomerId($customerId)
>     ->build();
>
> 3. If account is not mcc, just proceed and get the reports (this works), 
> if account is MCC get a select field with all managable accounts to choose 
> the account to get the reports from
> if(!$canManageClients) return view('results.loading');
>
> else {
>       $managedCustomerService = $adWordsServices->get(
>         $session,
>         ManagedCustomerService::class
>       );
>       $selector = new Selector();
>       $selector->setFields(['CustomerId', 'Name']);
>       $selector->setOrdering([new OrderBy('CustomerId', SortOrder::
> ASCENDING)]);
>       $selector->setPaging(new Paging(0, 500));
>       $customers = $managedCustomerService->get($selector)->getEntries();
>       $_SESSION['adsSession'] = $session;
>       return view('login.selectcid', compact('customers')) ;
>     }
> 4. Let the MCC select which account to get the reports from and send it 
> via post to the controller
> Here I also pass the GET query string to the next view, so the code and 
> state is still set
> if(!empty($request->clientCustomerId)) {
>           $clientCustomerId = $request->clientCustomerId;
>           $session = $adWordsSessionBuilder->fromFile(config(
> 'app.adsapi_php_path'))
>           ->withOAuth2Credential($oAuth2Credential)
>           ->withClientCustomerId($clientCustomerId)
>           ->build();
>             $_SESSION['adsSession'] = $session;
>         };
>         $_SESSION['clientCustomerId'] = $clientCustomerId;
>       return view('results.loading');
>
>
>
> 5. Get the report for the customerId from the request in the next view
> I get all my required data via an ajax call to a function somewhat like 
> this:
> $session = $_SESSION['adsSession'];
>     $query = (new ReportQueryBuilder())
>       ->select([
>         'Cost',
>         'Impressions',
>         'Clicks',
>         'Conversions',
>         'CostPerConversion',
>         'Ctr',
>         'AllConversionRate'
>       ])
>       ->from(ReportDefinitionReportType::CAMPAIGN_PERFORMANCE_REPORT)
>       ->build();
>     $reportDownloader = new ReportDownloader($session);
>     $reportSettingsOverride = (new ReportSettingsBuilder())
>         ->includeZeroImpressions(false)
>         ->build();
>         $reportDownloadResult = $reportDownloader->downloadReportWithAwql(
>             sprintf('%s',$query),
>             DownloadFormat::XML,
>             $reportSettingsOverride
>           );
>     $json = json_encode(
>       simplexml_load_string($reportDownloadResult->getAsString())
>     );
>     $finalreports = json_decode($json, true)['table'];
>     $_SESSION['campaignsPerformaceData'] = $finalreports;
>     return $finalreports;
>
> But in return I get the following error message:
> "Client error: `POST https://oauth2.googleapis.com/token` 
> <https://oauth2.googleapis.com/token> resulted in a `401 Unauthorized` 
> response: { "error": "unauthorized_client", "error_description": "
> Unauthorized" } "
>
> I have to mention, that all this works with a non MCC account. I think 
> because I don't mess arround with the customerIds. 
>
> I'd appreciate any help. If you need more information please let me know.
>
> Thanks to all in advance.
>
>
>

-- 
-- 
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~
Also find us on our blog:
https://googleadsdeveloper.blogspot.com/
=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~=~

You received this message because you are subscribed to the Google
Groups "AdWords API and Google Ads API Forum" group.
To post to this group, send email to adwords-api@googlegroups.com
To unsubscribe from this group, send email to
adwords-api+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/adwords-api?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"AdWords API and Google Ads API Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to adwords-api+unsubscr...@googlegroups.com.
Visit this group at https://groups.google.com/group/adwords-api.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/adwords-api/b97d5734-2055-4b4b-a66a-6fd4498bad0c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
  • Getting access to R... targaryen . alexander
    • Re: Getting ac... 'Teja Makani' via AdWords API and Google Ads API Forum

Reply via email to