Google Data Protocol クライアント ライブラリの OAuth

警告: このページは、Google の古い API である Google Data API を対象としています。Google Data API ディレクトリに記載されている API のみを対象としており、その多くは新しい API に置き換えられています。特定の新しい API については、その新しい API のドキュメントをご覧ください。新しい API を使用してリクエストを承認する方法については、Google アカウントの認証と承認をご覧ください。

このドキュメントでは、Google Data API クライアント ライブラリを使用して Google のウェブ アプリケーション用の OAuth 認証に接続する方法について説明します。

OAuth インターフェースを使用すると、ウェブベースのアプリケーションが、ユーザーに代わって Google サービスにアクセスできます。高いセキュリティを維持するため、OAuth ではアプリケーションがユーザーのログイン情報を処理しなくてもアクセス トークンを取得できます。

Google Data API クライアント ライブラリには、ウェブ アプリケーションで OAuth を使用するためのメソッドが用意されています。具体的には、リクエスト トークンの取得、リクエスト トークンの承認、承認済みのリクエスト トークンとアクセス トークンの交換を行うメソッドが用意されています。また、Google Data サービスに対してリクエストを行う際に、必要な署名アルゴリズムを処理します。

対象者

このドキュメントは、Google Data API クライアント ライブラリを使用して、ウェブベースのアプリケーションがユーザーに代わって Google サービスにアクセスできるようにするプログラマーを対象としています。

このドキュメントは、OAuth インターフェースと、OAuth をウェブ アプリケーションに組み込むための一般的なプロセスを理解していることを前提としています。OAuth プロトコルの詳細については、ウェブ アプリケーション用の OAuth 認証または oauth.net の公式仕様をご覧ください。

クライアント ライブラリなしで 3-legged OAuth と Google Data API を使用する

認証方法として OAuth を使用してウェブ アプリケーションで Google Data サービスとやり取りする場合は、ウェブ アプリケーション用の OAuth 認証が必要です。使用しない場合は、Google Data API クライアント ライブラリを使用する必要はありません。

アプリケーションが OAuth を使用してユーザーを認証する方法の概要は次のとおりです。

  1. アプリケーションが OAuthRequestToken エンドポイントから最初の OAuth リクエスト トークンを取得するために、署名付きリクエストを行います。
  2. アプリケーションがユーザーを適切な OAuthAuthorizeToken URL にリダイレクトしてリクエスト トークンを承認します。
  3. アクセスを許可すると、ユーザーはアプリケーション(oauth_callback URL)にリダイレクトされます。
  4. アプリケーションが OAuthGetAccessToken エンドポイントを使用して、署名済みのリクエストを送信し、承認済みリクエスト トークンをアクセス トークンにアップグレードします。

Google Data API クライアント ライブラリを使用すると、さまざまな詳細を自動的に処理して、承認プロセスを簡略化できます。このドキュメントでは、その方法について説明します。

ウェブ アプリケーションの登録

OAuth では、すべての API 呼び出しにデジタル署名が必要です。Google は、HMAC-SHA1RSA-SHA1 の署名メソッドをサポートしています。リクエストに署名するには、最初に Google に登録する必要があります。登録すると、Google からコンシューマ キー(および HMAC-SHA1 で使用するシークレット)と、公開証明書をアップロードする場所が提供されます。

1. ドメインの登録

ウェブベースのアプリケーションの登録に記載されている手順に従ってください。

2. 秘密鍵と公開証明書のペアを作成する(省略可)

RSA-SHA1oauth_signature_method として使用する場合は、自己署名 RSA 秘密鍵と公開証明書のペアを作成する必要があります。その方法の例については、後述の自己署名秘密鍵と公開鍵証明書の生成をご覧ください。

3-legged OAuth と Google Data API の使用: クライアント ライブラリの例

以降のセクションでは、Google Data API クライアント ライブラリ メソッドを使用して、OAuth ドキュメントの「OAuth の操作」セクションで説明されている手順を実行します。このドキュメントの例では、アプリケーションのホストドメインが example.com であることを前提としています。

データアクセスの範囲の決定

