当前位置: 首页 > 知识库问答 >
问题:

管理SDK,目录API,用户:列表-任何PHP示例如何做到这一点?

莘睿
2023-03-14
    ;注册的应用程序-&>;名称}-&>;Web应用程序-&>;OAuth 2.0客户端/LI> ;管理API(On)/li> ;安全性-&>;API访问(已检查)/LI>
  1. “-&>”-&>;第三方OAuth-&>;API客户端(ClientID.apps.googleusercontent.com)/li>
  2. “-&>”-&>;“-&>API作用域(https://www.googleapis.com/auth/admin.directory.user)/li>

这是我目前所掌握的,

require_once 'google/appengine/api/app_identity/AppIdentityService.php';
use \google\appengine\api\app_identity\AppIdentityService;

function setAuthHeader() {
  $access_token =AppIdentityService::getAccessToken("https://www.googleapis.com/auth/admin.directory.user");
  return [ sprintf("Authorization: OAuth %s", $access_token["access_token"]) ];
}

$get_contacts_url = "https://www.googleapis.com/admin/directory/v1/users?customer=my_customer";
$headers = implode("\n\r", setAuthHeader());
$opts =
  array("http" =>
  ["http" => ["header" => $headers ]]
);
$context = stream_context_create( $opts );
$response = file_get_contents( $get_contacts_url, false, $context );
print_r ($response);

access_token”通过得很好,但是响应返回,

{ "error": { "errors": [ { "domain": "global", "reason": "required", "message": "Login Required", "locationType": "header", "location": "Authorization" } ], "code": 401, "message": "Login Required" } }

null

GET https://www.googleapis.com/admin/directory/v1/users?customer=my_customer&key={YOUR_API_KEY}

YOUR_API_KEY}是什么?我试过所有的云控制台和谷歌应用程序API,但都没有运气。

我做这件事完全错了,我应该用一种完全不同的方法吗?我已经为这个问题挣扎了一个多星期了,我希望得到任何形式的回应。谢谢

共有3个答案

冯星剑
2023-03-14

您使用的是最新的PHP库还是不推荐使用的?对于最新的测试版PHP库,这是与身份验证部分相关的代码部分。

set_include_path("google-api-php-client-master/src/" . PATH_SEPARATOR . get_include_path());
require_once 'Google/Client.php';
require_once 'Google/Auth/OAuth2.php';

if (isset($_SESSION['service_token'])) {
  $client->setAccessToken($_SESSION['service_token']);
}

$key = file_get_contents($key_file_location);

$cred = new Google_Auth_AssertionCredentials(
  // Replace this with the email address from the client.
  $clientEmail,
  // Replace this with the scopes you are requesting.
  array(SCOPES),
  $key
);
$cred->sub = ""; //admin email
$client->setAssertionCredentials($cred);

