2010-06-02 2 views
2

Я пытаюсь добавить авторизацию throw google openid своим пользователям. Я получаю id (https://www.google.com/accounts/o8/id?id=AIt...Ew-Bo), но как я могу проверить, что это законно. Я имею в виду, что пользователь может создать вредоносный запрос с электронной почтой другого пользователя, как я могу проверить, что возвращаемый адрес электронной почты и заявленный идентификатор являются законными?как проверить ответ google openid

+0

Я, наверное, недоразумение, но не Google сделать это письмо проверки для вас, прежде чем создавать идентификатор? – barrycarter

ответ

0

OpenID Google (для Google Apps для доменов OpenID исключен) является стандартным OpenID. Вы должны принять все меры предосторожности, которые любой другой OpenID требует, чтобы утверждение было законным. Вы правы ... любой может создать положительное утверждение OpenID, чтобы обмануть ваш RP, если ваш RP не проверит подпись, не выполнит обнаружение в идентификаторе и не сопоставляет авторизованную конечную точку OP для этого идентификатора с тем, который подписал ответ.

Что касается доверия к электронной почте, это зависит от вас. Вы можете доверять конечной точке 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

Вы не должны полагаться на $ _GET, потому что данные ответа могут быть в $ _POST. – 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; 
     } 
Смежные вопросы