各 Google サービスは、トークンによるユーザーデータへのアクセスを決定する scope 値を定義します。使用可能なスコープ値は、Google データに関するよくある質問に記載されています。たとえば、Documents List API を使用するには、よくある質問に記載されているように scopehttps://docs.google.com/feeds/ に設定します。

: scope の値は、必要なアクセスを許可する最も小さい URL に設定します。これにより、誤って個人データを取得して漏洩する可能性が低くなります。たとえば、現在のユーザーの非公開のドキュメント リスト フィードにアクセスしたい場合は、https://docs.google.com/feeds/ のような広いスコープではなくスコープ https://docs.google.com/feeds/default/private/full を使用します。これにより、すべてのドキュメント リスト フィードにアクセスできます。

マルチスコープ トークン

複数の Google Data API にアクセスするトークンを作成するには、各スコープをスペース文字で区切ります。次の例では、ユーザーの Google ドキュメントと Google カレンダーの両方のデータにアクセスできるトークンを作成します。

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/
URL エンコード

URL に表示される ASCII 以外の文字(コロン、スラッシュ、スペースなど)は、HTTP 経由で送信するためには URL エンコードする必要があります。Google Data API クライアント ライブラリではパラメータが自動的に URL エンコードされるため、パラメータに値を割り当てる際に、URL 以外でエンコードされた文字列を使用できます。たとえば、コード内で次の割り当てを行うことができます。

scope=https://www.google.com/calendar/feeds/ https://docs.google.com/feeds/

クライアント ライブラリを呼び出すと、scope パラメータは自動的に次の値に URL エンコードされます。
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

リクエスト トークンの取得

Java

HMAC-SHA1 の場合、承認ページから返される OAuth トークン オブジェクトを作成するには、トークン シークレット(レスポンスで取得)を保持する方法が必要です。これを行うには、セッション変数または Cookie を設定します。

import com.google.gdata.client.docs.*;
import com.google.gdata.client.authn.oauth.*;

String CONSUMER_KEY = "example.com";
String CONSUMER_SECRET = "abc123doremi";

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
oauthParameters.setScope("https://docs.google.com/feeds/");
oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp");

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer());
oauthHelper.getUnauthorizedRequestToken(oauthParameters);

RSA-SHA1 では oauth_token_secret は使用されていないため、トークン シークレットを保持する必要はありません。

import com.google.gdata.client.docs.*;
import com.google.gdata.client.authn.oauth.*;

String CONSUMER_KEY = "example.com";

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setScope("https://docs.google.com/feeds/");
oauthParameters.setOAuthCallback("http://www.example.com/UpgradeToken.jsp");

PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8");

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey));
oauthHelper.getUnauthorizedRequestToken(oauthParameters);

...

public static PrivateKey getPrivateKey(String privKeyFileName) {
  File privKeyFile = new File(privKeyFileName);
  FileInputStream fis = new FileInputStream(privKeyFile);
  DataInputStream dis  = new DataInputStream(fis);

  byte[] privKeyBytes = new byte[(int) privKeyFile.length()];
  dis.read(privKeyBytes);
  dis.close();
  fis.close();

  String BEGIN = "-----BEGIN PRIVATE KEY-----";
  String END = "-----END PRIVATE KEY-----";
  String str = new String(privKeyBytes);
  if (str.contains(BEGIN) && str.contains(END)) {
    str = str.substring(BEGIN.length(), str.lastIndexOf(END));
  }

  KeyFactory fac = KeyFactory.getInstance("RSA");
  EncodedKeySpec privKeySpec = new PKCS8EncodedKeySpec(Base64.decode(str));
  return fac.generatePrivate(privKeySpec);
}

PHP

署名方法として HMAC-SHA1 を使用します。

require_once 'Zend/Oauth/Consumer.php';

session_start();

$CONSUMER_KEY = 'example.com';
$CONSUMER_SECRET = 'abc123doremi';

// Multi-scoped token.
$SCOPES = array(
  'https://docs.google.com/feeds/',
  'https://spreadsheets.google.com/feeds/'
);

$oauthOptions = array(
  'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
  'version' => '1.0',
  'consumerKey' => $CONSUMER_KEY,
  'consumerSecret' => $CONSUMER_SECRET,
  'signatureMethod' => 'HMAC-SHA1',
  'callbackUrl' => 'http://myapp.example.com/access_token.php',
  'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken',
  'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken',
  'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken'
);

