Oct 21~24, 2023【晚秋の贅沢な山旅 PART①】從名古屋搭車至長野|在北阿爾卑斯山麓的文藝小鎮信濃大町散步、品嚐美味的炸豬排定食和咖啡

圖片
今年10月下旬,趁著深秋季節,請了兩天特休假,飛往日本中部北陸地區,探訪兩處幾年前就想去的地方。其中一處是位於 新潟縣 和 長野縣 交界處的日本百名山【 雨飾山(Mt. Amakazari) 】,10月中下旬的紅葉全盛期,是造訪這座 日本百名山 的最佳時間點,且因爲海拔高度只有兩千公尺左右,相比三千公尺級的 北阿爾卑斯山脈 ,這裡的積雪時間略晚一些。即使到了10月下旬,只要沒有強烈冷氣團,沒有雪季登山裝備也還是能夠登頂。 另一處則是少為人知的 秋季限定路線 ,黑部峽谷【 下ノ廊下 】(下之廊下),這個地方除非是登山客,不然連一般日本人都不太普遍聽過。 下之廊下 位於 黑部大峽谷 的北部地區,因為靠近 日北海 ,冬季這裡是豪雪地帶,只有從每年9月下旬登山道的積雪完全融化後,到11月上旬左右,山區再次降雪之前,大約一個月左右的時間可以通行。 據聞2022年因融雪較慢,能通行的時間只有短短兩週,而今年則是融雪較早,9月中旬就全面開通了。前陣子9月來日本爬山時,原本就有計畫要來這裡,不過後來因為一些原因,就提前返國了。最終等到10月下旬的深秋,也盼到了連續幾日都是好天氣的日子,終於如願前來造訪! 每年10月下旬至11月上旬,是 下ノ廊下 的紅葉最盛期,也是登山客最多、最混雜的時期。其壯闊的峽谷絕景、險峻的斷崖峭壁、遠方覆上初雪的山岳景致、迷人的三段紅葉、還有途中有著被稱為「 秘湯中的秘湯 」的【 阿曾原溫泉 】,加上 一年之中只有極短時間可通行的條件 ,使得黑部峽谷【 下ノ廊下 】成為喜愛山岳之人無不嚮往造訪的山岳秘境。 黑部峽谷自古就是人跡罕至的秘境而廣為人知,江戶時代也因加賀藩的國境警備和森林管理而禁止進入,僅黑部奧山廻御用之役人在此巡邏。明治時代以後對外開放,黑部也成為眾多登山家的目標。其中,冠松次郎因致力探索峽谷而有「黑部之父」的稱號。 黑部峽谷以黑部湖(黑部水壩)為境,可分為 下之廊下 、 上之廊下 ,以及 奧之廊下 。「廊下」是山岳用語,意指「 絕壁之間的深谷 」,而「下之廊下」相當於黑部峽谷的心臟地帶,花崗岩岩壁間的激流從下游起形成白龍峽、十字峽、S字峽等景點。 由於行走於距離河面數十至上百公尺的斷崖峭壁間,許多區間寬度又十分窄小,是有點危險的路線, 每年都有人在這裡不慎摔死 (今年也不例外)。 日本國土地理院地圖(下之廊下) 據說今年秋天日本的下雨天數特別多

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

熱門文章

[轉載] 洛克菲勒寫給兒子的38封信(全文)

May 2023【台中南屯】地雷店食記|森鐵板燒|用餐體驗差,價格超貴卻豪無價值。小心別踩雷!!!

Jun 24~25, 2022【南橫三星】庫哈諾辛山+【南臺首嶽】關山(進涇橋登山口)|2天1夜野營登山

September, 2012 白姑大山二天一夜~其實沒那麼累,只是路途遙遠

Sep, 2021【苗栗南庄】蓬萊林道Off Road小試|雨後很爛很濕滑|二傳低底盤車勿輕易嘗試

Sep, 2023【桃園龍潭】輕鬆登頂石門山欣賞石門水庫湖光山色|景春步道+小竹坑古道O型路線午後健行

Nov 20, 2022【新北烏來】信賢步道健行~輕鬆好走的生態步道,還可順遊內洞森林遊樂區

Feb 2023【台中和平】裡冷林道Off Road單車野營~順登谷關七雄之首八仙山!單車+野營+登山,三個願望一次滿足

May 2023【台中潭子】新田登山步道1+3+5號步道O型環走|噴汗爬1063木棧階梯、順登小百岳聚興山

Mar 12, 2022【重機一日遊】走北橫至宜蘭,經梨山、武嶺下埔里,再走台三線回桃園|16小時的半圈環島

文章列表

Contact

名稱

以電子郵件傳送 *

訊息 *