OAuth in den Google Data Protocol-Clientbibliotheken

Warnung: Auf dieser Seite geht es um die älteren APIs von Google, die Google Data APIs. Sie ist nur für die APIs relevant, die im Google Data APIs-Verzeichnis aufgeführt sind. Viele davon wurden durch neuere APIs ersetzt. Informationen zu einer bestimmten neuen API finden Sie in der Dokumentation der jeweiligen API. Informationen zum Autorisieren von Anfragen mit einer neueren API finden Sie unter Authentifizierung und Autorisierung von Google-Konten.

In diesem Dokument wird beschrieben, wie Sie die Google Data API-Clientbibliotheken verwenden, um eine Verbindung zu OAuth-Authentifizierung für Webanwendungen von Google herzustellen.

Über die OAuth-Schnittstelle kann eine webbasierte Anwendung im Namen eines Nutzers auf einen Google-Dienst zugreifen. Um ein hohes Sicherheitsniveau aufrechtzuerhalten, kann die Anwendung mit OAuth ein Zugriffstoken erhalten, ohne jemals die Anmeldedaten des Nutzerkontos zu verarbeiten.

Die Google Data API-Clientbibliotheken enthalten Methoden, mit denen Sie OAuth in Ihrer Webanwendung verwenden können. Es gibt Methoden zum Erstellen eines Anforderungstokens, zum Autorisieren des Anforderungstokens und zum Tauschen des autorisierten Anforderungstokens gegen ein Zugriffstoken. Die Bibliotheken verarbeiten auch die erforderlichen Signaturalgorithmen, wenn Anfragen an einen Google-Datendienst gesendet werden.

Zielgruppe

Dieses Dokument richtet sich an Programmierer, die mit ihren webbasierten Anwendungen im Auftrag von Nutzern auf Google-Dienste zugreifen möchten und dabei die Clientbibliotheken der Google Data APIs verwenden.

In diesem Dokument wird davon ausgegangen, dass Sie mit der OAuth-Schnittstelle und dem allgemeinen Prozess für die Einbindung von OAuth in Ihre Webanwendung vertraut sind. Eine vollständige Beschreibung des OAuth-Protokolls finden Sie unter OAuth Authentication for Web Applications oder in der offiziellen Spezifikation unter oauth.net.

3-legged OAuth und Google Data APIs ohne Clientbibliotheken verwenden

Wenn Ihre Webanwendung über OAuth als Autorisierungsmethode mit einem Google-Datendienst interagieren soll, finden Sie alle erforderlichen Informationen unter OAuth-Authentifizierung für Webanwendungen. Sie müssen die Google Data APIs-Clientbibliotheken nicht verwenden, wenn Sie das nicht möchten.

Hier ist ein Überblick darüber, wie Ihre Anwendung einen Nutzer mit OAuth authentifizieren kann:

  1. Ihre Anwendung sendet eine signierte Anfrage, um ein erstes OAuth-Anfragetoken vom OAuthRequestToken-Endpunkt abzurufen.
  2. Ihre Anwendung leitet den Nutzer zur entsprechenden OAuthAuthorizeToken-URL weiter, um das Anfrage-Token zu autorisieren.
  3. Nachdem der Zugriff gewährt wurde, wird der Nutzer zu Ihrer Anwendung (der oauth_callback-URL) zurückgeleitet.
  4. Ihre Anwendung sendet eine signierte Anfrage an den OAuthGetAccessToken-Endpunkt, um das autorisierte Anfrage-Token in ein Zugriffstoken zu aktualisieren.

Die Google Data APIs-Clientbibliotheken vereinfachen diesen Autorisierungsprozess, indem sie verschiedene Details für Sie übernehmen. In diesem Dokument wird beschrieben, wie das geht.

Webanwendung registrieren

