"Access denied" 抛出异常,尽管该帐户具有访问权限
"Access denied" exception is thrown, though the account has access
我正在使用服务帐户委托域范围的安全性,以便通过目录 API 和 PHP 从我们的 Google Apps for Education 实例中提取用户列表客户端库。
我相当确定我的服务帐户具有所有正确的安全性,因为它能够使用 API reference's "try it" 功能提取列表。
所以,在这一点上,一切都指向我的代码有问题,但我似乎无法弄清楚哪里:
<?php
require 'vendor/autoload.php';
$clientEmail = '<>@developer.gserviceaccount.com';
$privateKey = file_get_contents(__DIR__ . '/access.p12');
$scopes = array(
'https://www.googleapis.com/auth/admin.directory.user.readonly',
);
$credentials = new Google_Auth_AssertionCredentials($clientEmail, $scopes, $privateKey);
$credentials->sub = 'service.account@my.domain';
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired())
{
$client->getAuth()->refreshTokenWithAssertion();
}
$directory = new Google_Service_Directory($client);
$result = $directory->users->listUsers(array('domain' => 'my.domain'));
var_dump($result);
上面的代码抛出以下错误:
Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Error refreshing the OAuth2 token, message: ' in C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php on line 358
Google_Auth_Exception: Error refreshing the OAuth2 token, message: '{
"error" : "access_denied",
"error_description" : "Requested client not authorized."
}' in C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php on line 358
Call Stack:
0.0010 132792 1. {main}() C:\wamp\www\quick\index.php:0
0.0260 1060248 2. Google_Auth_OAuth2->refreshTokenWithAssertion() C:\wamp\www\quick\index.php:18
0.9230 1163560 3. Google_Auth_OAuth2->refreshTokenRequest() C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php:309
调用堆栈应标识发生此错误的特定行。请注意,堆栈中的第二行似乎指向脚本的第 18 行,其中代码确实与 OAuth 验证相关:
$client->getAuth()->refreshTokenWithAssertion();
换句话说,当您尝试 refreshTokenWithAssertion 时,Google 说 "access_denied because Requested client not authorized"。如果您试图确定在脚本中的哪个位置遇到了错误,我认为这应该可以回答您的问题。
如果你想弄清楚 为什么 它出错了,我会做一些 google 搜索 refreshTokenWithAssertion
加上那个错误消息,然后看看如果您发现任何其他开发人员正在解决类似问题。例如,通过 google 搜索,我发现 this other page on SO 可能对您有所帮助。
祝你好运!
我正在使用服务帐户委托域范围的安全性,以便通过目录 API 和 PHP 从我们的 Google Apps for Education 实例中提取用户列表客户端库。
我相当确定我的服务帐户具有所有正确的安全性,因为它能够使用 API reference's "try it" 功能提取列表。
所以,在这一点上,一切都指向我的代码有问题,但我似乎无法弄清楚哪里:
<?php
require 'vendor/autoload.php';
$clientEmail = '<>@developer.gserviceaccount.com';
$privateKey = file_get_contents(__DIR__ . '/access.p12');
$scopes = array(
'https://www.googleapis.com/auth/admin.directory.user.readonly',
);
$credentials = new Google_Auth_AssertionCredentials($clientEmail, $scopes, $privateKey);
$credentials->sub = 'service.account@my.domain';
$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired())
{
$client->getAuth()->refreshTokenWithAssertion();
}
$directory = new Google_Service_Directory($client);
$result = $directory->users->listUsers(array('domain' => 'my.domain'));
var_dump($result);
上面的代码抛出以下错误:
Fatal error: Uncaught exception 'Google_Auth_Exception' with message 'Error refreshing the OAuth2 token, message: ' in C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php on line 358
Google_Auth_Exception: Error refreshing the OAuth2 token, message: '{
"error" : "access_denied",
"error_description" : "Requested client not authorized."
}' in C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php on line 358
Call Stack:
0.0010 132792 1. {main}() C:\wamp\www\quick\index.php:0
0.0260 1060248 2. Google_Auth_OAuth2->refreshTokenWithAssertion() C:\wamp\www\quick\index.php:18
0.9230 1163560 3. Google_Auth_OAuth2->refreshTokenRequest() C:\wamp\www\quick\vendor\google\apiclient\src\Google\Auth\OAuth2.php:309
调用堆栈应标识发生此错误的特定行。请注意,堆栈中的第二行似乎指向脚本的第 18 行,其中代码确实与 OAuth 验证相关:
$client->getAuth()->refreshTokenWithAssertion();
换句话说,当您尝试 refreshTokenWithAssertion 时,Google 说 "access_denied because Requested client not authorized"。如果您试图确定在脚本中的哪个位置遇到了错误,我认为这应该可以回答您的问题。
如果你想弄清楚 为什么 它出错了,我会做一些 google 搜索 refreshTokenWithAssertion
加上那个错误消息,然后看看如果您发现任何其他开发人员正在解决类似问题。例如,通过 google 搜索,我发现 this other page on SO 可能对您有所帮助。
祝你好运!