2013年1月28日

Grails 網站整合 Facebook 帳號登入的 Facebook Auth plugin 介紹

Grails 是以 SpringSource 的 Spring Framework 為基礎,所以在整合權限控管的部分,首選當然就是 Spring 公司自家的 Spring Security 解決方案。

Grails + Spring Security 可以輕鬆完成:
  1. 網站的登入驗證機制
  2. 以角色(Role)為基礎的群組權限控管
  3. 整合其他 3rd party 提供的 OpenID 或 OAuth 帳號驗證
  4. 提供 Switch User 功能。例如:管理者可先以 admin 帳號登入,再免密碼直接切換成 user1 的帳號。

目前在 Grails Plugins 列表中,Spring Security Core 的排名高居 Top 3,顯示有大量 Grails 開發者採用,算是可以信賴的套件。

Spring Security Core plugin for Grails

安裝 Spring Security Core 的方法是在 BuildConfig.groovy 加入以下 Plugin dependency 宣告。

compile ":spring-security-core:1.2.7.3"

其餘的步驟在官方文件有詳細說明。

加上 Spring Security 的好處,就是可以簡單地利用 @Secured 的標記(annotations)控制 Controller/Action 的存取權限。例如只允許已登入的使用者存取 /user/profile 這個網址:

class UserController {
    @Secured(['ROLE_USER'])
    def profile() {
        // profile action
    }
}

另外 Grails 的 Spring Security 系列套件還提供:

雖然 Grails + SpringSecurity 對 3rd party 驗證的機制,不像 Node.js 的 Everyauth 那樣豐富;但如果你只是單純想讓網站加上 Facebook 帳號的整合,目前已經可以滿足這項需求。

在不久前,我們在設計新專案 CodeCanaan 時,就直接跳過內建註冊功能的實作,而採用 Facebook 登入讓使用者更方便。但是 Grails 的 Spring Security Facebook Auth plugin 是由 Open Source 開發者貢獻的子專案,一直存在許多 Bug 不定時發生。幸好目前 Facebook Auth 專案的維護者 Splix 相當盡責,在我們團隊不斷地回報 issue 後,他很認真地幫我們修正這些問題;所以到目前最新的 0.11 版已經算是相當穩定。

Spring Security Facebook Auth plugin for Grails
https://github.com/splix/grails-spring-security-facebook

安裝 Facebook Auth plugin 也很容易,只要在 BuildConfig.groovy 加上宣告。

compile ":spring-security-facebook:0.11"

再參考 Splix 提供的說明文件範例程式碼,就能幫網站加上 Facebook 帳號登入驗證機制。

目前 Facebook Auth plugin 提供四種整合機制:
  1. redirect - use standard server side authorization
  2. transparent - use transparent cookie based authorization
  3. cookieDirect - use manual cookie based authorization
  4. json - use JSON authorization

其中 redirect 模式是我們最終採用的模式,這個模式實作 Server-side Login 的架構。


雖然 Server-side Login 的實作難度比較高,但是 Facebook Auth plugin 已經解決掉困難的部份,只要直接設定成 redirect 模式就能使用。

使用 redirect 模式的優點有:
  1. 在同一個瀏覽器下,已經登入 Facebook 的使用者,可以自行選擇是否要登入 Grails 做的網站;可以同時登入 Facebook、再以其他帳號登入網站。
  2. 在網站的登出動作,不會影響到已經登入的 Facebook 帳號。
  3. 相容 Spring Security 的 Switch User 功能。

由於 Facebook Auth 只提供 Login 驗證的整合機制,如果想要進一步存取 Facebook 使用者的資料,就必須搭配 Spring Social Facebook 的函式庫。

Facebook 官方早已停止發展自己的 Java 的函式庫,所以在 Facebook Developers 頁面中, Java 的支援只列出 3rd party 的 BlackBerry 與 Spring Social。由於 SpringSource 在 Java 開發社群中,已經有舉足輕重的地位,因此在 Grails 眾多套件的搭配選用上,我們以 Spring 相關的套件為優先考慮的項目。

沒有留言:

張貼留言

lyhcode by lyhcode
歡迎轉載,請務必註明出處!