$consumer = new Zend_Oauth_Consumer($oauthOptions);

// When using HMAC-SHA1, you need to persist the request token in some way.
// This is because you'll need the request token's token secret when upgrading
// to an access token later on. The example below saves the token object as a session variable.
if (!isset($_SESSION['ACCESS_TOKEN'])) {
  $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => implode(' ', $SCOPES))));
}

署名方法として RSA-SHA1 を使用します。

require_once 'Zend/Crypt/Rsa/Key/Private.php';
require_once 'Zend/Oauth/Consumer.php';

session_start();

$CONSUMER_KEY = 'example.com';
$SCOPE = 'https://docs.google.com/feeds/';

$oauthOptions = array(
  'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
  'version' => '1.0',
  'consumerKey' => $CONSUMER_KEY,
  'consumerSecret' => new Zend_Crypt_Rsa_Key_Private(file_get_contents(realpath('/path/to/yourRSAPrivateKey.pem'))),
  'signatureMethod' => 'RSA-SHA1',
  'callbackUrl' => 'http://myapp.example.com/access_token.php',
  'requestTokenUrl' => 'https://www.google.com/accounts/OAuthGetRequestToken',
  'userAuthorizationUrl' => 'https://www.google.com/accounts/OAuthAuthorizeToken',
  'accessTokenUrl' => 'https://www.google.com/accounts/OAuthGetAccessToken'
);

$consumer = new Zend_Oauth_Consumer($oauthOptions);

if (!isset($_SESSION['ACCESS_TOKEN'])) {
  $_SESSION['REQUEST_TOKEN'] = serialize($consumer->getRequestToken(array('scope' => $SCOPE)));
}

Python

署名方法として HMAC-SHA1 を使用します。

GDClient ベースの新しい v2.0+ クラスを使用している場合は、次のコマンドを使用します。

import gdata.gauth
import gdata.docs.client

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/']  # example of a multi-scoped token

client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1')

oauth_callback_url = 'http://%s/get_access_token' % self.request.host
request_token = client.GetOAuthToken(
    SCOPES, oauth_callback_url, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)

# When using HMAC-SHA1, you need to persist the request_token in some way.
# You'll need the token secret when upgrading to an access token later on.
# In Google App Engine, you can use the AeSave helper:
# gdata.gauth.AeSave(request_token, 'myKey')

署名方法として RSA-SHA1 を使用します。

...

f = open('/path/to/yourRSAPrivateKey.pem')
RSA_KEY = f.read()
f.close()

request_token = client.GetOAuthToken(SCOPES, oauth_callback_url, CONSUMER_KEY, rsa_private_key=RSA_KEY)

または、GDataService に基づく古い v1.0 クラスを使用している場合は、呼び出しが少し異なります。

import gdata.auth
import gdata.docs.service

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)

req_token = client.FetchOAuthRequestToken()
client.SetOAuthToken(req_token)

署名方法として RSA-SHA1 を使用します。

...

f = open('/path/to/yourRSAPrivateKey.pem')
RSA_KEY = f.read()
f.close()

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY)

SCOPES = ['https://docs.google.com/feeds/', 'https://www.google.com/calendar/feeds/']  # example of a multi-scoped token
req_token = client.FetchOAuthRequestToken(scopes=SCOPES)
client.SetOAuthToken(req_token)

.NET

署名方法として HMAC-SHA1 を使用します。

using Google.GData.Client;

string CONSUMER_KEY = "example.com";
string CONSUMER_SECRET = "abc123doremi";

// Multi-scoped token.
string SCOPE = "https://www.google.com/calendar/feeds/ https://www.google.com/m8/feeds/";

OAuthParameters parameters = new OAuthParameters() {
  ConsumerKey = CONSUMER_KEY,
  ConsumerSecret = CONSUMER_SECRET,
  Scope = SCOPE,
  Callback = "http://myapp.example.com/access_token",
  SignatureMethod = "HMAC-SHA1"
}

OAuthUtil.GetUnauthorizedRequestToken(parameters);

署名方法として RSA-SHA1 を使用します。

