2010-06-02 3 views
2

내 사용자에게 Google 오픈 ID를 던지도록 권한을 추가하려고합니다. ID (https://www.google.com/accounts/o8/id?id=AIt...Ew-Bo)를 받고 있지만 어떻게 합법적인지 확인할 수 있습니다. 나는 사용자가 다른 사용자의 전자 메일로 악의적 인 요청을 만들 수 있음을 의미합니다. 어떻게 전자 메일을 반환하는지 확인하고 ID가 합법적이라고 주장 할 수 있습니까?Google openid 응답을 확인하는 방법

+0

아마 오해 해요,하지만 ID를 생성하기 전에 확인 이메일을 구글하지 않는 이유는 무엇입니까? – barrycarter

답변

0

Google의 OpenID (Google OpenID for Google 제외)는 표준 OpenID입니다. 어설 션이 합법적인지 확인하기 위해 다른 OpenID가 요구하는 모든 예방 조치를 취해야합니다. 당신 말이 맞습니다 ... RP가 서명을 확인하고 식별자에 대한 검색을 수행하고 해당 식별자에 대한 인증 된 OP 끝점을 응답에 서명 한 것과 일치시키지 않는 한 누구나 RP를 속일 수있는 OpenID 긍정 어설 션을 만들 수 있습니다.

이메일 주소를 신뢰할 수 있는지 여부는 귀하에게 달려 있습니다. Google OP 엔드 포인트를 신뢰하도록 선택할 수 있습니다.

2

직접 검색 및 서명 확인을 구현하는 대신이 목적으로 이미 만들어진 많은 라이브러리 중 하나를 사용해야합니다. 여기에 다양한 프로그래밍 언어에 대한 무리입니다

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

-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; 
    } 
} 
+0

응답 데이터가 $ _POST에있을 수 있으므로 $ _GET을 사용해서는 안됩니다. – AlBeebe

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