Ich habe das ganze Internet durchsucht, um ein einfaches Beispiel zu finden, das mich in die richtige Richtung weisen könnte, aber kein Glück, also kommen hier meine Fragen:
Ich möchte mich bei Ubuntu One anmelden und Dateien von meiner Webseite synchronisieren (oder fast lesen), alles mit PHP. Die Anforderungen zum Erreichen von Dateien sind alle auf dieser Seite beschrieben:https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/
Ich kann die erste Anfrage abschließen mit:
$url = 'https://login.ubuntu.com/api/1.0/authentications?ws.op=authenticate&token_name=Ubuntu%20One%[email protected]%20try1';
$data = curlPetition(array('URL'=>$url,'USERPWD'=>'user:pass'));
$ar = fopen('uOne','w');fwrite($ar,$data['responseBody']);fclose($ar);
$tokenA = json_decode($data['responseBody'],1);
Ok, curlPetition erstellt nur einfache Curl-Petitionen. Beachten Sie, dass Sie ein gültiges user:pass Ubuntu One-Konto benötigen. Ich bekomme die Antwort korrekt in json mit „consumer_secret“, „token“, „consumer_key“, „name“, „token_secret“. Sogar der Eintrag wird in den gewährten Apps von Ubuntu One aufgelistet.
Ich habe die neueste OAuth-PCL-PHP-Erweiterung installiert und sie funktioniert gut. aber wenn ich versuche:
$api_url = 'https://one.ubuntu.com/api/file_storage/v1/';
$conskey = $tokenA['consumer_key'];
$conssec = $tokenA['consumer_secret'];
$token = $tokenA['token'];
$secret = $tokenA['token_secret'];
$oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$oauth->enableDebug();
$oauth->enableSSLChecks();
$oauth->setToken($token,$secret);
$oauth->fetch($api_url.'~/Ubuntu%20One/');
print_r($oauth->getLastResponse());
Ich werde auf die Seite „OpenID-Transaktion in Bearbeitung“ weitergeleitet, auf der Sie bei einer manuellen Webanmeldung vorbeikommen. Irgendwas mache ich definitiv falsch. Ich habe versucht, den zweiten Schritt von https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/ mit $oauth->fetch, $oauth->getAccessToken und $oauth->getRequestToken zu bekommen, gleiche Antwort auf alle mit 403-Fehler :S
Ich habe versucht herauszufinden, wie die Payload funktioniert, aber die Hauptbeispiele sind mit Python geschrieben, wobei „import ubuntuone.couch.auth as auth“ verwendet wird, wodurch das Token-Zeug fast automatisch wird.
Ich freue mich über ein paar Tipps. Danke
Akzeptierte Antwort:
Ich glaube, das Problem war, dass Schritt 2 des Workflows „Neues Token erstellen“, definiert auf https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/, mit einem 503 für Sie fehlschlug, weil der Dienst war dieses Wochenende um ein paar Punkte nach unten. Sie müssen diese Situation abfangen und damit umgehen (ein 503 zeigt an, dass Sie die Anfrage später wiederholen sollten, gemäß Standard-HTTP).
Ich habe das folgende PHP getestet (Vorsicht:Ich bin kein PHP-Hacker, daher ist es möglicherweise nicht der idiomatischste Code) und es funktioniert gut für mich. Es durchläuft drei Schritte:
- Erstellen Sie ein neues Token in Ubuntu SSO (login.ubuntu.com) (API-Dokumentation)
- Teilen Sie Ubuntu One dieses neue Token mit (API-Dokumentation)
- Verwenden Sie dieses neue Token, um eine Anfrage an die Ubuntu One-API für Dateien zu signieren (API-Dokumentation)
Sie sehen die einzelnen Teile unten kommentiert. Denken Sie daran, dass dies ein brandneues Token anfordert und erhält; Sobald Sie das Token haben (nach Schritt 2), speichern Sie es irgendwo; fordere nicht jedes Mal eine neue an.
<?php
function curlPetition($arr){
$curl = curl_init($arr['URL']);
if($arr['USERPWD']){curl_setopt($curl, CURLOPT_USERPWD, $arr['USERPWD']);}
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,2);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
$out = curl_exec($curl);
curl_close($curl);
$data['responseBody'] = $out;
return $data;
}
/* Define username and password details */
$email_address = '[email protected]';
$password = 'MY PASSWORD';
/* Step 1: Get a new OAuth token from Ubuntu Single-Sign-On */
$url = 'https://login.ubuntu.com/api/1.0/authentications?ws.op=authenticate&token_name=Ubuntu%20One%[email protected]%20try1';
$data = curlPetition(array('URL'=>$url,'USERPWD'=> $email_address.':'.$password));
$tokenA = json_decode($data['responseBody'],1);
/* Set up that new token for use in OAuth requests */
$conskey = $tokenA['consumer_key'];
$conssec = $tokenA['consumer_secret'];
$token = $tokenA['token'];
$secret = $tokenA['token_secret'];
$oauth = new OAuth($conskey,$conssec,OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_URI);
$oauth->enableDebug();
$oauth->enableSSLChecks();
$oauth->setToken($token,$secret);
/* Step 2: tell Ubuntu One about the new token (signed with the token itself) */
$tell_u1_about_token_url = 'https://one.ubuntu.com/oauth/sso-finished-so-get-tokens/' . $email_address;
$oauth->fetch($tell_u1_about_token_url);
print_r($oauth->getLastResponse());
/* Step 3: use the token to make a request to the Files API */
$api_url = 'https://one.ubuntu.com/api/file_storage/v1/';
$oauth->fetch($api_url.'~/Ubuntu%20One/');
print_r($oauth->getLastResponse());
?>