RSA-SHA1 is not supported yet.

リクエスト トークンの承認

リクエスト トークンを承認するには、アプリケーションがユーザーを OAuthAuthorizeToken URL にリダイレクトする必要があります。これにより、ユーザーは Google アカウントにログインすることになります。OAuthAuthorizeToken URL の詳細については、ウェブ アプリケーション用の OAuth 認証をご覧ください。

アプリケーションで OAuthAuthorizeToken URL を作成するには、クライアント ライブラリごとに以下を使用します。これらのサンプルは、前の例に基づいています。

承認ページの URL を作成したら、さまざまな方法でアプリケーションで OAuthAuthorizeToken ハンドラに誘導できます。最も一般的な方法は、ユーザーをリダイレクトしたり、そのページへのリンクを表示したりすることです。

Java

HMAC-SHA1 の場合:

String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters);
System.out.println(approvalPageUrl);

RSA-SHA1 の場合:

String approvalPageUrl = oauthHelper.createUserAuthorizationUrl(oauthParameters);
System.out.println(approvalPageUrl);

PHP

// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com').
$approvalUrl = $consumer->getRedirectUrl(array('hd' => 'default'));
echo "<a href=\"$approvalUrl\">Grant access</a>";

または、単に承認 URL にリダイレクトすることもできます。

// If on a G Suite domain, use your domain for the hd param (e.g. 'example.com').
$consumer->redirect(array('hd' => 'default'));

Python

GDClient ベースの新しい v2.0+ クラスを使用している場合は、次のコマンドを使用します。

# req_token is from previous call to client.GetOAuthToken()
domain = None  # If on a G Suite domain, use your domain (e.g. 'example.com').
self.redirect(request_token.generate_authorization_url(google_apps_domain=domain))

GDataService に基づく古い v1.0 クラスを使用している場合、プロセスが若干異なります。

# req_token is from previous call to client.FetchOAuthRequestToken()
oauth_callback_url = 'http://%s/get_access_token' % self.request.host
self.redirect(client.GenerateOAuthAuthorizationURL(callback_url=oauth_callback_url))

.NET

string authorizationUrl = OAuthUtil.CreateUserAuthorizationUrl(parameters);
Console.WriteLine(authorizationUrl);

コールバック URL からトークンを抽出する

Google がアプリケーションにリダイレクトし直すと、クエリ パラメータとして「oauth_callback_url」URL に oauth_token が追加されます。その後、アプリケーションはその URL クエリ パラメータからトークン値を抽出し、OAuth パラメータを再確立する必要があります。

クライアント ライブラリには、oauth_token を抽出するための便利なメソッドが用意されています。これらのサンプルは、前の例に基づいています。

Java

コールバック URL でトークン シークレットを保持することを選択した場合(HMAC-SHA1 を使用している場合):

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthHmacSha1Signer());
oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);

RSA-SHA1 との唯一の違いは署名方法です。

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);

PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8");

GoogleOAuthHelper oauthHelper = new GoogleOAuthHelper(new OAuthRsaSha1Signer(privKey));
oauthHelper.getOAuthParametersFromCallback(request.getQueryString(), oauthParameters);

PHP

PHP ライブラリを使用している場合は、この手順は不要です。

Python

GDClient ベースの新しい v2.0+ クラスを使用している場合は、次のコマンドを使用します。

# Recall request_token. In Google App Engine, use AeLoad():
# saved_request_token = gdata.gauth.AeLoad('myKey')

request_token = gdata.gauth.AuthorizeRequestToken(saved_request_token, self.request.uri)

GDataService に基づく古い v1.0 クラスを使用している場合は、次のコマンドを使用します。

oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri)
if oauth_token:
  oauth_token.secret = # TODO: recall saved request_token and set the token secret here.
  oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(
      gdata.auth.OAuthSignatureMethod.HMAC_SHA1, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)
 client.SetOAuthToken(oauth_token)
else:
  print 'No oauth_token found in the URL'

プロセスは RSA-SHA1 と同様ですが、トークン シークレットはありません。

