Yahoo! BBAuth 單一登入 設定 / 教學 / 問答(PHP)

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 申請

  1. Developer Dashboard 申請
  2. Browser-Based Authentication Protected Applications
  3. 點選 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
  4. 點選 Continue
  5. 出現類似下面的訊息:

    Phrase: "# her sailed we the noon fixed till quietly onhad ocean to"
    File: "ydnqrSsok.html"
    Url to Check: "http://example.com/ydnqrSsok.html"

  6. vim ydnqrSsok.html # 將上述的全部訊息, 完整貼入此檔案, 再放到您的 web 目錄下.(Url to Check 連結要可以存取到)
  7. 點 Check Domain # 會看到 Result: Pass
  8. 點 Continue
  9. 取得 Application ID 和 Shared Secret.
  10. 點 Finished 即可.

程式 Library + 範例

  1. wget http://developer.yahoo.com/auth/quickstart/bbauth_quickstart.zip # 於 Browser-Based Authentication 取得 Library
  2. unzip bbauth_quickstart.zip
  3. mv bbauth_quickstart/ybrowserauth.class.php4 /var/www/ # 假設 web 目錄在 /var/www
  4. mv bbauth_quickstart/ybrowserauth.class.php5 /var/www/
  5. mv bbauth_quickstart/AUTH_ONLY/test.php /var/www/index.php # 範例程式
  6. vim /var/www/index.php

    define("APPID", '');
    define("SECRET", '');
    改成 剛剛上面取得的 Application ID 和 Shared Secret 即可.
  7. 再來就可以到 http://example.com/index.php , 就會看到 Click here to authorize 的連結.
  8. 點下去就會導到 Yahoo! Login.
  9. 登入完成後, 就會導回之前設定導回的網址.

常見問答

  1. 登入完成, 重新回到 http://example.com/index.php, 還是會出現 Click here to authorize 的連結?
    • 登入完成導回去時會取得一個 user hash, 紀錄此 user hash 後, 要給 User 塞 Cookie / Session 就是自己的事, Y! 不會幫你塞 Cookie 或 Session.
  2. Y! BBAuth 如何登出?
    • Y! BBAuth 本身就沒有紀錄任何 Cookie / Session, 所以不需要做登出.
    • 要登出只需在自己網站中, 將此 User 的 Cookie / Session 清除, 正常登出該怎麼做, 就那樣子做即可~ 🙂
  3. 如何辨認 Token 對應的 User 是哪個? (Y! 並不會回傳帳號名稱)
    • Y! 不會回傳帳號名稱, 只會回傳一個 user hash, 那串 user hash 的亂碼是唯一值, 且不會改變, 必須將此 user hash 值與 DB 中的 User 帳號做對應.
  4. 需要會員填寫其它資料, 是否需要自己再做註冊功能?
    • 要, bbAuth 只是讓使用者用 Y! 帳號可以做登入, 不需要每個網站都另外記住帳號、密碼, 但是登入完成後, 如果需要除了登入以外的資訊, 一樣要走註冊流程(註冊帳號、Email 等等.) (註: 密碼不用. XD)
  5. 如果網站還是需要註冊, 那登入、註冊等流程應該是如何?
    • Y! 登入 -> 網站(有註冊) -> 由 Token 取得 User 資料 -> 寫 Cookie / Session -> 完成登入
    • Y! 登入 -> 網站(沒註冊) -> 取得 Token -> 註冊(DB 要有一個欄位紀錄 Token 值) -> 註冊完成後走上面 "有註冊" 的流程. 
  6. DB 除了本身該存的, 去掉密碼欄位外, 有哪些欄位需要新增呢? (註: 不確定正確長度, 所以都取比較長)
    • user_hash char(32) # 若有 使用者帳號, 可以用 使用者帳號 來代替.
    • token varchar(64) # 14 天的生命週期, 若有存取 API, 過 14 天要記得更新.
    • token_date datetime # 取得 新 Token 的時間. (ex: time() - strtotime($token_date) > 14 * 86400)

常用程式 筆記

  1. 下述程式的 $auth_obj 是這樣子產生的.

    require('ybrowserauth.class.php');
    $auth_obj = new YBrowserAuth(APPID, SECRET);

  2. 未登入, 要如何導去 Y! 的登入頁

    /* 未登入, 下述會自動導到 Y! 的登入頁 */
    // 登入完成後希望 Y! 帶回來的資訊
    // 這邊是帶他從哪邊過去的.(之後登入完成, 自己做要轉去哪邊的動作)
    $from = 'http://example.com/';
    if (!$_GET['token']) {
        header('Location: ' . $auth_obj->getAuthURL($from, true));
        exit;
    }

  3. 已完成登入後的檢查

    /* 已登入完成 */
    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;
    }

相關網頁

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈Yahoo! BBAuth 單一登入 設定 / 教學 / 問答(PHP)〉中有 13 則留言

  1. 嗯嗯, Y! OpenID ? 是只 Y!OAuth?
    這個我之前試也是可以正常運作, 只是出來一個很大的警告視窗, 然後, 現在我的帳號還是有問題, 沒辦法正常拿到 Key 就是了. 🙁

  2. 您好我使用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?我回傳時沒有此項

  3. token, token_date => 如果要存取 Y! API, 需要這兩個資料.(token_date 過期, 就需要重新再要新的 key)
    user_hash 一定會回傳, 應該是 $auth_obj->userhash; 🙂

  4. 你好:
    我依照你的步驟執行,但認証卻沒辦法通過,
    出錯的環節在於yahoo所發出的calculated_sig和我所取得的sig是不相同的
    不知道你是否也有遇過相同情形? 謝謝!

  5. 我一樣是使用壓縮檔裏面的所附的test.php測試
    將取得的Application ID 和 Shared Secret填入以下
    define("APPID", '取得的appid');
    define("SECRET", '取得的secret');

  6. 我是沒遇到過, 如果要 debug 的話, 我會把中途的所有變數都印出來看看, 看是哪邊有問題, 再一步一步核對是哪步驟的問題.

  7. 請問一下Yahoo BBAuth是不是已經停用了
    因為我到站主寫的網址去下載library
    但它卻顯示該網頁已經不存在了

路人 發表迴響取消回覆

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料