Bei OAuth müssen alle API-Aufrufe digital signiert werden. Google unterstützt die Signaturmethoden HMAC-SHA1 und RSA-SHA1. Damit Anfragen signiert werden können, muss Ihre Anwendung zuerst bei Google registriert werden. Nach der Registrierung erhalten Sie von Google einen Consumerschlüssel (und ein Secret für die Verwendung mit HMAC-SHA1) sowie die Möglichkeit, ein öffentliches Zertifikat hochzuladen.

1. Domain registrieren

Folgen Sie der Anleitung unter Registrierung für webbasierte Anwendungen.

2. Privates Schlüssel-/öffentliches Zertifikatpaar erstellen (optional)

Wenn Sie RSA-SHA1 als oauth_signature_method verwenden möchten, müssen Sie ein selbst signierendes RSA-Schlüsselpaar mit privatem Schlüssel und öffentlichem Zertifikat erstellen. Beispiele dafür finden Sie unten im Abschnitt Selbstsignierenden privaten Schlüssel und öffentliches Zertifikat generieren.

3-legged OAuth und Google Data APIs verwenden: Beispiele für Clientbibliotheken

In den folgenden Abschnitten finden Sie Beispiele für die Verwendung der Google Data APIs-Clientbibliotheksmethoden, um die Schritte aus dem Abschnitt Mit OAuth arbeiten der OAuth-Dokumentation auszuführen. In allen Beispielen in diesem Dokument wird davon ausgegangen, dass die Domain Ihres Anwendungshosts example.com ist.

Umfang des Datenzugriffs festlegen

Für jeden Google-Dienst wird ein scope-Wert definiert, der den Zugriff eines Tokens auf die Daten des Nutzers bestimmt. Die verfügbaren Bereichswerte sind in den Häufig gestellten Fragen zu Google-Daten aufgeführt. Wenn Sie beispielsweise die Documents List API verwenden möchten, legen Sie scope auf https://docs.google.com/feeds/ fest, wie in den FAQs beschrieben.

Hinweis: Legen Sie den Wert von scope auf die engste URL fest, die den erforderlichen Zugriff ermöglicht. So verringern Sie das Risiko, dass Sie versehentlich personenbezogene Daten erhalten und weitergeben. Wenn Sie beispielsweise auf den privaten Dokumentlistenfeed des aktuellen Nutzers zugreifen möchten, verwenden Sie den Bereich https://docs.google.com/feeds/default/private/full anstelle eines umfassenderen Bereichs wie https://docs.google.com/feeds/, der Zugriff auf alle Dokumentlistenfeeds bietet.

Tokens mit mehreren Bereichen

Wenn Sie Tokens erstellen möchten, mit denen auf mehrere Google Data APIs zugegriffen werden kann, trennen Sie die einzelnen Bereiche durch ein Leerzeichen. Im folgenden Beispiel wird ein Token mit Zugriff auf die Google-Dokumente und Google Kalender-Daten eines Nutzers erstellt.

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

Nicht-ASCII-Zeichen in URLs, einschließlich Doppelpunkt, Schrägstrich und Leerzeichen, müssen URL-codiert werden, damit sie über HTTP übertragen werden können. In Google Data API-Clientbibliotheken werden Parameter automatisch URL-codiert. Sie können also einfach nicht URL-codierte Strings verwenden, wenn Sie Parametern Werte zuweisen. Sie können beispielsweise die folgende Zuweisung in Ihrem Code vornehmen:

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

Wenn Sie die Clientbibliothek aufrufen, wird der Parameter scope automatisch URL-codiert und erhält den folgenden Wert:
https%3a%2f%2fwww.google.com%2fcalendar%2ffeeds%2f+https%3a%2f%2fdocs.google.com%2ffeeds%2f

Anfrage-Token abrufen

Java

Für HMAC-SHA1 benötigen Sie eine Möglichkeit, das in der Antwort erhaltene Token-Secret beizubehalten, um ein OAuth-Token-Objekt zu erstellen, das von der Genehmigungsseite zurückgegeben wird. Legen Sie dazu eine Sitzungsvariable oder ein Cookie fest.

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);

