2015年3月7日 星期六

Facebook Graph API (v2.x) 之檢查權限授權篇 - {user-id}/permission



我們假設你今天的 Facebook App,在某個按下按鈕的動作,或是某個 po 文的瞬間,因為當初 user 在 Facebook Login 時沒有給予你網站業務需求上應該需要的權限,而導致各種 error 或是 bla~bla~bla~  等奇怪的頁面,你就需要額外去想辦法知道該 user 是否有給你應有的權限去做某件事情,進而做出適當的處理。

(圖: 使用者透過 facebook 第一次登入時,可以修改是否要給予 APP 何種權限)


Example: 比方說你的某個功能需要幫 user 發文到塗鴉牆,照理說 user 應該要給你的 app 有 publish_action 的權限,但他沒有給,然而在 po 文的那刻才出錯,燈惹!~,因為你沒有去判斷他到底有沒有給你這個權限。

由於工程師在時程壓力下,大部份都會按照著心中認為順利的流程下去走,所以難免會遺漏掉這些不在正軌上的流程,往往會再發生問題那一刻才會想起來,對耶~ 忘記檔這個功能等等的內心 OS,其實我也是這樣,這是常態 XDD。

接下來就直接看 API 的部分:

/{user-id}/permission

/{user-id}/permission (/me/permissions) 這隻 Graph API 屬於 User 分類下面的 API, 我現在用的版本是 v2.x 的,過去 v1.0 也有這個 api,只是要到的資料格式不太一樣。

permission 僅供你兩個可用的 Method,Get 跟 Delete:

(一) GET
你用 GET (Reading) 的方式取拿取某個 user 針對你提出授權的項目的狀態,包含 granted 跟  declined (同意或是不同意)。

要到的資料為 permission 表示權限的名稱,以及 status 表示狀態,會用 enum 的方式列舉,不是 granted 就是 declined。

這是我用 Graph API Explorer 針對某隻 App 測試的結果:
{
  "data": [
    {
      "permission": "public_profile",
      "status": "granted"
    },
    {
      "permission": "email",
      "status": "granted"
    },
    {
      "permission": "publish_actions",
      "status": "granted"
    },
    {
      "permission": "user_friends",
      "status": "granted"
    }
  ]
}

如果要測試 declined,就要自己去 facebook app setting 找出該 app,把某個權限拿掉,ex: 拿掉該 app 的 publish_action:



然後再要一次 permission 的結果,就會拿到 declined:

通常如果取得 declined,在自己的 app 因為達不到某種功能,所以通常會有個訊息告訴 user 沒有給予適當的權限,可以先做 permission 確認再決定要不要繼續執行後面需要的 API。


(二) Delete 
用來刪除某個權限。(我現在想不起來到底哪時候會用到這個...,我沒有經驗,所以無法多做說明。XD)


結論
permission 確認其實蠻方便的,我太晚知道這個功能了,問題是什麼時機點要 call 這個 API 以及這種資料該用何種方式存下來我倒是覺得比較傷腦筋,值得思考...。很可惜我沒這方面的經驗,無法分享 :P


參考
https://developers.facebook.com/docs/graph-api/reference/v2.2/user/permissions


相關文章
Facebook Graph API 升級到 v2.x
Facebook Graph API (v2.x) 之審核篇 - 標記朋友 Taggable Friends


沒有留言:

張貼留言

若你看的文章,時間太久遠的問題就別問了,因為我應該也忘了... XD

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...