Yahoo! BBAuth 是做帳號單一登入, 就是使用 Y! 的帳號, 也可以登入你的網站.
同類的有 OpenID / Yahoo! OAuth.
照理說, 以後應該都會走 OpenID 或 OAuth, 那為何要寫 BBAuth? 為何不用 OpenID 或 Yahoo! OAuth?
- OpenID: 太長了, 自己都懶得打, 放棄~
- Y! OAuth: 照理說應該要用這個, 但是遇到一堆問題:
- 第一次用遇到 Security 問題, 跳出警告視窗(那警告視窗看到就覺得死定了).
- 第二次用遇到 Y! DB unsync, 每次 Reload YDN 的 Dashboard 出來的值都不一樣(登入異常)
總之, 使用 Y! OAuth 的經驗真是很糟糕, 還是先繼續用 Y! BBAuth 吧.
註: 此篇主要是設定 + 登入的部份, 如何存取 Y! API 的部份在此篇不提.
Y! BBAuth 申請
- 於 Developer Dashboard 申請
- Browser-Based Authentication Protected Applications
- 點選 New Application # 填選下列資料
- Authentication method => Browser Based Authentication
- Developer/Company Name => 開發者 或 公司名字
- Product name => 產品名稱
- Web Application URL => 產品網址, ex: http://example.com/
- BBAuth Success URL => 登入完成後要導去哪個網址, ex: http://example.com/
- Contact email => 你的連絡信箱
- Required access scopes => 選 Single Sign On, No user data can be accessed
- 點選 Continue
- 出現類似下面的訊息:
Phrase: "# her sailed we the noon fixed till quietly onhad ocean to"
File: "ydnqrSsok.html"
Url to Check: "http://example.com/ydnqrSsok.html" - vim ydnqrSsok.html # 將上述的全部訊息, 完整貼入此檔案, 再放到您的 web 目錄下.(Url to Check 連結要可以存取到)
- 點 Check Domain # 會看到 Result: Pass
- 點 Continue
- 取得 Application ID 和 Shared Secret.
- 點 Finished 即可.
程式 Library + 範例
- wget http://developer.yahoo.com/auth/quickstart/bbauth_quickstart.zip # 於 Browser-Based Authentication 取得 Library
- unzip bbauth_quickstart.zip
- mv bbauth_quickstart/ybrowserauth.class.php4 /var/www/ # 假設 web 目錄在 /var/www
- mv bbauth_quickstart/ybrowserauth.class.php5 /var/www/
- mv bbauth_quickstart/AUTH_ONLY/test.php /var/www/index.php # 範例程式
- vim /var/www/index.php
將
define("APPID", '');
define("SECRET", '');
改成 剛剛上面取得的 Application ID 和 Shared Secret 即可. - 再來就可以到 http://example.com/index.php , 就會看到 Click here to authorize 的連結.
- 點下去就會導到 Yahoo! Login.
- 登入完成後, 就會導回之前設定導回的網址.
常見問答
- 登入完成, 重新回到 http://example.com/index.php, 還是會出現 Click here to authorize 的連結?
- 登入完成導回去時會取得一個 user hash, 紀錄此 user hash 後, 要給 User 塞 Cookie / Session 就是自己的事, Y! 不會幫你塞 Cookie 或 Session.
- Y! BBAuth 如何登出?
- Y! BBAuth 本身就沒有紀錄任何 Cookie / Session, 所以不需要做登出.
- 要登出只需在自己網站中, 將此 User 的 Cookie / Session 清除, 正常登出該怎麼做, 就那樣子做即可~ 🙂
- 如何辨認 Token 對應的 User 是哪個? (Y! 並不會回傳帳號名稱)
- Y! 不會回傳帳號名稱, 只會回傳一個 user hash, 那串 user hash 的亂碼是唯一值, 且不會改變, 必須將此 user hash 值與 DB 中的 User 帳號做對應.
- 需要會員填寫其它資料, 是否需要自己再做註冊功能?
- 要, bbAuth 只是讓使用者用 Y! 帳號可以做登入, 不需要每個網站都另外記住帳號、密碼, 但是登入完成後, 如果需要除了登入以外的資訊, 一樣要走註冊流程(註冊帳號、Email 等等.) (註: 密碼不用. XD)
- 如果網站還是需要註冊, 那登入、註冊等流程應該是如何?
- Y! 登入 -> 網站(有註冊) -> 由 Token 取得 User 資料 -> 寫 Cookie / Session -> 完成登入
- Y! 登入 -> 網站(沒註冊) -> 取得 Token -> 註冊(DB 要有一個欄位紀錄 Token 值) -> 註冊完成後走上面 "有註冊" 的流程.
- DB 除了本身該存的, 去掉密碼欄位外, 有哪些欄位需要新增呢? (註: 不確定正確長度, 所以都取比較長)
- user_hash char(32) # 若有 使用者帳號, 可以用 使用者帳號 來代替.
- token varchar(64) # 14 天的生命週期, 若有存取 API, 過 14 天要記得更新.
- token_date datetime # 取得 新 Token 的時間. (ex:
time() - strtotime($token_date) > 14 * 86400
)
常用程式 筆記
- 下述程式的 $auth_obj 是這樣子產生的.
require('ybrowserauth.class.php');
$auth_obj = new YBrowserAuth(APPID, SECRET); - 未登入, 要如何導去 Y! 的登入頁
/* 未登入, 下述會自動導到 Y! 的登入頁 */
// 登入完成後希望 Y! 帶回來的資訊
// 這邊是帶他從哪邊過去的.(之後登入完成, 自己做要轉去哪邊的動作)
$from = 'http://example.com/';
if (!$_GET['token']) {
header('Location: ' . $auth_obj->getAuthURL($from, true));
exit;
} - 已完成登入後的檢查
/* 已登入完成 */
if ($auth_obj->validate_sig()) { // 檢查登入結果是否正確
$hash = $auth_obj->userhash; // 取得 User hash (token)
$from = $auth_obj->appdata; // getAuthURL 帶的資料.(我們希望 Y! 帶回來的資料)
} else { // 登入失敗, 秀出 Y! 的 錯誤訊息.
$error = '登入失敗' . display_html($auth_obj->sig_validation_error);
exit;
}
報告,Yahoo OpenID 和 Google 的一樣,可以不帶 username 過去,只要帶固定的 http://yahoo.com 過去即可,yahoo 登入頁面上可自己輸入帳號密碼。
嗯嗯, Y! OpenID ? 是只 Y!OAuth?
這個我之前試也是可以正常運作, 只是出來一個很大的警告視窗, 然後, 現在我的帳號還是有問題, 沒辦法正常拿到 Key 就是了. 🙁
我也遇到同样的问题
用起来还不是很方便
嗯嗯, 所以還是先用 bbAuth 吧, 目前都沒遇過什麼問題. 🙂
您好我使用bbauth時,登入後網址到我的目標網址後get字串有appid、token、appdata、ts、sig.
user_hash char(32) # 若有 使用者帳號, 可以用 使用者帳號 來代替.
token varchar(64) # 14 天的生命週期, 若有存取 API, 過 14 天要記得更新.
token_date datetime # 取得 新 Token 的時間.
可以為我解答一下以上三個要存入DB的欄位與回傳字串之間的關係!
token=token?
token_date=ts?
user_hash?我回傳時沒有此項
token, token_date => 如果要存取 Y! API, 需要這兩個資料.(token_date 過期, 就需要重新再要新的 key)
user_hash 一定會回傳, 應該是 $auth_obj->userhash; 🙂
感謝TSUNG版主回答
你好:
我依照你的步驟執行,但認証卻沒辦法通過,
出錯的環節在於yahoo所發出的calculated_sig和我所取得的sig是不相同的
不知道你是否也有遇過相同情形? 謝謝!
呃, 沒有耶, 你有用他的程式來做驗證嗎?
我一樣是使用壓縮檔裏面的所附的test.php測試
將取得的Application ID 和 Shared Secret填入以下
define("APPID", '取得的appid');
define("SECRET", '取得的secret');
我是沒遇到過, 如果要 debug 的話, 我會把中途的所有變數都印出來看看, 看是哪邊有問題, 再一步一步核對是哪步驟的問題.
請問一下Yahoo BBAuth是不是已經停用了
因為我到站主寫的網址去下載library
但它卻顯示該網頁已經不存在了
應該是停用了, 現在都要大家用 oAuth.