Bei Verwendung von RSA-SHA1 wird oauth_token_secret nicht verwendet, sodass das Token-Secret nicht beibehalten werden muss.

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 als Signaturmethode verwenden:

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 als Signaturmethode verwenden:

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 als Signaturmethode verwenden:

Wenn Sie die neueren Klassen ab Version 2.0 verwenden, die auf GDClient basieren, verwenden Sie:

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 als Signaturmethode verwenden:

...

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)

Wenn Sie stattdessen die älteren v1.0-Klassen auf Grundlage von GDataService verwenden, sind die Aufrufe etwas anders:

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 als Signaturmethode verwenden:

...

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 als Signaturmethode verwenden:

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 als Signaturmethode verwenden:

RSA-SHA1 is not supported yet.

Anfrage-Token autorisieren

Um ein Anfragetoken zu autorisieren, muss Ihre Anwendung den Nutzer zur OAuthAuthorizeToken-URL weiterleiten, wo er aufgefordert wird, sich in seinem Google-Konto anzumelden. Weitere Informationen zur OAuthAuthorizeToken-URL finden Sie in der vollständigen OAuth-Authentifizierung für Webanwendungen.

Verwenden Sie für jede Clientbibliothek die folgenden Informationen, um die OAuthAuthorizeToken-URL in Ihrer Anwendung zu erstellen. Diese Beispiele bauen auf den vorherigen Beispielen auf.

Nachdem Sie die URL der Genehmigungsseite erstellt haben, kann Ihre Anwendung sie auf verschiedene Arten verwenden, um den Nutzer an den OAuthAuthorizeToken-Handler zu senden. Am häufigsten wird der Nutzer weitergeleitet oder es wird ein Link zu dieser Seite angezeigt.

Java

Für HMAC-SHA1:

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

Für 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>";

Alternativ können Sie auch einfach zur Genehmigungs-URL weiterleiten:

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

Python

Wenn Sie die neueren Klassen ab Version 2.0 verwenden, die auf GDClient basieren, verwenden Sie:

# 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))

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, ist der Vorgang etwas anders.

# 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);

Token aus der Callback-URL extrahieren

Wenn Google zu Ihrer Anwendung zurückleitet, wird oauth_token als Suchparameter an die URL „oauth_callback_url“ angehängt. Ihre Anwendung sollte dann den Tokenwert aus dem URL-Suchparameter extrahieren und die OAuth-Parameter wiederherstellen.

Die Clientbibliotheken bieten praktische Methoden zum Extrahieren der oauth_token. Diese Beispiele bauen auf den vorherigen Beispielen auf.

Java

Wenn Sie das Token-Secret in der Callback-URL beibehalten möchten (bei Verwendung von 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);

Der einzige Unterschied zu RSA-SHA1 ist die Signaturmethode:

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

Dieser Schritt ist bei Verwendung der PHP-Bibliothek nicht erforderlich.

Python

Wenn Sie die neueren Klassen ab Version 2.0 verwenden, die auf GDClient basieren, verwenden Sie:

# 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)

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, nutzen Sie Folgendes:

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'

Der Vorgang ist für RSA-SHA1 ähnlich, aber ohne das Token-Secret:

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

Wenn Sie das Token-Secret in der Callback-URL beibehalten möchten:

OAuthUtil.UpdateOAuthParametersFromCallback(url, parameters);

Auf ein Zugriffstoken upgraden

Im letzten Schritt des OAuth-Token-Ablaufs wird das autorisierte Anfrage-Token mit der URL OAuthGetAccessToken in ein langlebiges Zugriffstoken umgewandelt, wie in der vollständigen Dokumentation zur OAuth-Authentifizierung für Webanwendungen beschrieben.

Hier sind einige Beispiele für die Verwendung der einzelnen Clientbibliotheken:

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

Wenn Sie die neueren Klassen ab Version 2.0 verwenden, die auf GDClient basieren, verwenden Sie:

# 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)

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, nutzen Sie Folgendes:

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

Wenn Sie gdata.gauth.AeSave() in App Engine verwenden, werden das Token und das Token-Secret für Sie unter dem aktuell angemeldeten Nutzer gespeichert.

.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);

Hinweis: Wenn Sie HMAC-SHA1 verwenden, müssen Sie das Token-Secret des Zugriffstokens zusammen mit dem Tokenwert in Ihrer Datenbank speichern. Andernfalls können Sie die OAuth-Parameter für die spätere Verwendung nicht richtig rekonstruieren.

Zugriffstoken verwenden

Nachdem Sie ein Zugriffstoken erhalten haben, können Sie mit den Standardaufrufen der Google Data APIs-Clientbibliothek mit dem Dienst interagieren. Die Bibliothek übernimmt das Signieren der Anfragen und das Einfügen des richtigen Autorisierungsheaders für Sie. Normalerweise rufen Sie das Token des Nutzers aus einem Cookie oder einer Datenbank ab. In diesen Beispielen wird gezeigt, wie die OAuth-Parameter rekonstruiert und ein Clientbibliotheksaufruf ausgeführt wird.

Java

Wenn Sie HMAC-SHA1 verwenden:

  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());
  }
  

Der Unterschied zu RSA-SHA1 besteht darin, dass Sie das Secret des Zugriffstokens nicht festlegen müssen und die Erstellung des Signer-Objekts anders ist:

  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

In diesem Snippet wird davon ausgegangen, dass Sie bereits ein Zugriffstoken (mit HMAC-SHA1) abgerufen haben und den entsprechenden Schlüssel/das entsprechende Secret für die spätere Verwendung abrufen.

Wenn Sie die neueren Klassen ab Version 2.0 verwenden, die auf GDClient basieren, verwenden Sie:

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

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, nutzen Sie Folgendes:

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

Wenn Sie HMAC-SHA1 verwenden:

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);
}

Der Unterschied zu RSA-SHA1 besteht darin, dass Sie das Secret des Zugriffstokens nicht festlegen müssen und die Erstellung des Signer-Objekts anders ist:

RSA-SHA1 is not supported yet.

Zusätzliche Ressourcen und Beispiele für dreibeiniges OAuth

Nach oben

Zweibeiniges OAuth

Mit 2-legged OAuth können vertrauenswürdige Anwendungen ohne direkte Beteiligung der Nutzer auf deren Google-Daten zugreifen. Zweibeiniges OAuth kann für zwei Schlüsselgruppen verwendet werden:

G Suite-Domainadministratoren:Administratoren können Skripts und benutzerdefinierte Anwendungen erstellen, mit denen sie die Nutzerdaten für ihre Domain über Google Data APIs verwalten. Informationen zum Verwalten des Schlüssels und des Secrets, die mit Ihrer G Suite-Domain verknüpft sind, und zum Gewähren der globalen Zugriffssteuerung finden Sie unter OAuth-Schlüssel und ‑Secret verwalten.

Drittanbieter von Software: Anbieter können Anwendungen anbieten, die Zwei-Bein-OAuth zur Integration in G Suite verwenden. Der Zugriff für die Drittanbieteranwendungen kann auf der Seite „API-Client verwalten“ oder durch die Installation über den G Suite Marketplace gewährt werden.

Gemäß dem normalen Autorisierungsablauf (auch als dreibeiniges OAuth bezeichnet) ist kein Zugriffstoken erforderlich.

Die folgenden Clientbibliotheksbeispiele zeigen, wie Sie Ihren Client für die Verwendung von 2-Legged OAuth mit HMAC-SHA1 einrichten.

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

Wenn Sie die neueren Klassen ab Version 2.0 verwenden, die auf GDClient basieren, verwenden Sie:

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

Wenn Sie die älteren v1.0-Klassen basierend auf GDataService verwenden, nutzen Sie Folgendes:

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);
}