oauth_token = gdata.auth.OAuthTokenFromUrl(self.request.uri)
if oauth_token:
  oauth_token.oauth_input_params = gdata.auth.OAuthInputParams(
      gdata.auth.OAuthSignatureMethod.RSA_SHA1, CONSUMER_KEY, rsa_key=RSA_KEY)
 client.SetOAuthToken(oauth_token)
else:
  print 'No oauth_token found in the URL'

.NET

コールバック URL でトークン シークレットを保持することを選択した場合:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

アクセス トークンへのアップグレード

OAuth トークン ダンスの最後の手順は、OAuthGetAccessToken の URL を使用して、承認済みのリクエスト トークンを有効期間の長いアクセス トークンにアップグレードすることです。詳細については、ウェブ アプリケーション用の OAuth 認証のドキュメントをご覧ください。

各クライアント ライブラリを使用した例を以下に示します。

Java

String accessToken = oauthHelper.getAccessToken(oauthParameters);
// You can also pull the OAuth token string from the oauthParameters:
// String accessToken = oauthParameters.getOAuthToken();
System.out.println("OAuth Access Token: " + accessToken);

String accessTokenSecret = oauthParameters.getOAuthTokenSecret();
System.out.println("OAuth Access Token's Secret: " + accessTokenSecret);

PHP

if (!isset($_SESSION['ACCESS_TOKEN'])) {
  if (!empty($_GET) && isset($_SESSION['REQUEST_TOKEN'])) {
    $_SESSION['ACCESS_TOKEN'] = serialize($consumer->getAccessToken($_GET, unserialize($_SESSION['REQUEST_TOKEN'])));
  }
}

Python

GDClient ベースの新しい v2.0+ クラスを使用している場合は、次のコマンドを使用します。

# Upgrade the token and save in the user's datastore
access_token = client.GetAccessToken(request_token)

# If you're using Google App Engine, you can call the AeSave() method to save
# the access token under the current logged in user's account.
#gdata.gauth.AeSave(access_token, token_key)

GDataService に基づく古い v1.0 クラスを使用している場合は、次のコマンドを使用します。

access_token = client.UpgradeToOAuthAccessToken()  # calls SetOAuthToken() for you

App Engine で gdata.gauth.AeSave() を使用している場合、トークンとトークン シークレットは、現在ログインしているユーザーの下に保存されます。

.NET

OAuthUtil.GetAccessToken(parameters);

// If you want to extract the OAuth Token/TokenSecret from the OAuthParameters instance:
string accessToken = parameter.Token;
Console.WriteLine("OAuth Access Token: " + accessToken);

string accessTokenSecret = parameter.TokenSecret;
Console.WriteLine("OAuth Access Token's Secret: " + accessTokenSecret);

: HMAC-SHA1 を使用している場合は、アクセス トークンのトークン シークレットをトークンの値とともにデータベースに保存してください。保存しないと、後で使用するために OAuth パラメータを適切に再構築できません。

アクセス トークンの使用

アクセス トークンを取得したら、標準の Google Data API クライアント ライブラリ呼び出しを使用してサービスとやり取りします。ライブラリは、リクエストに署名し、適切な Authorization ヘッダーを含めます。通常は、Cookie またはデータベースからユーザーのトークンを思い出します。以下の例では、OAuth パラメータを再構成し、クライアント ライブラリ呼び出しを行う方法を説明しています。

Java

HMAC-SHA1 を使用している場合:

  GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
  oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
  oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
  oauthParameters.setOAuthToken(ACCESS_TOKEN);
  oauthParameters.setOAuthTokenSecret(TOKEN_SECRET);

  DocsService client = new DocsService("yourCompany-YourAppName-v1");
  client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());

  URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full");
  DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class);
  for (DocumentListEntry entry : resultFeed.getEntries()) {
    System.out.println(entry.getTitle().getPlainText());
  }
  

RSA-SHA1 との相違点は、アクセス トークンのシークレットを設定する必要がなく、署名者オブジェクトの構築が違う点です。

  GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
  oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
  oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);
  oauthParameters.setOAuthToken(ACCESS_TOKEN);

  PrivateKey privKey = getPrivateKey("/path/to/your/rsakey.pk8");  // See above for the defintion of getPrivateKey()

  DocsService client = new DocsService("yourCompany-YourAppName-v1");
  client.setOAuthCredentials(oauthParameters, new OAuthRsaSha1Signer(privKey));

  URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full");
  DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class);
  for (DocumentListEntry entry : resultFeed.getEntries()) {
    System.out.println(entry.getTitle().getPlainText());
  }
  

