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)