Jan 2025【日本東北】溫泉三昧之旅④ 在大雪飄落的雪國,追尋秘湯之宿與極上美食(福島~探訪豬苗代湖、磐梯山、會津若松城&千年古湯 蘆之牧溫泉)

圖片
今早6點半起床,準備7點去使用昨天事先預約好的貸切露天風呂,這是「御宿萬葉亭」的名物,每一組住宿客人可以免費使用40分鐘。庭園裡的半露天的風呂,有兩個浴缸,一次只能容納最多三個人同時使用,左邊圓形的浴缸水溫很高、右邊橢圓形的浴缸水溫較低。雖然旅館裡面也有露天浴池,但是早晨享受一下這個庭園裡的露天風呂,也是一種特別的享受。 細密的雪花輕輕飄落,落在庭園的樹木和灌木叢上,覆蓋上一層柔軟的白色。原本翠綠的植物,此刻都披上了銀裝,枝條低垂,彷彿在向雪國的冬天致敬。 遠處的樹林,也都被白雪覆蓋,形成一片靜謐的雪白世界。偶爾,一陣微風吹過,樹枝輕輕搖晃,雪花便如柳絮般飄落,在空中舞動。我泡在熱氣氤氳的溫泉浴池中,早晨的寒意逐漸消散,而欣賞著這如詩如畫的雪景,身心都得到了徹底的放鬆。 聽聞中之澤溫泉的溫泉源自百年前的一場驚天動地的災難,根據我在旅館裡看到的白板資料,那場災難就發生在西元1888年,也就是明治21年的7月15日。某天的夏日清晨,本應是寧靜祥和的,卻被一連串不祥的預兆打破。從幾天前開始,大地就隱隱作祟,到了7點左右,地鳴聲愈發劇烈。早上7點45分,一陣劇烈的搖晃襲來,還沒等眾人回過神,便聽到一聲震耳欲聾的轟鳴,只見磐梯山的方向升起了一根巨大的柱狀物! 這根由岩石、土壤和水蒸氣組成的巨柱,扶搖直上,直衝雲霄,那景象,簡直就像是電影裡的末日場景!據說當時的景象如同「日食」發生一般,天地瞬間陷入一片黑暗。緊接著,夾雜著火山灰和被岩漿加熱的水蒸氣的「熱雨」傾盆而下,這場「熱雨」引發了大規模的土石流,不僅摧毀了沿途的村莊,更將河流截斷,形成了三個新的堰塞湖。而這三個湖泊,就是如今大名鼎鼎的檜原湖、小野川湖和秋元湖。 白板上那張手繪的「會津磐梯山爆發」示意圖,生動地還原了當年的場景。磐梯山被炸掉了一大塊,山腳下的村莊被夷為平地,原本流淌的河流被截斷,形成了三個巨大的湖泊。這幅景象,讓人不禁感嘆大自然的威力,也對當年受災的民眾感到深深的同情。 然而,這場災難卻也孕育出了新的生命——溫泉。白板上寫著:「中之澤溫泉,從江戶時代開始就是湯治場」。據說,這裡的源泉來自安達太良山的火山口,直線距離約7公里。沼之平地區在過去還是人們採集硫磺的地方,這裡出產的硫磺純度高達99%,品質極佳。 這裡的溫泉,屬於酸性泉,自古以來就以其強大的療效而聞名。泉水源自地下水與天水、加上活躍的火山活動交互影響的...

Integrate Windows Live ID Authentication with Rails Application

Windows Live ID is the identity and authentication platform for all Microsoft online services, such as Windows Live, Xbox Live, Office Live, etc. Many third-party sites also use Live ID authentication. Formerly known as Microsoft Passport, the service was rebranded to reflect the Windows Live brand, as well as new scenarios and features developed to support Windows Live.

Why using Windows Live Authentication?

SSO (Single Sign-on) become more popular and important in network security. Just imagine you always login to your own computer, bank account, email and many online accounts just by your smart card and pin code with maximum security without any worry about reminding many passwords, lost or stolen password. Still we are on the road to this goal but the current standard and technology are indicated that we are very close to it. Today even large organizations try to use systems such as Active Directory Federation System (ADFS) to reach SSO.

Windows Live ID Web Authentication helps you build identity-aware Web applications. It is a service that allows you to:

*Verify the identity of visitors to your site.
*Offer personalized access to your site’s content to millions of Live ID users, who don’t need to create yet another identity.
*Provide single sign-on from your application to Windows Live services.
*Seamlessly integrate the advanced, and useful, functionality of Windows Live controls in a non-programmatic way.
*Access user’s Windows Live data with their explicit consent.

Sourced from http://dev.live.com/liveid

實作Windows Live ID登入功能整合至Rails應用程式

1.首先需要到Windows Live ID application page申請API Key:
https://msm.live.com/app/default.aspx


其中Return URL是處理Windows Live ID Auth Server傳回來的參數的Callback地址,我將它設為http://www.example.com/liveAuth,此外Secret Key是用來做加密、解密的Key。填寫完資訊後就可以得到應用程式的Appid及Secret了。




2.接下來在#{RAILS_ROOT}/lib目錄下新增一個windows_live_login.rb檔案,內容如下:



該檔案是參考Windows Live ID Web Authentication SDK for Ruby的Sample Code和Yahoo! BBAuth Wrapper修改而成。

參考 Yahoo! BBAuth Wrapper by Premshree Pillai:
http://premshree.livejournal.com/118739.html

3.接下來新增一個migration,在User資料表中新增wll_uid和wll_name欄位:



執行rake db:migrate之後,我們可以從phpMyAdmin替Users資料表新增一筆wll_uid的索引。

接著編輯config/route.rb 新增路徑映射,我們會將liveAuth method放到Users Controller中:



然後編輯app/controllers/users_controller.rb 新增下面內容,其中liveLogin方法是將使用者導向Windows Live ID登入頁面,而liveAuth則是用來處理傳回的Callback:



註:因為 Rails 2.x 為了避免 XSS Attack ,會禁止非同一網域的HTTP POST ,所以我們必須在Users Controller中添加 protect_from_forgery :except => :liveAuth 允許來自外部網域的POST行為。

其他相關細節請參考:
http://api.rubyonrails.org/classes/ActionController/RequestForgeryProtection/ClassMethods.html


下面是 Windows Live ID Auth 的基本運作流程:

使用者按下『透過Windows Live ID註冊』連結,會被導向 Windows Live ID 的登入頁面,要求登入Live ID帳號,若使用者已經登入過,且Users資料表中找不到相對應的wll_uid值,則會被導向我們的帳號註冊頁面,若找到符合的wll_uid,則將使用者登入我們的網站。


當使用者從Windows Live ID登入成功後,瀏覽器會被導向Return URL,並以HTTP POST夾帶一個stoken參數。這個參數是將Live ID Server端傳回給你的參數,先以SHA256和你的Secret做Digest簽章,以 &sig=XXX的方式附加到要給你的參數後面,再以AES128的方式加密,加密金鑰裡含有你的Secret字串。

當我們的Rails Application收到stoken參數的時候,會先利用算式來做出金鑰,再用金鑰解密,接著驗簽章是否正確,最後我們會得到一個來自Windows Live ID Auth的uid,它是一個Hash過的唯一使用者識別碼,而不是真正的Live ID,但只要以同樣的Live ID帳號登入,就會得到同樣的uid。

接著我們的Rails Application會去資料庫的Users資料表查看這個uid是否已存在,若uid存在則直接將使用者登入我們的網站,否則就將使用者導向註冊頁面,並且給一個暫時的wll_name,我們是用MD5.hexdigest(uid)取前8個字來當作暫時的wll_name,這個wll_name僅供顯示用,因為若是在現有的Rails Project中已經有Basic Auth認證機制,則這個wll_name欄位並沒有多大的意義,也可以乾脆省略掉。但若是在一個新建的Rails Project,且只允許透過Windows Live ID來註冊/登入,則這個wll_name就會有作用。

現在我們可以來修改app/views/users/new.html.erb視圖,若是透過Windows Live ID註冊,則不需要設定密碼,但日後可以在帳號設定頁面設定:


同樣也要修改app/views/users/edit.html.erb視圖的密碼設定部份:



最後修改User model中的password_required?方法,新增下面內容:




至於登出的部份,Windows Live ID Auth 的登出流程大致是這樣:

使用者在我們的Rails網站點擊『登出』連結後,瀏覽器會被自動導向Windows Live ID 的登出處理頁面,Windows Live ID Auth Server會向我們的Rails Application丟出如下的HTTP Request:

RETURN_URL?action=clearcookie

