10 March 2011
想讓自己網站上的使用者不用註冊就可以使用自己的網站,

只要有Yahoo帳號就可以登入自己的網站的話,

可以導入Yahoo Login API,

而Yahoo Login API主要分成三種,

可以用下列三種認證/授權方式,

1. OAuth

2. OpenID

3. BBAuth

這邊選用第三種BBAuth,

首先要先去註冊你的appid,

點這裡來註冊

點開以後,會看到如下圖(圖一)的表格,

第一格Yahoo ID:不用自己填,會幫你填好

第二格Authentication method:點選第二個(Browser Based Authentication)

第三格Developer/Company Name:填寫自己的名稱或公司名稱

第四格Product Name:填寫產品名稱

第五格Web Application URL:是指你網站的網址(不能IP喔)

第六格BBAuth Success URL:這格很重要,意思是當使用者登入成功以後,下個頁面要轉到哪個頁面


第七格Contact Email:填入自己的信箱就好

第八格Phone Number:填入電話,這格為optional,可以不填

第九格Description of application:敘述

第十格Require Access Scope:這格也很重要!意思是說這個認證可以在Yahoo的哪些服務進行存取,這邊我們先勾選Single Sign On, no user data can be accessed就好


填寫完成以後就點選Continue,

圖一
點完按鈕Continue以後,會看到下圖(圖二)

這頁主要是要進行認證的動作,Yahoo要check這個domain是屬於你的!

做法是在自己的domain的根目錄底下放置一個.html檔案,

檔名yahoo會提供給你,這邊的檔名是ydnv6nnxP.html。

將此檔案放置在domain根目錄底下,

然後按下圖中的按鈕Check Domain,

此時Yahoo就會去request該.html檔,如果有放置上去,

就會通過驗證。就會如圖中的Result: Pass

如果是Pass,就繼續往下一步,按下按鈕Continue


圖二

點完Continue按鈕以後,會看到下圖(圖三)的畫面

代表申請成功,Yahoo會給你app id和secret


圖三

申請完成以後就開始來寫code了!!

這邊我以JSP/SERVLET為主,

try{
final String strAppId = "appID"; //應用程式碼
final String strSecrect = "secect"; //驗證用
String strTimeStamp = String.valueOf(new Date().getTime()/1000); //把毫秒轉成秒數

//接下來這段主要是在做md5,
MessageDigest Signature = MessageDigest.getInstance("MD5");
//下面這行是Yahoo要求要進行md5的參數
String tempMD5 = String.format("/WSLogin/V1/wslogin?appid=%s&.intl=tw&send_userhash=1&ts=%s%s", strAppId, strTimeStamp, strSecrect);
Signature.update(tempMD5.getBytes());

byte[] Bt = Signature.digest();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < Bt.length; ++i) {
byte b = Bt[i];
int value = (b & 0x7F) + (b < 0 ? 128 : 0);
buffer.append(value < 16 ? "0" : "");
buffer.append(Integer.toHexString(value));
}
//md5 結束

//進行完md5以後,就進行Redirect
resp.sendRedirect(String.format("https://api.login.yahoo.com/WSLogin/V1/wslogin?appid=%s&.intl=tw&send_userhash=1&ts=%s&sig=%s", strAppId, strTimeStamp, buffer.toString()));

}catch (Exception e) {
//MD5 Exception
}


在進行完redirect以後,就會轉向Yahoo登入的頁面,

登入完成就會將頁面導向之前第六格BBAuth Success的URL

接下來有比較重要的幾點,

由於Yahoo Login是無法取得使用者的資訊,

它不同於Facebook、Goolge Login,

可是一般的網站不是都要記住session嗎?

可能是將使用者帳號之類的資訊存在session裡面,

可是Yahoo卻無法存取到使用者相關資訊,

但是!Yahoo會回傳一個userhash,到第六格BBAuth Success的URL中,

而這個userhash是唯一的,不會有重複!

所以我們一樣可以利用此userhash存在session裡面,

還會回傳appid、token、appdata、ts、sig這些參數回來。

但比較重要的是userhash,因為這個是Unique的identifier!!

大致上這樣就完成一個Yahoo Login了。


參考來源







blog comments powered by Disqus