Prohledal jsem celý internet a snažil jsem se najít jednoduchý příklad, který by mě mohl nasměrovat správným směrem, ale bez úspěchu, takže zde přichází mé otázky:
Chci se přihlásit do Ubuntu One a synchronizovat (nebo téměř číst) soubory z mé webové stránky, vše provedeno pomocí PHP. Potřeby pro přístup k souborům jsou popsány na této stránce:https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/
První požadavek jsem schopen dokončit pomocí:
$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);
Dobře, curlPetition vytváří pouze základní curl petice. Všimněte si, že potřebujete platný účet user:pass ubuntu one. Odpověď dostávám správně v json s „consumer_secret“ , „token“ , „consumer_key“ , „name“ , „token_secret“. Dokonce i položka se objeví v seznamu v udělených aplikacích ubuntu.
Nainstaloval jsem nejnovější rozšíření OAuth PCL php a funguje dobře. ale když se o to pokusím:
$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());
Dostávám se na stránku „Probíhá transakce OpenID“, kterou procházíte při ručním přihlášení na web. určitě dělám něco špatně. Pokusil jsem se získat druhý krok z https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/ pomocí $oauth->fetch, $oauth->getAccessToken a $oauth->getRequestToken, stejná odpověď na všech s Chyba 403 :S
Snažil jsem se přijít na to, jak funguje užitečné zatížení, ale hlavní příklady jsou napsány pomocí pythonu pomocí „import ubuntuone.couch.auth as auth“, díky kterému jsou věci s tokeny téměř automatické.
Rád získám nějaké rady. Díky
Přijatá odpověď:
Domnívám se, že problém byl v tom, že krok 2 pracovního postupu „vytvoření nového tokenu“, definovaného na https://one.ubuntu.com/developer/account_admin/issue_tokens/cloud/, selhal s 503 pro vás, protože služba byla tento víkend klesl o několik bodů. Budete muset tuto situaci zachytit a vypořádat se s ní (503 znamená, že byste měli požadavek zopakovat později, podle standardního HTTP).
Testoval jsem níže uvedený PHP (pozor:nejsem PHP hacker, takže to nemusí být ten nejidiomatičtější kód) a funguje mi to dobře. Prochází třemi kroky:
- Vytvořte nový token v Ubuntu SSO (login.ubuntu.com) (dokumenty API)
- Řekněte Ubuntu One o tomto novém tokenu (dokumenty API)
- Použijte tento nový token k podepsání požadavku na Ubuntu One files API (dokumenty API)
Jednotlivé části uvidíte komentované níže. Pamatujte, že to vyžaduje a dostává zcela nový token; jakmile budete mít token (po kroku 2), uložte ho někam; nepožadujte pokaždé nový.
<?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());
?>