根據官方SDK Document的說明,我們必須去handle兩種action參數值,一個是clearcookie,另一個是logout 。在處理clearcookie時,我們必須清除使用者登入時所建立的session cookie,然後丟出一個Gif圖檔給Windows Live服務端,告知我們要將使用者登出網站。官方版SDK Sample Code是直接透過CGI丟出http header和http content做到的,但我們採取較簡易的方式,直接redirect_to該圖檔的地址即可。

參考:Handling the Response from the Service
http://msdn.microsoft.com/en-us/library/bb676640.aspx

當Windows Live ID Auth Server看到這個圖檔之後,就會將該User在我們網站的Windows Live ID Session設為登出,然後再將瀏覽器導向RETURN_URL?action=logout,這時候就是真正的Logout了,我們在這裡就可以將使用者的Session清空,並將使用者導向指定的頁面。


『登入/登出』的連結,在官方版的SDK Document是這樣做的:『用一個iFrame嵌入在網頁裡,指定參數,由Live ID Login Server決定是登入連結還是登出連結』,方法大致如下。

先將Windows Live ID Auth的APPID放到application_helper.rb中:


然後在需要的頁面中嵌入如下的iframe內容:



詳細內容請參考:Displaying the Sign-in Link
http://msdn.microsoft.com/en-us/library/bb676638.aspx

登入/登出的處理方式,建議按照官方的方法使用iFrame來處理,若是把登入和登出連結另外拉出來可能會產生一些問題,我遇到的問題就是當使用者點擊登出後,瀏覽器直接被導向MSN首頁而不是導向我自己的網站頁面,弄了兩個晚上還是搞不定,最後還是乖乖依照官方的作法才能正常運作。

若是你遇到同樣的問題討論,可以參考以下的MSDN討論串
After logout the browser is redirected to msn instead of my site:
http://social.msdn.microsoft.com/Forums/en-US/wliddev/thread/12bd3e93-b66b-4aa7-9da9-2e6086a98ede/

大致上的實作就是這樣子.



延伸內容:

Using Windows Live Contacts in Ruby
http://www.badrit.com/blog/2010/1/11/using-windows-live-contacts-in-ruby

Importing Windows Live and Hotmail contacts in Django
http://rocketscience.itteco.org/2009/12/12/importing-windows-live-and-hotmail-contacts-in-django/

Delivering Data Portability – Delegated Authentication SDK v1.0
http://mes-newslive.blogspot.com/2008/02/delivering-data-portability-delegated.html

熱門文章

【秋季清邁遊 Part 5|Visit Mae Ya Waterfall and Wachirathan Waterfall】The 6 Day Itinerary To Explore Chiang Mai And Northern Thailand's Mountains

台中【馨苑小料理】西區店|巷弄裡的人氣台菜店|米其林必比登推薦美食|提供合菜、個人套餐

Jan 2025【日本東北】溫泉三昧之旅④ 在大雪飄落的雪國,追尋秘湯之宿與極上美食(福島~探訪豬苗代湖、磐梯山、會津若松城&千年古湯 蘆之牧溫泉)

Feb, 2024【台中西區】桃太郎日本料理|隱身巷弄裡的39年老字號無菜單料理|食材新鮮、自然美味

Jan 2025【苗栗泰安】泰安警光山莊泡湯&彰化CP值極高的日本料理|沐藏料理所X海龍王|彰化板前料理 ♨️🍁🥢🍲

Jan 2025【日本東北】溫泉三昧之旅① 在大雪飄落的雪國,追尋秘湯之宿與極上美食(秋田~探訪有日本溫泉界頂點之稱的秘湯乳頭溫泉鶴之湯)

2019.10.9~13【令和元年の紅葉の山旅へ PART①】秋の贅沢、黒部川の源流へ北アルプス深部を縦走5日間!Day0、Day1(前泊、折立~藥師岳山莊)

Mar 2025【新竹五峰】油羅山森呼吸:擁抱原始柳杉林秘境之美(羅山林道第一登山口往返)

Sep 3~4, 2021【烏來三大林道】未完成的「新北橫公路」~遠離塵世喧囂的西坑林道、桶後林道、內洞林道

May, 2024【新北瑞芳】四腳亭步道|漫步油桐花步道,踏訪時光痕跡:四腳亭砲台歷史尋幽之旅(順訪在地老店 橋頭排骨麵)

文章列表

Contact

名稱

以電子郵件傳送 *

訊息 *