2013年10月21日月曜日

Google Admin SDK Directory API (2LO) の PHPサンプル

新しい API でユーザを管理するための PHP サンプル
<?

//管理ドメイン
$consumer_key = "mydomain.mygbiz.com";

//ドメイン管理画面(https://www.google.com/a/管理ドメイン)の
//セキュリティ > 詳細設定 > OAuthドメインキーを管理する > OAuthコンシューマシークレット
//(※「このコンシューマキーを有効にする」と「すべてのAPIへのアクセスを許可する」をチェック)
$consumer_secret = "AbCdEfGhIjKlMnOpQrStUvWx";

//管理者ID
$requestor_id = "admin@$consumer_key";

//上管理者IDのAPIコンソール(https://code.google.com/apis/console)の
//API Access > API key
//(※ Services > Admin SDK の Status を ON に設定)
$api_key = "AbCdEfGhIjKlMnOpQrStUvWxYzAbCdEfGhIjKlM";

//ユーザ管理用URL
$users = "https://www.googleapis.com/admin/directory/v1/users";

//接続先
//直接接続する場合
$host = "ssl://www.googleapis.com";
$port = 443;
//プロキシ経由の場合
//$host = "proxy.mydomain.com";
//$port = 8080;

//OAuthパラメタ
$oauth = array();
$oauth["oauth_consumer_key"]=$consumer_key;
$oauth["oauth_nonce"]=uniqid();
$oauth["oauth_timestamp"]=time();
$oauth["oauth_signature_method"]="HMAC-SHA1";
$oauth["oauth_version"]="1";

//クエリパラメタ
$query = array();
$query["xoauth_requestor_id"]=$requestor_id;
$query["key"]=$api_key;

//引数の確認
function usage() {
  die($GLOBALS["argv"][0]." -m <get|list|insert|update|delete> (-u <userid> -n <fullname> -p <password>)\n");
}
$opt = getopt("m:u:n:p:");
switch (strtolower($opt["m"]{0})) {
case "l"://一覧
  $method = "GET";
  $url = $users;
  $content = "";
  $query["customer"]="my_customer";
  break;
case "g"://確認
  if (!$opt["u"]) usage();
  $method = "GET";
  $url = "$users/{$opt["u"]}@$consumer_key";
  $content = "";
  break;
case "i"://登録
  if (!$opt["u"] || !$opt["n"] || !$opt["p"]) usage();
  $method = "POST";
  $url = $users;
  $a = array();
  list($f,$g) = preg_split("/(\\s| )+/",$opt["n"],2);
  $a["name"] = array("familyName"=>$f,"givenName"=>($g ? $g : $f));
  $a["password"] = $opt["p"];
  $a["primaryEmail"] = "{$opt["u"]}@$consumer_key";
  $content = json_encode($a);
  break;
case "u"://変更
  if (!$opt["u"] || (!$opt["n"] && !$opt["p"])) usage();
  $method = "PUT";
  $url = "$users/{$opt["u"]}@$consumer_key";
  $a = array();
  if ($opt["n"]) {
    list($f,$g) = preg_split("/(\\s| )+/",$opt["n"],2);
    $a["name"] = array("familyName"=>$f,"givenName"=>($g ? $g : $f));
  }
  if ($opt["p"]) {
    $a["password"] = $opt["p"];
  }
  $content = json_encode($a);
  break;
case "d"://削除
  if (!$opt["u"]) usage();
  $method = "DELETE";
  $url = "$users/{$opt["u"]}@$consumer_key";
  $content = "";
  break;
default:
  usage();
  break;
}

//署名用パラメタ(OAuth+クエリ)作成
$a = array();
$b = $oauth + $query;
ksort($b);
foreach ($b as $k=>$v) { $a[] = $k."=".urlencode($v); }
$param = join("&",$a);
//OAuth用署名作成
$data = $method."&".urlencode($url)."&".urlencode($param);
$key = $consumer_secret."&";
$signature = base64_encode(hash_hmac("sha1",$data,$key,true));
$oauth["oauth_signature"]=$signature;

//クエリパラメタ作成
$a = array();
foreach ($query as $k=>$v) { $a[] = $k."=".urlencode($v); }
$param = join("&",$a);
//要求データ
$request = "$method $url?$param HTTP/1.1\r\n";

//OAuthパラメタ作成
$a = array();
foreach ($oauth as $k=>$v) { $a[] = $k."=\"".urlencode($v)."\""; }
$param = join(", ",$a);
$request .= "Authorization: OAuth $param\r\n";
//レスポンス遅延対策
$request .= "Connection: Close\r\n";

//ポストデータ(JSON)
if ($content) {
  $request .= "Content-Type: application/json; charset=utf-8\r\n";
  $request .= "Content-Length: ".strlen($content)."\r\n\r\n";
  $request .= $content;
}
$request .= "\r\n";

//要求送信と返答出力
$fp = fsockopen($host,$port,$errno,$errstr,3);
if (!$fp) {
  die("$errstr ($errno)");
}
fwrite($fp,$request);
while (!feof($fp)) {
  echo fgets($fp);
}
fclose($fp);

0 件のコメント:

コメントを投稿