如何验证谷歌openid响应

时间:2010-06-02 11:49:48

标签: openid google-openid

我正在尝试向我的用户添加授权throw google openid。我收到了身份证(https://www.google.com/accounts/o8/id?id=AIt...Ew-Bo),但我怎么能检查它是否合法。我的意思是用户可以使用其他用户的电子邮件创建恶意请求,我如何检查返回的电子邮件和声明的ID是否合法?

4 个答案:

答案 0 :(得分:2)

您应该使用已经为此目的创建的众多库中的一个,而不是尝试自己实现发现和签名验证。以下是各种编程语言的一堆:

http://openid.net/developers/libraries/

答案 1 :(得分:1)

public function verify_response()
       {$params=$_REQUEST;
        $query=array('openid.signed'=>$params['openid.signed'],
                     'openid.sig'=>$params['openid.sig'],
                     'openid.mode'=>'check_authentication'
                    );
        $keys=explode(',', 'openid.'.strtr($params['openid.signed'], array(','=>',openid.')));
        foreach ($params as $k=>$v)
                {if (in_array($k, $keys))
                    {$query[$k]=$v;
                    }
                }
        $query=http_build_query($query);
        $response=file_get_contents($params['openid.op_endpoint'].'?'.$query);
        return stripos($response, 'is_valid:true')!==false;
       }

答案 2 :(得分:0)

Google的OpenID(Google Apps for Domains OpenID除外)只是标准的OpenID。您应该采取任何其他OpenID所需的所有预防措施,以确保断言是合法的。你是对的......除非你的RP验证签名,对标识符执行发现并将该标识符的授权OP端点与签署响应的那个端点匹配,否则任何人都可以制作一个OpenID肯定断言来欺骗你的RP。

至于您是否可以信任该电子邮件地址,这取决于您。您可以选择信任Google OP端点,然后您就知道了。

答案 3 :(得分:-1)

function ValidateWithServer(){
    $params = array(
        'openid.assoc_handle' => urlencode($_REQUEST['openid_assoc_handle']),
        'openid.signed' => urlencode($_REQUEST['openid_signed']),
        'openid.sig' => urlencode($_REQUEST['openid_sig'])
    );
    // Send only required parameters to confirm validity
    $arr_signed = explode(",",str_replace('sreg.','sreg_',$_REQUEST['openid_signed']));
    for ($i=0; $i<count($arr_signed); $i++){
        $s = str_replace('sreg_','sreg.', $arr_signed[$i]);
        $c = $_REQUEST['openid_' . $arr_signed[$i]];
        // if ($c != ""){
            $params['openid.' . $s] = urlencode($c);
        // }
    }
    $params['openid.mode'] = "check_authentication";

    $openid_server = $this->GetOpenIDServer();
    if ($openid_server == false){
        return false;
    }
    $response = $this->CURL_Request($openid_server,'POST',$params);
    $data = $this->splitResponse($response);

    if ($data['is_valid'] == "true") {
        return true;
    }else{
        return false;
    }
}