PHP

require_once 'Zend/Gdata/Docs.php';

if (isset($_SESSION['ACCESS_TOKEN'])) {
  $accessToken = unserialize($_SESSION['ACCESS_TOKEN']);
} else {
  exit;
}


/*  Or, you could set an existing token (say one stored from your database). For HMAC-SHA1:
$accessToken = new Zend_Oauth_Token_Access();
$accessToken->setToken('1/AQfoI-qJDqkvvkf216Gc2g');
$accessToken->setTokenSecret('2c26GLW250tZiQ');
*/

$httpClient = $accessToken->getHttpClient($oauthOptions);
$client = new Zend_Gdata_Docs($httpClient, "yourCompany-YourAppName-v1");

// Retrieve user's list of Google Docs
$feed = $client->getDocumentListFeed();
foreach ($feed->entries as $entry) {
  echo "$entry->title\n";
}

Python

このスニペットは、すでに HMAC-SHA1 を使用してアクセス トークンを取得し、後で使用するためにそのトークンのキー/シークレットを思い出していることを前提としています。

GDClient ベースの新しい v2.0+ クラスを使用している場合は、次のコマンドを使用します。

client = gdata.docs.client.DocsClient(source='yourCo-yourAppName-v1')
client.auth_token = gdata.gauth.OAuthHmacToken(CONSUMER_KEY, CONSUMER_SECRET, TOKEN,
                                               TOKEN_SECRET, gdata.gauth.ACCESS_TOKEN)
feed = client.GetDocList()
for entry in feed.entry:
  print entry.title.text

GDataService に基づく古い v1.0 クラスを使用している場合は、次のコマンドを使用します。

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET)

# the token key and secret should be recalled from your database
client.SetOAuthToken(gdata.auth.OAuthToken(key=TOKEN, secret=TOKEN_SECRET))

feed = client.GetDocumentListFeed()
for entry in feed.entry:
  print entry.title.text

.NET

HMAC-SHA1 を使用している場合:

OAuthParameters parameters = new OAuthParameters() {
  ConsumerKey = CONSUMER_KEY,
  ConsumerSecret = CONSUMER_SECRET,
  Token = ACCESS_TOKEN,
  TokenSecret = TOKEN_SECRET
}

GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", APPLICATION_NAME, parameters);

DocsService service = new DocsService(APPLICATION_NAME);
service.RequestFactory = requestFactory;

DocumentsListQuery query = new DocumentsListQuery();
DocumentsFeed feed = service.Query(query);
foreach (DocumentEntry entry in feed.Entries) {
  Console.WriteLine(entry.Title.Text);
}

RSA-SHA1 との相違点は、アクセス トークンのシークレットを設定する必要がなく、署名者オブジェクトの構築が違う点です。

RSA-SHA1 is not supported yet.

追加の 3-legged OAuth リソースとサンプル

トップへ戻る

2 行の OAuth

2-legged OAuth を使用すると、信頼できるアプリケーションは、直接関与することなく、ユーザーの Google データにアクセスできます。2 つのキーグループで 2-legged OAuth を使用できます。

G Suite ドメイン管理者: Google Data API を使用してドメインのユーザーデータを管理するスクリプトやカスタム アプリケーションを作成できます。G Suite ドメインに関連付けられたキーとシークレットを管理し、グローバル アクセス制御を付与する方法については、OAuth キーとシークレットの管理をご覧ください。

サードパーティ ソフトウェアのベンダー: G Suite との統合に 2-legged OAuth を使用するアプリケーションを提供する場合があります。サードパーティ アプリケーションへのアクセス権は、[API クライアントの管理] ページまたは G Suite Marketplace からインストールすることで付与できます。

通常の認証トークン(3-legged OAuth とも呼ばれます)の場合、アクセス トークンは必要ありません。

次のクライアント ライブラリのサンプルでは、HMAC-SHA1 を使用して 2 本の脚の OAuth を使用するようにクライアントを設定する方法を示します。

