Как использовать OAuth2 для аутентификации в Google Cloud API в PHP - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь взаимодействовать с API Google Cloud с помощью пакетов https://github.com/googleapis/google-cloud-php.

Например, здесь я отправляю запрос на учетные записи:

$client = new CloudBillingClient();
$accounts = $client->listBillingAccounts();

foreach ($accounts as $account) {
    print('Billing account: ' . $account->getName() . PHP_EOL);
}

Это, очевидно, не работает, так как нет учетных данных, и выдает ошибку:

Google\ApiCore\ValidationException
Could not construct ApplicationDefaultCredentials 

Итак, как мне пройти аутентификацию, чтобы заставить работать запрос на выставление счетов? Чтобы было ясно, я могу использовать другую библиотеку OAuth2 для получения access_token, никаких проблем. Например, в этом Laravel контроллере:

use League\OAuth2\Client\Provider\Google as GoogleProvider;

class GoogleAuthController extends Controller
{
    public function index()
    {
        $provider = new GoogleProvider([
            'clientId'     => $clientId,
            'clientSecret' => $clientSecret,
            'redirectUri'  => $redirectUri // will use this same url 'index'
        ]);

        $authUrl = $provider->getAuthorizationUrl([
            'scope' => [
                'https://www.googleapis.com/auth/cloud-platform'
            ]
        ]);

        // This is the first request for authorization
        if (empty($_GET['code']))
        {
            session()->put('oauth2state', $provider->getState());
            return redirect($authUrl);
        }
        // This is the returned request from Google
        else
        {
            $token = $provider->getAccessToken('authorization_code', [
                'code' => $_GET['code']
            ]);

            // I HAVE A TOKEN NOW! I can do a request using Guzzle, like below, and it works fine.
            // But surely Google's package should allow me to do this?!?!?

            $response = Http::get('https://cloudresourcemanager.googleapis.com/v1/projects', [
                'access_token' => $token
            ]);
            return $response;
        }
    }
}

Однако я хотел бы использовать возможности уже созданных библиотек Google.

Просмотр пакета Google Auth для PHP (https://github.com/googleapis/google-auth-library-php) Я вижу много упоминаний об OAuth, и кажется возможным использовать учетные данные, сгенерированные этой библиотекой, с пакетами Google Cloud (https://github.com/googleapis/google-cloud-php), как и BillingClient выше. Но я борюсь с как .

Редактировать

В дополнение к этому: в ответе jdp ниже он использует ключ конфигурации 'credentials'. Обратите внимание на этот комментарий в источнике CloudBillingGapicClient: «Кроме того, этот параметр также может принимать предварительно созданный объект \ Google \ Auth \ FetchAuthTokenInterface или объект \ Google \ ApiCore \ CredentialsWrapper}". Когда я смотрю на класс OAuth2 в пакете Google Auth, я вижу, что он реализует FetchAuthTokenInterface. Таким образом, кажется, что это можно использовать для передачи учетных данных OAuth. Я просто потерян, как.

1 Ответ

1 голос
/ 09 апреля 2020

Вы можете создать учетную запись службы и загрузить файл учетных данных, затем настроить учетные данные приложения по умолчанию . Оттуда клиенты будут автоматически аутентифицироваться.

Вы также можете предоставить учетные данные непосредственно при создании клиента:

$client = new CloudBillingClient([
    'credentials' => '/path/to/keyfile.json'
]);

$accounts = $client->listBillingAccounts();

foreach ($accounts as $account) {
    print('Billing account: ' . $account->getName() . PHP_EOL);
}
...