0
  1. Apps Engine アカウントにリンクされた Google Apps for Business
  2. Cloud Console -> 登録済みアプリ -> {name} -> ウェブ アプリケーション -> OAuth 2.0 ClientID
  3. Cloud Console -> 管理 API (オン)
  4. Google Apps コンソール -> セキュリティ -> API アクセス (チェック済み)
  5. " -> " -> サードパーティ OAuth -> API クライアント ({ClientID}.apps.googleusercontent.com)
  6. " -> " -> " -> API スコープ ( https://www.googleapis.com/auth/admin.directory.user )

ここに私がこれまでに持っているものがあります、

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」はうまくいきますが、$response は、

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

ユーザー: ページの下部にあるリストの例では、次のように "Get" 要求を示しています。

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

{YOUR_API_KEY} とは何ですか? すべての Cloud Console と Google Apps API を試しましたが、うまくいきませんでした。

私はこれについて完全に間違っています。まったく別のアプローチを使用する必要がありますか? 私はこれに1週間以上苦労しており、何らかの反応が欲しい. ありがとう

4

3 に答える 3

4

これを達成する最も簡単な方法は、Google が提供するPHP クライアント ライブラリhttps://github.com/google/google-api-php-client/を使用することだと思います。あなたのために。自分でやろうとすると、JWT の処理が非常に難しくなります。これを行う例をまとめましたhttps://gist.github.com/fillup/9fbf5ff35b337b27762a。私は自分の Google Apps アカウントでテストし、動作することを確認しました。問題がある場合はお知らせください。

編集:簡単にするためにここにコード例を追加します:

<?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);
于 2014-10-23T16:03:26.103 に答える
0

つまり、OAuth2 を単純化しすぎています。

キーを HTTP GET パラメータとして送信してデータを取得するほど簡単ではありません。

このをお読みになっていると思いますが、 OAuth2 Web フローと、クライアント ライブラリがその使用法をどのように活用できるかを理解する必要があります。Directory API を使用するには、このファイルが必要です。

于 2013-12-10T14:53:34.573 に答える
0

最新の PHP ライブラリまたは非推奨のライブラリを使用していますか? 最新の BETA 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();
于 2014-06-08T16:20:12.063 に答える