Wednesday, October 21, 2009

Facebook API - Facebook的應用程式授權機制(一)

Facebook在應用程式的授權上, 講單純一點, 最主要的分別就是使用者是否曾經"Allow"過它, "Allow"這項動作決定了應用程式往後能跟使用者進行互動的程度, 以下就分各個不同的情境來觀察這事關重大的機制



  • 實驗情境一

    使用者尚未登入Facebook便直接連結到App的Canvas Page, 而Canvas Page的程式中並沒有安置要求使用者進行登入的FBML

    Welcome to Facebook! - Facebook_1256133365707

    於瀏覽器網址列輸入Canvas Page URL 
    http://apps.facebook.com/hello_world_sixyeah

    Hello World 6yeah on Facebook_1256133448633 

    你會發現可以直接看見部分內容, 至於有需要登入後才能取得的Social Content就會被替換或隱藏

    接著我們在Canvas Page程式碼的最後方執行

    PHP :

    <?php
    printf('<pre>%s</pre>',var_export($_REQUEST,true));
    ?>

    我們會見到如下的資訊

    array ( '/fb/hello_world_sixyeah' => '', 'fb_sig_in_canvas' => '1', 'fb_sig_request_method' => 'GET', 'fb_sig_locale' => 'en_US', 'fb_sig_in_new_facebook' => '1', 'fb_sig_time' => '1256133619.565', 'fb_sig_logged_out_facebook' => '1', 'fb_sig_added' => '0', 'fb_sig_api_key' => {API Key}, 'fb_sig_app_id' => '{APP ID}', 'fb_sig' => '9f15e9f06f6821ff86184a129910c9b9', )

    接下來於原畫面執行登入的對話框中輸入帳號與密碼, 完成登入後頁面會重導回原Canvas Page

    Hello World 6yeah on Facebook_1256134961088


    array ( '/fb/hello_world_sixyeah' => '', 'fb_sig_in_canvas' => '1', 'fb_sig_request_method' => 'GET', 'fb_sig_friends' => '{朋友的UID串}', 'fb_sig_locale' => 'en_US', 'fb_sig_in_new_facebook' => '1', 'fb_sig_time' => '1256133788.3434', 'fb_sig_added' => '0', 'fb_sig_canvas_user' => '{目前瀏覽Canvas Page朋友的UID}', 'fb_sig_api_key' => '{開發者的API Key}', 'fb_sig_app_id' => '{開發者應用程式的APP ID}', 'fb_sig' => '956aeff3bf63348a469e495dfb878274', )

    接著進入Settings > Application Settings

    Facebook - Application Settings_1256135270844 

    該應用程式已經出現在你的應用程式清單中了, 接著點選
    Edit Settings

    Facebook - Application Settings_1256135486420

    Profile Tab中, Privacy選項被設定成Only Friends

    接著將Tab切換到Additional Permissions, 你可以看到Publish recent activity (one line stories) to my wall的checkbox是沒有被勾選的

    Facebook - Application Settings_1256135731711 

    到目前為止,使用者還沒有完成對你的應用程式進行授權(Allow)這項動作

    接下來請在你的Canvas Page URL的程式中加入以下要求使用者進行登入的程式碼

    <fb:if-is-app-user>
    <fb:else>
    <fb:redirect url="
    http://www.facebook.com/login.php?v=1.0&api_key={API Key}&next=http://apps.facebook.com/hello_world_sixyeah&canvas="/>
    </fb:else>
    </fb:if-is-app-user>

    當你重新進行Canvas Page的Reload時, 畫面會變成如下圖所示

    Facebook - Log in to Hello World 6yeah_1256136483064

    使用者可以選擇是否"Allow"你的應用程式去存取更多關於使用者的資料並進行更深入的互動

    一但使用者點選了"Allow"之後, 頁面會進行Reload並取得更多與使用者相關的資訊,如下圖所示

    Hello World 6yeah on Facebook_1256137075441 

    接著點選右上方導覽列的Settings > Application Settings

    此時可以看到, Profile Tab中的Privacy設定變更成了Everyone

    Facebook - Application Settings_1256137484516 

    接著將Tab切換到Additional Permissions, 你可以看到Publish recent activity (one line stories) to my wall的checkbox已經透過"Allow"這個動作被勾選起來了

    Facebook - Application Settings_1256137703346 



  • 實驗情境二

    使用者尚未登入Facebook便直接連結到App的Canvas Page, 而Canvas Page的程式中安置了要求使用者進行登入的FBML


    <fb:if-is-app-user>
    <fb:else>
    <fb:redirect url="
    http://www.facebook.com/login.php?v=1.0&api_key={API Key}&next=http://apps.facebook.com/hello_world_sixyeah&canvas="/>
    </fb:else>
    </fb:if-is-app-user>


    Login - Facebook_1256195908425 

    當使用者直接連結到應用程式的Canvas Page URL時, Facebook會將頁面導向至如上圖所示的登入頁面要求使用者進行登入的動作, 當使用者輸入帳號與密碼進行登入之後, 使用者會直接被重導向到應用程式的Canvas Page, 而Facebook會自動的認定使用者已經"Allow"你所開發的應用程式.

    也就是說, 當使用者點選Settings > Application Settings進入應用程式設定列表並點選該應用程式的Edit Settings之後可以看到, 彈跳式視窗中, Profile頁籤中的Privacy被設定成Everyone, 同時Additional Permissionsu頁籤中的Publish recent activity (one line stories) to my wall的checkbox也被Facebook自動checked起來了.

  • 實驗情境三

    使用者尚未登入Facebook, 並直接於瀏覽器中輸入App的Canvas Page URL. 此時使用者可以看見部分的App內容, 除了Facebook的Social Content之外. 使用者點選了左上角Facebook的Logo回到了首頁(未登入狀態下), 並於登入的對話框中輸入帳號與密碼進行登入, 在這種情況下, 剛剛使用者所瀏覽過的Facebook App將不會出現在Facebook的Appliction List之中, 必須重新再連結到該App的Canvas Page URL一次, App才會出現在應用程式清單中.

    經過以上的觀察可以發現, 不論使用者是否透過"Allow"對Facebook App進行授權, 只要使用者連結到該App的Canvas Page URL, Facebook就會將該App加入使用者的應用程式清單之中, 而App的開發者可以於之後再向使用者申請對應用程式的授權(Allow), 其間的差別就只在於取得的使用者資訊多寡與被允許的互動程度.












No comments:

Post a Comment