Implement Yahoo Login (Using BBAuth)

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了。


參考來源





read more »


Java static,final 基本概念

09 March 2011

從很久以前我就了解到,

不僅僅要知道know how,

還要知道know why,

舉個例子,當我派工作給底下的人做時,

例如要他做出一個發送mail的功能出來,

恩,拜Google大神所賜,通常很快都可以找到發送mail的code。

但是當我細下去問每一行code的用途時,

大多是...."恩...不知道"。

我覺得此風不可長。

甚至有些學弟們搞不清楚何時要用static、final。

也不懂甚麼是interface、abstract等等之類的。

因為他們也不知道這些東西的作用。

所以用這篇文章來稍微解說一下。

static:

靜態的意思

可以用來宣告一個函數或者變數,

只要記得當一個函數或者變數被宣告為static時,

他就具有唯一值的概念!!

他就永遠只佔著那一組記憶體空間。

不管該類別被new幾個object,該值永遠都會是一樣的!

舉個例子!

我們看到下面code的例子

class test{
static int iValue = 0;
public test() {
}
}
public class main {
public static void main(String[] argv) {
test test1 = new test();
test test2 = new test();
System.out.println(test1.iValue);
test2.iValue = 10;
System.out.println(test2.iValue);
System.out.println(test1.iValue);
}
}



我們把test這個類別裡的資料成員iValue宣告為static,

然後再main裡面分別去new兩個object出來。

分別是test1, test2,

然後先印出test1的iValue出來,(印出0,當然!一開始是0)

接著我們用test2這個object去將iValue設值設為10,

接著再去印出test2的iValue出來,(印出10出來,當然!因為設成10了阿)

重點來了!

這時候再印出test1的iValue出來!

大部分的人會覺得,應該是印出0阿,

但是印出的是10。

原因是因為我們將iValue宣告成static了。

而iValue成為一個共同的變數。

這就是static 的一個特性!

特性一:永遠會是一個唯一值!!


且static 還有一個特性,

特性二:static可以透過類別直接存取使用!

意思是我們其實不需要new 一個object出來。

也可以透過類別直接去存取該變數

例子如下!

class test{
static int iValue = 0;
public test() {
}
}
public class main {
public static void main(String[] argv) {
System.out.println(test.iValue);
}
}



你會發現在main中,我們並沒有new一個object出來!!

也可以存取到test這個類別中的資料成員(iValue)

static的介紹大概到這,

接著介紹final

final:

相較於static,final的概念就容易了解許多!

可以用來宣告一個類別、函數、或者變數。

類別:當宣告在類別上時,該類別就無法被繼承!

函數:當一個函數被宣告為final時,則繼承他的子類別無法覆寫

變數:當一個變數被宣告為final時,意思是他是一個常數,是無法被修改的。


注意!

使用static final需要注意一點!!

如上面所述說的,當我們有一個常數要宣告時,

會宣告如下

public static final String strValue = "ken";

為什麼宣告這樣會有個風險呢?

因為java在進行compile的時候,

會將宣告成static final的變數,直接包進去程式裡面。

什麼意思呢?

System.out.println(strValue);

當你有類似存取strValue的code時,

我們去把java會把compile成的class,decompile來看

會發現它變成如下的code

System.out.println("ken");


好啊好啊,那到底風險又在哪?

當然啦,如果你今天有用一些好用的IDE進行開發,

應該是不會遇到這樣的風險,

以Eclipse為例,只要你一儲存或者執行,Eclipse就會幫你進行compile!
(如果有勾選Build Automatically的話)

可是如果你今天是徒法煉鋼!

自己下指令進行compile的時候...

又剛好你程式改了,把strValue的值改為"yang",

又剛好你忘記進行compile....

這時候...如果有人去存取strValue就會出錯!!

那怎麼解決???

我們可以利用static block來進行宣告的動作!!!

如下:

static String strValue;
static{
strValue = "ken";
}

如果用這樣的宣告方式,即可避免上面述說的問題!


原諒我,太累了。

今天就先講解static,final 基本概念

下篇在講解interface, abstract!!








read more »


實作 Facebook Login【舊版】

08 February 2011

這篇主要是在GAE上整合Facebook Login。

在整合之前得先做一些準備!

先講解三個基本運作條件。
  1. User Authentication. 首先Facebook會先去認證這個user,判斷它的帳密是否有誤。
  2. App Authorization. 第二步Facebook會先去認證你的網站,這可以保證user給予的基本資訊是給你的網站,而不是其他的。
  3. App Authentication. 第三步是可以保證user知道有那些較詳細的資料可以被你的網站挖掘。
知道基本運作條件以後,

請先至http://www.facebook.com/developers/此網站,

進去以後會看到下圖(圖一),並且點選圖中紅色方框中的按鈕Set Up New App。

圖一
點選以後, 如果先前並沒有開發過Facebook相關app的developer,

會見到下圖(圖二),告知您並沒有驗證過,請透過mobile phone or credit card驗證。(免費的)

這裡我們選擇moblie phone做驗證。

圖二
 點選圖二中的mobile phone以後,會見到下圖(圖三),會要求您輸入您的電話號碼,

記得要選取為台灣的國籍碼886,還有一點很重要!!!!

在Phone Number欄位中,填寫的手機號碼,記得把0拿掉!!!

如:963123123(不要加上0)


圖三

點下圖三中的Confirm按鈕以後,Facebook會回傳一組verify code至您的手機,

請將verify code輸入。並按下按鈕OK。驗證成功後會出現下圖(圖四)

圖四
 當驗證完成以後,再去點選圖一中紅色方框中的按鈕Set Up New App。


並且輸入App名稱,然後再點選圖五中的按鈕Create App。


圖五
完成以後,Facebook 會給予你這個app一些基本資訊(App ID、API Key、App Secret....etc)

接著得做一些設定,點選圖六中的方框中的連結Edit Settings

圖六
點選以後,會進到如下圖(圖七)的畫面,請先點選左方的Web Site ,接著就輸入一些相關資訊!


  1. Site URL:輸入您的網址(如:www.google.com)
  2. Site Domain:輸入您的domain(如:google.com)


圖七

完成上述設定步驟以後,就可以來寫code了喔!!!

注意!!! 底下的code已經不能使用了! 因為FB改版了!
所以請至另一篇來看如何實作!

首先,請在你的加入facebook的script。

如底下:

<script src="http://connect.facebook.net/en_US/all.js"></script>



接著就輸入下段code!

<script>
//先做init的動作,輸入自己的app id
FB.init({
appId:'你自己的app id',
cookie:true,
status:true,
xfbml:true
});

//接著去subscribe一個event,就是去監聽一個event
//這邊去監聽有關login的event。(也就是說login成功以後,會接收到訊息)
FB.Event.subscribe('auth.login', function(response) {
if (response.session) {
alert('login success');//登入成功
} else {
alert('login fail');
}
});
</script>



完成以後就在你的頁面上,xfbml語法放置一個Facebook登入的button

如下:

<fb:login-button>Login with Facebook</fb:login-button>



這樣就大功告成了!!!







read more »