Zusätzliche Ressourcen und Beispiele für zweibeiniges OAuth

Selbstsignierenden privaten Schlüssel und öffentliches Zertifikat generieren

Der private Schlüssel wird zum Generieren einer Signatur verwendet, die in jeder Anfrage enthalten sein muss. Der im Zertifikat eingebettete öffentliche Schlüssel wird von Google verwendet, um die Signatur zu überprüfen. Der öffentliche Schlüssel muss ein 1024-Bit-RSA-Schlüssel sein, der in einem X.509-Zertifikat im PEM-Format codiert ist. Das Zertifikat sollte bei der Registrierung an Google gesendet werden.

In den folgenden Abschnitten finden Sie Beispiele dafür, wie Sie Schlüssel und Zertifikate mit zwei bestimmten Tools generieren: dem OpenSSL-Tool und dem keytool-Tool von Java.

Diese Beispiele sind nicht spezifisch für die Google Data APIs. Sie können dieselben Dienstprogramme verwenden, um Schlüssel für jeden Zweck zu generieren.

In den Beispielen wird davon ausgegangen, dass Ihr Unternehmen „My_Company“ heißt, sich in Mountain View, Kalifornien, USA, befindet und den Domainnamen „example.com“ hat.

Schlüssel mit OpenSSL generieren

Mit dem folgenden Befehl können Sie ein Paar von RSA-Schlüsseln und das entsprechende Zertifikat erstellen:

# 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

Warnung: Wenn Sie den Parameter -nodes einfügen, wird ein privater Schlüssel ohne Passwort erstellt. Aus Sicherheitsgründen sollten Sie diesen Parameter jedoch weglassen.

Der Parameter -sha1 gibt an, dass der Schlüssel zum Generieren von SHA1-Signaturen verwendet wird.

Der Parameter -subj gibt die Identität der Anwendung an, die durch das Zertifikat repräsentiert wird.

Der Parameter -keyout gibt die Datei an, die die Schlüssel enthält. Diese Datei enthält vertrauliche Informationen und sollte geschützt und nicht an andere weitergegeben werden.

Mit dem Parameter -out wird die Datei angegeben, die das Zertifikat im PEM-Format enthält (das bei der Registrierung an Google gesendet werden kann).

Schlüssel für den .NET-Client generieren

Das .NET Framework kann mit Schlüsseln oder Zertifikaten, die im PEM-Format gespeichert sind, nichts anfangen. Daher ist ein zusätzlicher Schritt erforderlich, nachdem Sie die PEM-Datei erstellt haben:

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

In diesem Schritt wird eine PFX-Datei aus Ihrem privaten Schlüssel und Zertifikat generiert. Diese Datei kann in die .NET-Clientbibliothek importiert werden, um Anfragen an die Google Data APIs digital zu signieren.

Schlüssel für den Java-Client generieren

Der Java-Client akzeptiert private Schlüssel im PKCS#8-Format. Nachdem Sie einen Schlüssel/ein Zertifikat gemäß der Anleitung oben generiert haben, erstellen Sie eine PK8-Datei aus der generierten PEM-Datei:

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

Alternativ können Sie den Java-Schlüsselspeicher und das Dienstprogramm „keytool“ verwenden, um ein RSA-Schlüsselpaar und das entsprechende Zertifikat zu erstellen. Verwenden Sie den folgenden Befehl:

# 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

Warnung: „changeme“ ist kein gutes Passwort. Es dient nur als Beispiel.

Der Parameter -dname gibt die Identität der Anwendung an, die durch das Zertifikat repräsentiert wird. Der Parameter -storepass gibt das Passwort zum Schutz des Schlüsselspeichers an. Der Parameter -keypass gibt das Passwort zum Schutz des privaten Schlüssels an.

Verwenden Sie den folgenden Befehl, um das Zertifikat in eine Datei zu schreiben, die im Tool ManageDomains verwendet werden kann:

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

Nach oben