Start · Sprachen · PHP · Referenz · OAuth

OAuth

Klasse

Client-Klasse zur Kommunikation mit OAuth-1.0- und OAuth-1.0a-Diensten über signierte HTTP-Anfragen.

seit PHP 5.1.0 Kategorie: http

Signatur

class OAuth

Beschreibung

Die Klasse OAuth ist Teil der PECL-Erweiterung oauth und implementiert das OAuth-1.0-Protokoll (RFC 5849). Sie ermöglicht es, signierte HTTP-Anfragen an APIs zu stellen, die eine Drei-Wege-Authentifizierung (Consumer, Service-Provider, Resource-Owner) erfordern – typischerweise ältere Social-Media-APIs oder Unternehmensservices.

Der typische Ablauf umfasst: Anfordern eines Request-Tokens vom Provider, Weiterleiten des Nutzers zur Autorisierungsseite, Empfang des Verification-Codes, Umtausch gegen ein Access-Token und anschließendes Ausführen geschützter API-Aufrufe. Die Klasse übernimmt die HMAC-SHA1- (oder RSA-SHA1- bzw. PLAINTEXT-) Signierung aller Anfragen automatisch.

Die Klasse stellt Methoden wie getRequestToken(), getAccessToken() und fetch() bereit, die die meisten boilerplate-Schritte kapseln. Über setToken() und setAuthType() lässt sich das Verhalten weiter anpassen.

Hinweis: Die PECL-oauth-Erweiterung muss separat installiert sein (pecl install oauth). Für OAuth 2.0 sind andere Bibliotheken notwendig (z. B. league/oauth2-client).

Parameter

Name Typ Default Beschreibung
$consumer_key Pflicht string Der Consumer-Key (auch Application-Key genannt), der vom OAuth-Provider bei der App-Registrierung ausgestellt wird.
$consumer_secret Pflicht string Das Consumer-Secret, das zusammen mit dem Consumer-Key vom Provider ausgestellt wird und zur Signierung der Anfragen verwendet wird.
$signature_method string OAUTH_SIG_METHOD_HMACSHA1 Die zu verwendende Signaturmethode. Mögliche Werte sind OAUTH_SIG_METHOD_HMACSHA1, OAUTH_SIG_METHOD_RSASHA1 oder OAUTH_SIG_METHOD_PLAINTEXT.
$auth_type int OAUTH_AUTH_TYPE_AUTHORIZATION Legt fest, wie die OAuth-Parameter übertragen werden. Mögliche Werte: OAUTH_AUTH_TYPE_AUTHORIZATION (HTTP-Header), OAUTH_AUTH_TYPE_FORM (POST-Body), OAUTH_AUTH_TYPE_URI (Query-String), OAUTH_AUTH_TYPE_NONE.

Beispiele

Request-Token anfordern und Nutzer zur Autorisierung weiterleiten

<?php
// Voraussetzung: PECL-Erweiterung 'oauth' ist installiert

$consumerKey    = 'mein_consumer_key';
$consumerSecret = 'mein_consumer_secret';

try {
    $oauth = new OAuth($consumerKey, $consumerSecret, OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_AUTHORIZATION);
    $oauth->enableDebug(); // Gibt Debuginformationen aus (nur Entwicklung!)

    $requestTokenUrl  = 'https://api.example.com/oauth/request_token';
    $authorizeUrl     = 'https://api.example.com/oauth/authorize';
    $callbackUrl      = 'https://meine-app.example.com/callback';

    $requestTokenInfo = $oauth->getRequestToken($requestTokenUrl, $callbackUrl);

    // Token in der Session speichern
    session_start();
    $_SESSION['request_token']        = $requestTokenInfo['oauth_token'];
    $_SESSION['request_token_secret'] = $requestTokenInfo['oauth_token_secret'];

    // Nutzer zur Autorisierungsseite weiterleiten
    $redirectUrl = $authorizeUrl . '?oauth_token=' . urlencode($requestTokenInfo['oauth_token']);
    header('Location: ' . $redirectUrl);
    exit;
} catch (OAuthException $e) {
    echo 'OAuth-Fehler: ' . htmlspecialchars($e->getMessage());
}

Access-Token einlösen und geschützte API-Ressource abrufen

<?php
// Callback-Seite: Verarbeitung nach Rückkehr vom Provider
session_start();

$consumerKey    = 'mein_consumer_key';
$consumerSecret = 'mein_consumer_secret';

try {
    $oauth = new OAuth($consumerKey, $consumerSecret);

    // Gespeichertes Request-Token setzen
    $oauth->setToken($_SESSION['request_token'], $_SESSION['request_token_secret']);

    // Request-Token gegen Access-Token eintauschen
    $accessTokenUrl  = 'https://api.example.com/oauth/access_token';
    $verifier        = $_GET['oauth_verifier'] ?? '';
    $accessTokenInfo = $oauth->getAccessToken($accessTokenUrl, null, $verifier);

    // Access-Token persistieren (z. B. in Datenbank speichern)
    $accessToken       = $accessTokenInfo['oauth_token'];
    $accessTokenSecret = $accessTokenInfo['oauth_token_secret'];

    // Jetzt geschützte Ressource abrufen
    $oauth->setToken($accessToken, $accessTokenSecret);
    $oauth->fetch('https://api.example.com/v1/user/profile');

    $response = json_decode($oauth->getLastResponse(), true);
    echo 'Benutzername: ' . htmlspecialchars($response['username'] ?? '(unbekannt)');
} catch (OAuthException $e) {
    echo 'OAuth-Fehler: ' . htmlspecialchars($e->getMessage());
    // Detaillierte Fehlermeldung:
    // var_dump($oauth->getLastResponseInfo());
}
Benutzername: max.mustermann

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Consumer-Key und Consumer-Secret niemals im Client-seitigen Code oder in öffentlichen Repositories ablegen. Umgebungsvariablen oder verschlüsselte Konfigurationsdateien verwenden.
  • enableDebug() gibt sensible Tokendaten aus – ausschließlich in der Entwicklungsumgebung verwenden.
  • Alle OAuth-Kommunikation sollte ausnahmslos über HTTPS erfolgen, da PLAINTEXT-Signaturen bei unverschlüsselter Verbindung trivial angreifbar sind.
  • Request-Tokens und temporäre Secrets sollten nur sehr kurzlebig in der Session gehalten und danach verworfen werden.

Weitere Hinweise:

  • Die Klasse ist nicht für OAuth 2.0 geeignet. OAuth 2.0 basiert auf einem grundlegend anderen Konzept (Bearer-Token, kein Signing).
  • Die PECL-Erweiterung ist seit Jahren kaum weiterentwickelt worden; für neue Projekte empfiehlt sich eine aktiv gepflegte Composer-Bibliothek.
  • Bei Fehlern wirft die Klasse eine OAuthException; die Methode getLastResponseInfo() liefert HTTP-Metadaten zur Fehleranalyse.