ugrás a tartalomhoz

Facebook access token, jogosultsággal?

zzrek · 2013. Feb. 21. (Cs), 23.42
Sziasztok!
PHP-val, tárolt access token segítségével szeretnék postolni egy page falára.
Ezzel a kóddal megy is:

$url = "https://graph.facebook.com/$pageid/feed";
$fields = array (
    'message' => urlencode('teszt post'),
    'access_token' => urlencode($access_token)
);

$fields_string = "";
foreach ($fields as $key => $value):
    $fields_string .= $key . '=' . $value . '&';
endforeach;
rtrim($fields_string, '&');

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);

$result = curl_exec($ch);
curl_close($ch);
Ha az access tokent a graph api explorer-rel kérem le, ott be lehet jelölni a jogosultságokat (permissions) és egy igen hosszú access tokent ad, ezzel működik a fenti kód.

Persze megpróbáltam én kérni az access tokent, ezzel a kóddal:


  $app_token_url = 'https://graph.facebook.com/oauth/access_token?client_id='
                   .$app_id.'&client_secret='.$app_secret
                   .'&grant_type=client_credentials'
		   .'&scope=publish_stream';
		   
				   
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $app_token_url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  $res = curl_exec($ch);
  parse_str($res, $token);
  curl_close($ch);

  if (isset($token['access_token'])) 
  {
   $access_token=$token['access_token'];
  }

...de amit így kapok, azzal a tokennel nem tudok a falra postolni, "The user hasn't authorized the application to perform this action" hibát kapok vissza. (A "&scope=publish_stream" paramétert próbálgatásképp tettem hozzá, semmi hatása)
Az így kapott token egyébként sokkal rövidebb is.

Már kutakodtam mindenhol, de nem jöttem rá, hogy mi hibádzik, hogyan lehet olyan tokent kérni, amivel postolni is lehet?
(Gondoltam, hogy firebuggal megnézem, hogy mit küldd el a FB amikor a graph api explorer-rel kérem a tokent, és azt leutánzom, de külön ablakban kéri és utána gyorsan becsukja, így nem tudom megnézni a forgalmat)

Tudnátok segíteni, mit rontok el?
Köszönöm!
 
1

Long living tokens

complex857 · 2013. Feb. 22. (P), 11.22
Ahoz, hogy user neveben tudj postolni ahoz egy userhez kapcsolodo access_token -re lesz szukseged (amit most hasznalsz az app access token).
Ilyet lehet kliens oldali vagy szerver oldali modon is szerezni, a doksi oldalak errol a temarol itt es itt, magarol a loginrol osszefoglalo oldal itt, egy szep szemlelteto oldal az kulombozo authentikacios modokrol itt.

Nagy vonalakban:
  1. JS SDK FB.login() -javal szerzel kliens oldali tokent ami megfeleloen inicializalt sdk instance mellett (cookie param FB.init() -hez) sutikben onnantol el tud jutni backendre.
  2. szerver oldalon PHP SDK getLoginUrl() -tol kapott linkre iranyitod a felhasznalot. (ennek a vegpontja https://www.facebook.com/dialog/oauth?... szemben a https://.../oauth/access_token -el ami app tokeneket ad)

Ezeknek mind meg fogod tudni adni hogy szeretnel "publish_stream" permissiont is es ha a felhasznalo is ugy akarja (nem muszaj engedelyeznie a publish_stream -et de attolmeg telepitheti az appot es kapsz valid access_token -t) lesz egy tokened ami korulbelul egy oraig ervenyes az adott userhez.

Ezt a rovid lejaratu tokent kell becserelned facebooknal egy hosszu lejaratura ami jelenleg max 60 napig fog ervenyes maradni, ezt fogod tudni letarolni adatbazisban, errol itt irnak, illetve aktualis githubon elerheto php sdkban mar van - egyelore hivatalos doksiban nem dokumentalt - metodus is ra.

Ha nem a felhasznalo userevel akarsz az oldalra postolni, hanem mint az oldal maga (mert a felhasznalo admin az oldalon) akkor szukseged lesz a "manage_pages" extended permissionre, ha az megvan a felhasznalo /me/accounts graph api vegpontonjan talalhato page access tokeneket kell becserelni hosszu lejaratu tokenekre es azt hasznalni postolaskor. Bovebben az "Login as page" oldalon.
3

Köszönöm, többet, többet :-)

zzrek · 2013. Feb. 22. (P), 16.13
Köszönöm a részletes választ, kérlek még ne hagyd abba :-)

Rájöttem, hogy a problémafelvetésben kevés infót adtam meg: a lényeg, hogy az alkalmazás saját page-ének a falára szeretnék postolni.

Ezért is választottam azt, hogy nem user access tokent, hanem app access tokent használnék - gondoltam, ez elég az ilyen feladathoz.

Megnéztem a két access tokent -- amit a graph api explorer ad (ez hosszú, több karakterből álló), és a másikat, amit a kódommal kértem le (ez rövidebb).
Ezzel a kis kóddal írattam ki infót:


   $access_token='xxx';
   
	$graph_url = "https://graph.facebook.com/app?access_token=".$access_token;
	$ans=file_get_contents($graph_url);
    $app_details = json_decode($ans, true);
    echo("<br />Here is a link to the app " . $app_details['link']);
	echo("<br>\n".$ans);