Java

import com.google.gdata.client.docs.*;
import com.google.gdata.client.authn.oauth.*;

String CONSUMER_KEY = "example.com";
String CONSUMER_SECRET = "abc123doremi";

GoogleOAuthParameters oauthParameters = new GoogleOAuthParameters();
oauthParameters.setOAuthConsumerKey(CONSUMER_KEY);
oauthParameters.setOAuthConsumerSecret(CONSUMER_SECRET);

DocsService client = new DocsService("yourCompany-YourAppName-v1");
client.setOAuthCredentials(oauthParameters, new OAuthHmacSha1Signer());

// Retrieve user's list of Google Docs
String user = "any.user@anydomain.com";
URL feedUrl = new URL("https://docs.google.com/feeds/default/private/full" +
                      "?xoauth_requestor_id=" + user);

DocumentListFeed resultFeed = client.getFeed(feedUrl, DocumentListFeed.class);
for (DocumentListEntry entry : resultFeed.getEntries()) {
  System.out.println(entry.getTitle().getPlainText());
}

PHP

require_once 'Zend/Oauth/Consumer.php';
require_once 'Zend/Gdata/Docs.php';

$CONSUMER_KEY = 'example.com';
$CONSUMER_SECRET = 'abc123doremi';
$USER = 'any.user@anydomain.com';

$oauthOptions = array(
    'requestScheme' => Zend_Oauth::REQUEST_SCHEME_HEADER,
    'version' => '1.0',
    'signatureMethod' => 'HMAC-SHA1',
    'consumerKey' => $CONSUMER_KEY,
    'consumerSecret' => $CONSUMER_SECRET
);

$consumer = new Zend_Oauth_Consumer($oauthOptions);
$token = new Zend_Oauth_Token_Access();
$httpClient = $token->getHttpClient($oauthOptions);

$client = new Zend_Gdata_Docs($httpClient);

// Retrieve user's list of Google Docs
$feed = $client->getDocumentListFeed('https://docs.google.com/feeds/default/private/full?xoauth_requestor_id=' . urlencode($USER));
foreach ($feed->entries as $entry) {
  echo "$entry->title\n";
}

Python

GDClient ベースの新しい v2.0+ クラスを使用している場合は、次のコマンドを使用します。

import gdata.gauth
import gdata.docs.client

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
requestor_id = 'any.user@anydomain.com'

client = gdata.docs.client.DocsClient(source='yourCompany-YourAppName-v1')
client.auth_token = gdata.gauth.TwoLeggedOAuthHmacToken(
    CONSUMER_KEY, CONSUMER_SECRET, requestor_id)

# Retrieve user's list of Google Docs
feed = client.GetDocList()
for entry in feed.entry:
  print entry.title.text

GDataService に基づく古い v1.0 クラスを使用している場合は、次のコマンドを使用します。

import gdata.auth
import gdata.docs.service

CONSUMER_KEY = 'example.com'
CONSUMER_SECRET = 'abc123doremi'
SIG_METHOD = gdata.auth.OAuthSignatureMethod.HMAC_SHA1

requestor_id = 'any.user@anydomain.com'

client = gdata.docs.service.DocsService(source='yourCompany-YourAppName-v1')
client.SetOAuthInputParameters(SIG_METHOD, CONSUMER_KEY, consumer_secret=CONSUMER_SECRET,
                               two_legged_oauth=True, requestor_id=requestor_id)

# Retrieve user's list of Google Docs
feed = client.GetDocumentListFeed()
for entry in feed.entry:
  print entry.title.text

# Change to another user on your domain
client.GetOAuthInputParameters().requestor_id = 'another.user@example.com'

.NET

using Google.GData.Client;
using Google.GData.Documents;

// Create an OAuth factory to use
GOAuthRequestFactory requestFactory = new GOAuthRequestFactory("writely", "yourCompany-YourAppName-v1");
requestFactory.ConsumerKey = "example.com";
requestFactory.ConsumerSecret = "abc123doremi";

String user = "any.user@anydomain.com";

DocumentsService client = new DocumentsService("yourCompany-YourAppName-v1");
client.RequestFactory = requestFactory;

