2011
Sep
25

官方文件

Yahoo! BBauth 開發步驟

  • 註冊Yahoo API
  • 使用者登入,並取得 Token
  • 判定 Response 是否正確
  • Out website 自動註冊帳號與登入。
  • Get WSSID and Cookie

Yahoo! BBAuth 取得token

  • 取得 token 的 api 路徑: https://api.login.yahoo.com/WSLogin/V1/wslogin
  • Request 參數
    • appid : 申請到的 application ID
    • appdata : 加密用的字串,自行定義即可
    • send_userhash : 設定 send_userhash=1 ,yahoo就會回傳一個登入者的 user id(加密過的
    • ts 時間
    • sig 加密字串,供 Yahoo! 比對:sig=md5( "/WSLogin/V1/wslogin?appid=$appid&appdata=$appdata&ts=$ts&sig=$secret" );
  • Response 回傳資料如下
    • token :一組密碼,可以取得使用者資料,使用期限為14天
    • userhash : 使用者代號,代表目前登入的 Yahoo User,不過這是加密過的資料,一個很長的字串。
    • sig : 比對用的字串,驗證回傳值是否正確,這裡一定要做驗證,不然會有被駭客攻擊的可能。

Yahoo! BBAuth 比對token是否正確

由Yahoo! 所回傳的網址中,取得 REQUEST_URI , timestamp ,以及自已api所給的 secret , 用md5 加密後,再與 Yahoo! 回傳的sig 比對。
Example
  1. public function sig_validate( ) {
  2. $ts = $_GET["ts"]; // the current unix time
  3. $sig = $_GET["sig"]; // the signature of the request
  4. $relative_url = getenv( 'REQUEST_URI' );
  5. $match = array();
  6.  
  7. // The signature is a 32 character hex string, and is the last
  8. // parameter at the end of the request.
  9. $match_rv = preg_match( "/^(.+)&sig=(\w{32})$/", $relative_url, $match);
  10.  
  11. if ( $match_rv == 1 ) {
  12. if ($match[2] != $sig ) {
  13. $rv = array( "status" => false,
  14. "error" =>"Duplicate sig parameters passed?: $sig, " . $match[2] );
  15. return $rv;
  16. }
  17. }
  18. else {
  19. $rv = array( "status" => false,
  20. "error" =>"Missing or invalid sig parameter" );
  21. return $rv;
  22. }
  23.  
  24. // at this point, the url looks valid, and the sig was parsed from the url
  25. $relative_url_without_sig = $match[1];
  26.  
  27. // Check that the ts parameter is within 600 seconds of the current time
  28. $current_time = time();
  29. $clock_skew = abs($current_time - $ts);
  30. if ( $clock_skew >= 600 ) {
  31. $rv = array( "status" => false,
  32. "error" => "invalid timestamp: clock_skew is $clock_skew seconds" );
  33. return $rv;
  34. }
  35.  
  36. // now calculate the signature, and verify that the resulting signature
  37. // equals what was passed to us
  38. $sig_input = $relative_url_without_sig . $this->secret;
  39. $calculated_sig = md5($sig_input);
  40. if ( $calculated_sig == $sig ) {
  41. $rv = array( "status"=> true );
  42. }
  43. else {
  44. $rv = array( "status" => false,
  45. "error" => "calculated_sig $calculated_sig does not match sig parameter $sig" );
  46. }
  47. return $rv;
  48. }

Yahoo! BBAuth 會員註冊

  • 回傳的url,為網站的首頁,Yahoo! BBAuth API不能指定 CallBack URL,所以只能在首頁插入檢查機制,可以檢查回傳值是否存在 appdata。
  • 因為Yahoo! BBAuth 不會回傳 email 資料,所以可以利用取得的 userhash ,當成 account,新增至會員DB中。
Example
  1. if(isset($_GET['appdata']) && $_GET['appdata']=='yahoo'){
  2. //check signature
  3. $account = $_GET['userhash'];
  4. if(!isMember($account)){
  5. register($account);
  6. }
  7. }

檔案下載


回應 (Leave a comment)