Mindkét token lényegében ugyanazt adta, vagyis arra következtettem, hogy a graph api explorer is app tokent gyárt le.

Jól következtettem?

Ha az is app tokent gyárt, akkor az miért hosszabb? Miért működik a hosszabb token és a rövidebb nem? ...és hogyan adható meg, hogy legyen hozzárendelve olyan jog, ami lehetővé teszi a postolást?

Köszi!
5

out of my depth

complex857 · 2013. Feb. 22. (P), 19.05
Szemely szerint sose akartam page -et csinalni appoknak (szokasos egyszer "na probaljuk ki ezt is" teszt app page -en kivul), igy sajnos ezen a pontok kifogytam a szemelyes tapasztalatokbol.
A tokenek hossza a bennuk tartolt extra infok mennyisegetol fugg, ha behajitod a debug tooljukba akkor szepen kiirja amit tudni lehet a tokenrol, ez alapjan ha csak "app name" -van benne akkor az app access token, user tokenekrol kiirja szepen hogy mikor jar le (persze epoc time -ban, mert mindenki tud 32bites integer timestampekbol kapasbol fejben atvaltani :P)

Amennyire meg tudtam allapitani, graph explorer user tokeneket general a kivalasztott apphoz (jobboldalt fent lehet valogatni), debug tool alapjan a mezok ugyanazok mint tobbi auth flow -al generalt user tokeneknel.

Ami eddigi tapasztalataim alapjan biztosank tunik, hogy page neveben page -re postolni csak page access tokennel lehet. App -al sajat maga neveben nem lehet sehova se postolni. Teszt appoldalam ugyanolyannak tunik mint barmilyen mas page (a dokumentacioban nem talaltam semmit ami appok community pageirol szolna azon tul, hogy leteznek): manage_pages permission mellett szepen megjelenik a /me/accounts alatt ahogy azt kell a page adminjainak. Mindebbol a kovetkezteteseim ezek:
  1. App access tokennel nem fogsz page -re postolni, mert app sajat maga nem rendes felhasznalo facebookon es igy admin se lehet meg sajat oldalan se (ugytunik ilyenkor erkezo error uzenet #200 ami nem segit valami sokat)
  2. Az app-oldal ugyanolyan oldal mint a tobbi, csak facebook kitolt par mezot elore amikor app beallitasainal ranyomsz az "oldal letrehozasa" gombra.
    Ezert a szokasos "login as page" modszerrel begyujtott tokenekkel fogsz tudni postolni. Ehez viszont szukseged lesz egy, az oldalon admin userre akitol kerhetsz manage_pages permissiont majd kinyerheted megfelelo access_token -t /me/accounts alol, majd lehet oket meghosszabbitani, hogy ne jarjanak le 1 ora alatt.

Ettol fuggetlenul kiserletezhetsz app access tokennel elerheto funkciokkal hatha van valami nem dokumentalt de egyebkent supportalt dolog.
(jo kerdes, hogy honnan lehet megmondani, hogy supportal-e ha nincs dokumentalva... :P)
6

app access token

zzrek · 2013. Feb. 22. (P), 22.49
Valóban, időközben én is arra a következtetésre jutottam, hogy nem érdemes app tokennel próbálkozni.
Hasznos volt, amiket írtál, segített kizökkenni a problémából, user/page tokennel oldom meg a dolgot.
Most pillanatnyilag az FQL-lel vacakolok, le szeretném szűrni azokat a postokat, amikre még nincs komment, de mivel se join, se isnull nincs, a struct típusú mezőkre pedig nem sikerült szűrőt beállítanom (még nem jöttem rá), ezért nem is olyan egyszerű. De azért majd boldogulok valahogy :-)

Köszi ismét, jó hétvégét!
7

comments.count

zzrek · 2013. Feb. 22. (P), 23.14
(egyébként megtaláltam, a struct típusú mezőkre objektumjelölő stílusban lehet hivatkozni, a kommentek számára pedig van egy mező, így szűrni is lehet ... where comments.count=0 )
2

(Gondoltam, hogy firebuggal

Poetro · 2013. Feb. 22. (P), 14.53
(Gondoltam, hogy firebuggal megnézem, hogy mit küldd el a FB amikor a graph api explorer-rel kérem a tokent, és azt leutánzom, de külön ablakban kéri és utána gyorsan becsukja, így nem tudom megnézni a forgalmat)

Hogy figyelni tudd a forgalmat van más eszköz is. Egyik ilyen a HttpFox. Ha szinte bármilyen HTTP forgalmat szeretnél figyelni, böngészőtől függetlenül, akkor tudom ajánlani a Fiddler2-t, illetve a sajnos fizetős, de annál többet tudó Charles Proxy-t.
4

Köszi

zzrek · 2013. Feb. 22. (P), 16.17
Köszi, remélem nem lesz rá szükségem, az már veszett fejsze nyele, ha a http forgalomból kell kibányásznom, hogy mit tegyek (a hivatalos doksi helyett). Azért írtam, mert egyébként a firebuggal viszonylag egyszerűen megnézhettem volna, hogy milyen get/post paramétereket küld el a tokenlekéréskor, és ebből következtethettem vona, hogy nekem mit kell tennem.