Using Yahoo! Browser-Based Authentication with your Rails Application
BBAuth fixes that problem when it comes to accessing data locked up at Yahoo. Using the tools Yahoo provides, non-Yahoo applications can request a user to sign in to Yahoo and give permission for Yahoo user data to be sent to the non-Yahoo application.
這是二年前做的東西,我們將透過 Yahoo Browser-Based Authentication(Yahoo! BB Auth)這個介面來實作使用 Yahoo! 帳號登入 Rails 應用程式的功能。實作之前需要先安裝 xml-simple 這個 Ruby Gem 套件,以及 Act-as-authenticated 這個 Rails Plugin。
首先建立遷移檔,在 User 模型添加一個一個 yahoo_userhash 欄位:
$ ruby script/generate migration AddYahooBBAuthToUsers
實作之前,先來了解一下Yahoo! BB Auth 的基本運作原理:
* 當使用者點擊網頁上的 http://你的網址/yahooLogin 連結之後會被重導至 Yahoo!的認證頁面
* 認證成功之後,Yahoo!會傳回一些 information,並導向 http://你的網址/yahooAuth
return 回來的其中一個值即是使用者在 Yahoo!與你的 Rails 應用程式聯合產生的 unique id。
若它在我們站上沒有資訊,就準備一個註冊頁面讓使用者填。如果有就用 find_by_yahoo_userhash 找出他是誰,確定身份後再改 seseeion 讓他能夠被辨識出來。
http://developer.yahoo.com/auth/appreg.html
這裡輸入的 Web Application URL 和 BBAuth Success URL 網址必須和你的route.rb裡面的控制器設定符合,這裡我在 Web Application URL 輸入http://你的網址/yahooLogin,以及在 BBAuth Success URL 輸入 http://你的網址/yahooAuth,申請並認證之後會得到一個 AppID 和 Secret Key。再來就是在 #{RAILS_ROOT}/lib 目錄下建立一個 yahoo_bb_auth.rb 檔案,然後把這兩個 key 套用在檔案中:
接下來編輯 #{RAILS_ROOT}/config/routes.rb 檔案,設定 yahooLogin 和 yahooAuth 對應的 Controller 和方法:
然後編輯UsersController的Create方法,添加下面的內容:
然後在UsersController中新增 yahooLogin 和 yahooAuth 這兩個方法:
接下來編輯 app/views/users/new.html.erb 裡面的密碼輸入區塊,如果使用者透過Yahoo!帳號認證成功並返回註冊頁面,則不需要填寫密碼欄位:
再來編輯 app/views/users/edit.html.erb 這個帳號設定的視圖,這裡設定當使用者要修改密碼時,只有當使用者的 hashed_password 欄位為空(沒有密碼)以及 yahoo_userauth 欄位有值(已認證過 Yahoo!帳號)的情況下,才不需要填寫當前密碼的欄位(current_password),因為使用者目前並沒有設定密碼。
同樣的我們必須修改UsersController的update方法,來增加一些判斷邏輯:
OK!完成了,現在當使用者按下"從Yahoo帳號登入"的連結後,將會被導向Yahoo!的認證頁面,認證成功之後再將使用者帶回我們的網站,如果在資料庫中找到對映的yahoo_userhash資料,則將使用者登入,否則就將使用者導向註冊頁面。
Yahoo 帳號認證頁面 |
應用程式授權頁面 |
現在啟動你的Mongrel Cluster進行測試吧!enjoy~