OpenID - 使用者管理
filed in Uncategorized on Jul.09, 2008
此文章的範圍
- 介紹 openID 的認證機制
- 教導如何在新的程式裡使用多個 openID 認證
- 不介紹舊的程式裡如何套用 openID
資源
有關 openID 可以看看 Ryan Bates 的 podcast。 我們用的起步程式包含了 restful_authentication。 如果覺得這種認證機制是牛刀殺雞的話, 可以考慮用 HTTP 基本認證或是最簡單的認證方法。
什麼是 openID?
openID 的目的就是用一個使用者名稱來登入多個網站。 我的 openID 是 qweruiop.myopenid.com。 理論上, 如果雅虎和 Google 都用 openID 的話, 我就可以享受這些功能: 分別登入雅虎跟 Google 的網站, 跟他們說我的 openID。
之後, 我到雅虎的網站上用 qweruiop.myopenid.com 登入時, 它就送我到 myopenid.com 網站, 讓我在那裡完成登入手續。 登入完後, 我又被送回雅虎, 開始使用雅虎的網站。 雅虎站後我到 Google 網站。 Google 偵測到我已用 openID 登入了, 所以連叫我登入都不用, 直接讓我看 Gmail。 在這個情況下, myOpenID.com 是個 openID 認證網站, Google 跟雅虎是個 openID 配合網站。 配合網站不需要知道我們的密碼, 所以要改密碼時也只需要到認證網站改一次。 所有的網站如果都配合 openID 的機制的話, 我們一天最多只需要登入一次。 但事實上呢, openID 的系統沒那麼完美, 因為 Google 跟雅虎自己要推自己的 openID。 他們希望別人用他們來當 openID 認證網站所以不完全的搭配 openID 互通的機制。 Google 不讓別家註冊的 openID 登入 Google, 雅虎也不要。 所以呢, 在 myOpenID 註冊的 openID 只能在有完全配合 openID 機制的網站上用。 我們等一下要下載來使用的起步程式就是配合此機制的。
openID 不僅是網站通用而已, 還有很多好處。 一個新的使用者到你的網站時,他只要輸入他的 openID 就可以在你的網站上註冊了。 我們下載的起步程式可以跟他的 openID 認證網站索取匿名, email, 還有其他基本資料, 省了他輸入這些資料的時間。 我們也不用寫 email 確認的機制, 因為他的 openID 認證網站應該之前就有確認他的 email 了。 我們不用儲存他的密碼, 他也不用擔心密碼會被駭客從小網站盜走。 如此方便的註冊方式人家才不會怕麻煩而不進你的網站。
安裝 OpenID:
OpenID 可由不同的網站申請。 Blogger, Yahoo, Wordpress, myid.net, myOpenID 等網站都說他們有 openID。 我每個都試過, 但目前只有 myOpenID 和 myid.net 註冊的 openID 可以成功的和我們的起步程式通用。 如沒有 openID 的話先到 myOpenID 網站註冊一個 openID。 註冊完後就可以開始寫程式了。
要在 RoR 程式裡用 openID 就得先安裝 ruby-openid:
gem install ruby-openid
安裝後下載這個 Rails 起步程式。 這個起步程式最後是被face改寫的。 之前,這程式被不同的人改了又改。 講過去, 當初 DHH 寫出來的openID plugin 被
Ben Cutis 修改, 增加了可以讓使用者直接用 openID 建立新的帳號。 後來被
Dr. Nic 修改, 增加了一個使用者, 多個 openID 的功能。 Dr. Nic 寫程式的邏輯是按照這篇文章寫的。 Dr. Nic 的程式又被 face 修改, 把程式碼升級到可用在 Rails 2.0.2 上。 開放原始碼的程式就這樣,越被不同的人修改越好用。 下載起步程式後解壓縮, 修改 config/database.yml 來用你的資料庫, 最後下指令 rake db:migrate 就可以測試了! 這個程式的檔案夾可以複製下來, 以後要寫新的 Rails 程式時, 就以這為開始點。
你可能會想說, 為什麼一個使用者會需要紀錄多個 openID 呢? 答案是, 不同的 openID 可能會給予不同的功能。 例如, 如果你利用 AOL 的 openID 來登入一個網站, AOL 就知道你是 AOL 的客戶, 所以就可以讓你跟其他的 AOL 使用者戶傳簡訊。 假如以後 MSN 提供 openID 的服務, MSN 可以利用 openID 來確認你的身份,然後傳 MSN 簡訊給你。 所以你如果用好幾家公司的功能,就可能會同時用到好幾個 openID。 咦? 那這樣 openID 還是需要好幾個不同的 login 阿! 沒錯的, 就是因為大公司不合作, 所以 openID 的效力沒辦法完全發揮。 但至少有了多個 openID, 如果一個 openID 的認證網站垮了, 還可以用另一個 openID 認證網來登入。
一開始的介面:

按 Login 來登入:

我用的 OpenID 網站是 myopenid.com 所以它會跳到那裡認證:

我之前如果有認證過的話,它就會直接跳到這螢幕:

這裡可以增加多個 openID

基本操作
連到登入/出使用者的網頁:
<%= link_to 'Login', login_url %> <%= link_to 'Logout', logout_url %> <%= link_to 'Edit Profile', edit_user_path(@user) %>
“Logout” 跟 “Login” 這些字可改成 “登出” 或任何字串。 logout_url 和 login_url 是在 config/routes.rb 裡面定義的。 map.login, map.logout 等等。 edit_user_path 是修改使用者資料的網頁, 其內容可在 views/users/edit.html.erb 修改。
連到報名網頁:
<%= link_to 'Register', signup_url %>
signup_url 也是在 config/routes.rb 裡面定義的。
查查看使用者有登入了沒:
<% if logged_in? %>
用 filter 來控制使用者可碰的 method:
before_filter :login_required, :only => [ :edit, :update ]
這段碼的意思是: 如要 edit 和 update 時, 使用者需登入, 否則不要。
改變登入網頁: Views/sessions/new.html.erb
在這頁裡可以把 Login 跟 Password 的欄位移掉,因為我們沒有要自己管理登入的機制。 Remember me 好像也不用, 因為它應該是正常登入時才有用到。
新使用者報名的邏輯寫在 users_controller.rb 裡。 openID 登入的邏輯寫在 helpers/user_openids_helper.rb 這檔案裡。 這個檔案被包含了在 controllers/sessions_controller.rb 裡頭。 把 session_controller.rb 打開可以看到 include UserOpenidsHelper 這個包含指令。 大致上就這樣。 以後找到更多用法後再補充。
Leave a Reply