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);
- }
- }