2011
Sep
25
官方文件
Yahoo! BBauth 開發步驟
- 註冊Yahoo API
- 你必需先到 https://developer.apps.yahoo.com/projects 註冊一個Project
- 使用者登入,並取得 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
- public function sig_validate( ) {
- $ts = $_GET["ts"]; // the current unix time
- $sig = $_GET["sig"]; // the signature of the request
- $relative_url = getenv( 'REQUEST_URI' );
- $match = array();
- // The signature is a 32 character hex string, and is the last
- // parameter at the end of the request.
- $match_rv = preg_match( "/^(.+)&sig=(\w{32})$/", $relative_url, $match);
- if ( $match_rv == 1 ) {
- if ($match[2] != $sig ) {
- $rv = array( "status" => false,
- "error" =>"Duplicate sig parameters passed?: $sig, " . $match[2] );
- return $rv;
- }
- }
- else {
- $rv = array( "status" => false,
- "error" =>"Missing or invalid sig parameter" );
- return $rv;
- }
- // at this point, the url looks valid, and the sig was parsed from the url
- $relative_url_without_sig = $match[1];
- // Check that the ts parameter is within 600 seconds of the current time
- $current_time = time();
- $clock_skew = abs($current_time - $ts);
- if ( $clock_skew >= 600 ) {
- $rv = array( "status" => false,
- "error" => "invalid timestamp: clock_skew is $clock_skew seconds" );
- return $rv;
- }
- // now calculate the signature, and verify that the resulting signature
- // equals what was passed to us
- $sig_input = $relative_url_without_sig . $this->secret;
- $calculated_sig = md5($sig_input);
- if ( $calculated_sig == $sig ) {
- $rv = array( "status"=> true );
- }
- else {
- $rv = array( "status" => false,
- "error" => "calculated_sig $calculated_sig does not match sig parameter $sig" );
- }
- return $rv;
- }
Yahoo! BBAuth 會員註冊
- 回傳的url,為網站的首頁,Yahoo! BBAuth API不能指定 CallBack URL,所以只能在首頁插入檢查機制,可以檢查回傳值是否存在 appdata。
- 因為Yahoo! BBAuth 不會回傳 email 資料,所以可以利用取得的 userhash ,當成 account,新增至會員DB中。
Example
- if(isset($_GET['appdata']) && $_GET['appdata']=='yahoo'){
- //check signature
- $account = $_GET['userhash'];
- if(!isMember($account)){
- register($account);
- }
- }
回應 (Leave a comment)