2015-01-18 15 views
6

Wydaje się, że najnowsza wersja Google API-php-klienta dla PHP nie wyciągać z docs @https://developers.google.com/drive/web/examples/phpgoogle-api-php-klient: Nieprawidłowy plik tajny klient JSON

Patrząc src kod Widzę, że szuka kluczy w pobranym JSON, którego metoda setAuthConfigFile() nie może znaleźć: client_secret, installed, web, redirect_uris (others?) nie są obecne w pobranym JSON. Tylko private_key_id, private_key, client_email, client_id i type są obecne.

Kod i dokumenty wyglądają na naprawdę niezorganizowane i nie są zsynchronizowane ... nie byłyby pierwsze dla Google. Czy ktokolwiek ostatnio uzyskał OAuth przy użyciu tej biblioteki?

+1

Jakieś informacje na ten temat? Mając ten sam problem tutaj. –

+0

@NebezBriefkani Miałem ten sam problem. W moim przypadku plik 'client_secret.json' był domyślnie ustawiony na' read only' na komputerze Mac. Zrobiłem "chmod 777" (_gave write permissions_) do tego pliku, który naprawił problem. –

Odpowiedz

7

Jest różnica pomiędzy „konta usługi” i „apllication internetowej” wykonywać połączenia do API. Po utworzeniu konta usługi „” dostaniesz plik opisany powyżej, plik JSON z private_key, client_email, client_id itp

Podczas tworzenia aplikacji internetowych można otrzymać client_id, client_secret, redirect_uri itp

Sugerowałbym przeczytaniu tych stron, aby wybrać dany klawisz i zalogować musisz (po obu stronach można znaleźć przykłady, aby zintegrować go w PHP):

można użyć API biblioteki klienta Google dla PHP do tworzenia stron internetowych serwer aplikacje korzystające z autoryzacji OAuth 2.0 do uzyskiwania dostępu do interfejsów API Google . OAuth 2.0 umożliwia użytkownikom udostępnianie określonych danych za pomocą aplikacji przy jednoczesnym zachowaniu prywatnych nazw użytkowników, haseł i innych informacji o użytkownikach . Na przykład aplikacja internetowa może korzystać z protokołu OAuth 2.0 , aby uzyskać uprawnienia użytkowników do przechowywania plików na Dyskach Google.

https://developers.google.com/api-client-library/php/auth/web-app

Zazwyczaj aplikacja używa konta usługi, gdy aplikacja korzysta z API Google pracować z własnymi danymi, zamiast danych użytkownika. Na przykład aplikacja korzystająca z Google Cloud Datastore do przechowywania danych o numerze będzie używać konta usługi do uwierzytelniania swoich połączeń pod numerem interfejsu API Google Cloud Datastore.

https://developers.google.com/api-client-library/php/auth/service-accounts

0

Rozumiem ryzyko, masz problem z Google API. W konsoli Google API znajdują się 3 rodzaje plików json, jeden to Web, drugi to Usługa, a ostatni jest zainstalowany. Wybór, którego wiele potrzebujesz, to taki, który jest zainstalowany, ponieważ dostaniesz klucz, zainstalowany lub inny.

2

W bibliotece php jest nowa funkcja, która jest do tego zbliżona, ale nie pozwala na ustawienie sub, więc zawsze daje autoryzacja nie powiedzie się Tak więc, najpierw zaktualizuj funkcję biblioteki php: w src/Google/Client.PHP to:

public function loadServiceAccountJson($jsonLocation, $scopes) 
    { 
    $data = json_decode(file_get_contents($jsonLocation)); 
    if (isset($data->type) && $data->type == 'service_account') { 
     // Service Account format. 
     $cred = new Google_Auth_AssertionCredentials(
      $data->client_email, 
      $scopes, 
      $data->private_key, 
      'notasecret', 
      'http://oauth.net/grant_type/jwt/1.0/bearer', 
      $data->sub 
    ); 
     return $cred; 
    } else { 
     throw new Google_Exception("Invalid service account JSON file."); 
    } 
    } 

Następnie dodaje się wartość sub do danych w pliku json serwera auth:

{ 
    "private_key_id": "removed", 
    "private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n", 
    "client_email": "removed", 
    "client_id": "removed", 
    "redirect_uris":[your urls here], 
    "type": "service_account", 
    "sub": "[email protected]" 
} 

Teraz uzyskania zezwolenia:

$credentials = $client->loadServiceAccountJson('serverauth.json',"https://www.googleapis.com/auth/admin.directory.user.readonly"); 
$client->setAssertionCredentials($credentials); 
if ($client->getAuth()->isAccessTokenExpired()) { 
    $client->getAuth()->refreshTokenWithAssertion(); 
} 

Gdzie serverauth.json jest plikiem kluczy JSON pobranym z konta usługi, z którego chcesz skorzystać, i dodałeś linię podrzędną do.

I wreszcie, należy utworzyć instancję katalog i zapytać go:

$service = new Google_Service_Directory($client); 
$optParams = array(
     'domain' => 'google.domain.com', 
     'orderBy' => 'email', 
     'viewType' => 'domain_public', 
     'query' => "givenName:'Joe' familyName:'Schmoe Jr'" 
); 
$results = $service->users->listUsers($optParams); 
$users = $results->getUsers(); 

print_r($users); 
0

1) "CREDENTIALS_PATH" powinien wskazywać na nieistniejący plik (w writeble ścieżką)

2) "CLIENT_SECRET_PATH" należy wskazać do pliku referencyjnego "ID klienta OAuth 2.0", utworzonego i pobranego z konsoli Google w sekcji Credential API.

Dla skryptu php po stronie serwera, takiego jak twój, należy zwrócić uwagę podczas tworzenia rekordu "ID klienta OAuth 2.0": w kreatorze kreacji należy wybrać "inny" typ aplikacji, a nie typ "web".

Pozdrawiam

+0

Jestem pewien, że znajdę to sam, spędzając całe wieki szukając tego, ale gdzie by to było? –