// Retrieve user's list of Google Docs
DocumentsListQuery query = new DocumentsListQuery();
query.Uri = new OAuthUri("https://docs.google.com/feeds/default/private/full", user, requestFactory.ConsumerKey);

DocumentsFeed feed = client.Query(query);

foreach (DocumentEntry entry in feed.Entries)
{
  Console.WriteLine(entry.Title.Text);
}

追加の 2-legged OAuth リソースとサンプル

自己署名秘密鍵と公開鍵証明書の生成

秘密鍵は署名の生成に使用されます。署名は各リクエストに含める必要があります。証明書に埋め込まれた公開鍵は、Google によって署名の検証に使用されます。公開鍵は、PEM 形式の X.509 証明書でエンコードされた 1,024 ビット RSA 鍵である必要があります。証明書は登録時に Google に送信する必要があります。

以降のセクションでは、OpenSSL ユーティリティと Java の keytool ユーティリティという 2 つのツールを使用して鍵と証明書を生成する例を示します。

以下の例は Google Data API に固有のものではありませんが、同じユーティリティを使用し、どのような目的でも鍵を生成できます。

会社名が「My_Company」で、米国カリフォルニア州マウンテンビューに、ドメイン名が「example.com」であることを前提としています。

OpenSSL を使用して鍵を生成する

RSA 鍵とそれに対応する証明書のペアを作成するには、次のコマンドを使用します。

# Generate the RSA keys and certificate
openssl req -x509 -nodes -days 365 -newkey rsa:1024 -sha1 -subj \
  '/C=US/ST=CA/L=Mountain View/CN=www.example.com' -keyout \
  myrsakey.pem -out /tmp/myrsacert.pem

警告: -nodes パラメータを含めると、パスワードなしで秘密鍵が作成されます。ただし、セキュリティ強化のため、このパラメータを省略することを検討してください。

-sha1 パラメータでは、鍵を使用して SHA1 署名を生成するよう指定します。

-subj パラメータでは、証明書が表すアプリケーションの ID を指定します。

-keyout パラメータに、鍵を格納するファイルを指定します。このファイルには機密情報が含まれているため、保護し、誰とも共有しないでください。

-out パラメータで、証明書を含むファイルを PEM 形式で指定します(登録中に Google に送信できます)。

.NET クライアントの鍵を生成する

PEM 形式で保存されている鍵や証明書は、.NET フレームワークでは認識されません。そのため、.pem ファイルを作成したら、以下の追加手順が必要です。

openssl pkcs12 -export -in test_cert.pem -inkey myrsacert.pem -out myrsacert.pfx -name "Testing Certificate"

このステップでは、秘密鍵と証明書から PFX ファイルを生成します。このファイルは .NET クライアント ライブラリにインポートして、Google Data API に対するリクエストにデジタル署名できます。

Java クライアントの鍵を生成する

Java クライアントは PKCS#8 形式の秘密鍵を受け入れます。上記の手順で鍵/証明書を生成した後、生成された .pem ファイルから .pk8 ファイルを作成します。

openssl pkcs8 -in myrsakey.pem -topk8 -nocrypt -out myrsakey.pk8

または、Java キーストアと keytool ユーティリティを使用して、RSA 鍵とそれに対応する証明書のペアを作成することもできます。次のコマンドを使用します。

# Generate the RSA keys and certificate
keytool -genkey -v -alias Example -keystore ./Example.jks\
  -keyalg RSA -sigalg SHA1withRSA\
  -dname "CN=www.example.com, OU=Engineering, O=My_Company, L=Mountain  View, ST=CA, C=US"\
  -storepass changeme -keypass changeme

警告: 「changeme」は適切なパスワードではありません。これは例にすぎません。

-dname パラメータでは、証明書が表すアプリケーションの ID を指定します。-storepass パラメータで、キーストアを保護するパスワードを指定します。-keypass パラメータは、秘密鍵を保護するためのパスワードを指定します。

ManageDomains ツールで使用できるファイルに証明書を書き込むには、次のコマンドを使用します。

# Output the public certificate to a file
keytool -export -rfc -keystore ./Example.jks -storepass changeme \
  -alias Example -file mycert.pem

トップへ戻る