try {
if($client->getAuth()->isAccessTokenExpired()) {
  $client->getAuth()->refreshTokenWithAssertion($cred);
}

$_SESSION['service_token'] = $client->getAccessToken();
彭骏
2023-03-14

简而言之:您过于简化了OAuth2。

它不像发送一个HTTP GET参数那样容易获取数据。

我相信您已经阅读了这篇文章,但是您需要理解OAuth2 web流,以及客户机库如何为您利用它。您应该需要这个文件才能使用目录API。

白烨煜
2023-03-14

我认为最简单的方法是使用PHP客户端库https://github.com/Google/google-api-php-client/,它可以很好地处理身份验证。如果你尝试自己做,JWT的东西会变得非常棘手。我刚刚为您提供了一个这样做的示例,https://gist.github.com/fillup/9fbf5ff35b337b27762a。我用我自己的谷歌应用程序帐号测试了它,并验证了它的工作,如果你有问题,请告诉我。

编辑:在此处添加代码示例以方便使用:

<?php
/**
 * Easiest to use composer to install google-api-php-client and generate autoloader
 * If you dont want to use composer you can manually include any needed files
 */
include_once 'vendor/autoload.php';

/**
 * Client ID from https://console.developers.google.com/
 * Must be added in Google Apps Admin console under Security -> Advanced -> Manage API client     access
 * Requires scope https://www.googleapis.com/auth/admin.directory.user or
 * https://www.googleapis.com/auth/admin.directory.user.readonly
 */
$clientId = 'somelongstring.apps.googleusercontent.com';

/**
 * Service Account Name or "Email Address" as reported on     https://console.developers.google.com/
 */
$serviceAccountName = 'somelongstring@developer.gserviceaccount.com';

/**
 * Email address for admin user that should be used to perform API actions
 * Needs to be created via Google Apps Admin interface and be added to an admin role
 * that has permissions for Admin APIs for Users
 */
$delegatedAdmin = 'delegated-admin@domain.com';

/**
 * This is the .p12 file the Google Developer Console gave you for your app
 */
$keyFile = 'file.p12';

/**
 * Some name you want to use for your app to report to Google with calls, I assume
 * it is used in logging or something
 */
$appName = 'Example App';

/**
 * Array of scopes you need for whatever actions you want to perform
 * See https://developers.google.com/admin-sdk/directory/v1/guides/authorizing
 */
$scopes = array(
    'https://www.googleapis.com/auth/admin.directory.user'
);

/**
 * Create AssertionCredentails object for use with Google_Client
 */
$creds = new Google_Auth_AssertionCredentials(
    $serviceAccountName,
    $scopes,
    file_get_contents($keyFile)
);
/**
 * This piece is critical, API requests must be used with sub account identifying the
 * delegated admin that these requests are to be processed as
 */
$creds->sub = $delegatedAdmin;

/**
 * Create Google_Client for making API calls with
 */
$client = new Google_Client();
$client->setApplicationName($appName);
$client->setClientId($clientId);
$client->setAssertionCredentials($creds);

/**
 * Get an instance of the Directory object for making Directory API related calls
 */
$dir = new Google_Service_Directory($client);

/**
 * Get specific user example
 */
//$account = $dir->users->get('example@domain.com');
//print_r($account);

/**
 * Get list of users example
 * In my testing you must include a domain, even though docs say it is optional
 * I was getting an error 400 without it
 */
$list = $dir->users->listUsers(array('domain' => 'domain.com', 'maxResults' => 100));
print_r($list);
 类似资料:
  • 我想检索所有的用户从一个给定的领域与谷歌目录API(管理SDK)与PHP。 我已经阅读了所有相关的文档,但我找不到任何有效的解决方案。 我需要运行的GET请求是: 获取https://www.googleapis.com/admin/directory/v1/users?domain=example.com&maxresults=2 我试着用Curl运行它: 结果如下: {“错误”:{“错误”:[

  • 问题内容: 有了Express.js,当您访问没有索引文件的目录的URL时,有一种显示文件/目录列表的方法,就像apache一样,因此它显示所有目录内容的列表吗? 是否有我不知道的扩展程序或软件包?还是我必须自己编写代码? 大家好,你真摇滚!:) 问题答案: 从Express 4.x开始,目录中间件不再与express捆绑在一起。您将要下载npm模块serve- index 。 然后,例如,在名为

  • 我正在从V2-V3迁移谷歌日历API的过程中。我需要更新另一个用户日历列表。在V2中,通过重写OAuth令牌上的requestor_id字段,这是可能的。但是现在我也在使用OAuth2,这个技术不起作用了。 列出日历列表的请求是: 使用Calendar API V3可以实现此功能吗?

  • 我有一个关于TestFX4的问题。有一个GUI对象,我想在其中将文本设置为TextField(“#SearchField”)。 它在TestFX3中的工作方式如下:

  • 最近,我成功地获取了使用google Directory API添加到https://admin.google.com/的用户,并为此任务进行了服务器到服务器的认证。 现在,我需要在办公室365做同样的事情。我从哪里开始?像https://admin.google.com/,它在office 365中有什么? **这是我需要的Azure Active Directory订阅吗* * 从哪里以及如何

  • 是否可以公开一个spring数据rest生成的API来管理与Spring Security性一起用于身份验证和访问控制的相同用户? 考虑实体: 与spring security一起使用的是: 它使用以下spring数据存储库: 我现在想要添加一个管理 API 来管理用户。Spring数据Rest可以为我做到这一点,我可以使用Spring安全性来保护它。 问题是,使用spring data rest