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

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

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

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

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

オーディエンス

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

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

クライアント ライブラリを使用せずに 3-legged OAuth と Google Data API を使用する

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

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

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

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

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

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

1. ドメインの登録

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

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

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

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

以降のセクションでは、Google Data APIs クライアント ライブラリ メソッドを使用して、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 を作成したら、アプリケーションでさまざまな方法でその 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_token がクエリ パラメータとして「oauth_callback_url」URL に追加されます。アプリケーションは、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 APIs クライアント ライブラリ呼び出しを使用してサービスとやり取りします。ライブラリは、リクエストの署名と正しい 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 Legged OAuth

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

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

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

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

次のクライアント ライブラリのサンプルは、HMAC-SHA1 を使用して 2 Legged 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 クライアントのキーを生成する

.NET Framework は、PEM 形式で保存された鍵や証明書を認識しません。したがって、.pem ファイルを作成したら、次の追加の手順が必要です。

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

この手順では、秘密鍵と証明書から PFX ファイルが生成されます。このファイルは、.NET クライアント ライブラリにインポートして、Google Data APIs へのリクエストにデジタル署名するために使用できます。

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

トップへ戻る