2009-11-16 3 views
1

Я пытаюсь получить ответ check_authentication, но пока все потребители отвергают его и говорят, что мой сервер отказал check_authentication.OpenID check_authentication не работает

Это GET и POST данные, которые получают мой файловый сервер:

$_GET: 
Array 
(
    [mode] => profile 
    [username] => hachque 
    [domain] => roket-enterprises.com 
) 
$_POST: 
Array 
(
    [openid_assoc_handle] => {HMAC-SHA1}{4b00d7b2}{vo1FEQ==} 
    [openid_identity] => http://www.roket-enterprises.com/openaccount/openid:hachque 
    [openid_mode] => check_authentication 
    [openid_response_nonce] => 2009-11-16T04:40:18Zrrz8R4 
    [openid_return_to] => http://openiddirectory.com:80/openidauth/id/c/finish_auth.php?nonce=adCevd6T 
    [openid_sig] => SgFE5iT9IGd5EftkrZ72mgCHiLk= 
    [openid_signed] => assoc_handle,identity,mode,response_nonce,return_to,signed,sreg.email,sreg.fullname,sreg.nickname 
    [openid_sreg_email] => [email protected] 
    [openid_sreg_fullname] => James Rhodes 
    [openid_sreg_nickname] => jrhodes 
) 

Это заголовок réponse, что я вывод (содержит данные POST, как это было объяснено мне на IRC, что посылая кнопочный значения в качестве заголовков не должны выполняться на потребительском сервере EDIT: Придумайте это, это не имеет особого смысла ОТВЕТИТЬ с данными POST. Возможно, некоторые из них могут объяснить весь процесс проверки подлинности).

Content-Type: text/plain; 
    Content-Length: 675; 
    openid.mode=id_res&openid.assoc_handle=%7BHMAC-SHA1%7D%7B4b00d7b2%7D%7Bvo1FEQ%3D%3D%7D&openid.identity=http%3A%2F%2Fwww.roket-enterprises.com%2Fopenaccount%2Fopenid%3Ahachque&openid.response_nonce=2009-11-16T04%3A40%3A18Zrrz8R4&openid.return_to=http%3A%2F%2Fopeniddirectory.com%3A80%2Fopenidauth%2Fid%2Fc%2Ffinish_auth.php%3Fnonce%3DadCevd6T&openid.signed=assoc_handle%2Cidentity%2Cmode%2Cresponse_nonce%2Creturn_to%2Csigned%2Csreg.email%2Csreg.fullname%2Csreg.nickname&openid.sreg_email=jrhodes%40roket-enterprises.com&openid.sreg_fullname=James+Rhodes&openid.sreg_nickname=jrhodes&openid.sig=MGVhMmQ1Mzg4ZWFlMWY1OWVlYjlmZmY0Njc3OTc5YWIzMjM3NGFjMQ%3D%3D&openid.is_valid=true; 

Это PHP код, который мой файл используется для обработки check_authentication (помните, что PHP превращает все. Символов в _ за $ _GET и $ _POST переменных, так как они не являются действительными символов в PHP массива ключи):

 // Retrieve the OpenID information from the $_REQUEST data 
     // I'm not sure whether it's possible that this data might 
     // come in on the $_GET parameter instead of $_POST, so that's 
     // what it uses $_REQUEST. 

     $assoc_handle = $_REQUEST['openid_assoc_handle']; 
     $sig = $_REQUEST['openid_sig']; 
     $signed = $_REQUEST['openid_signed']; 

     // The method for returning data is via the headers outputted 
     // by the webserver. Create an array that stores the headers 
     // to be returned. 

     $keys = array(
      'openid.mode' => 'id_res', 
      'openid.assoc_handle' => $_REQUEST['openid_assoc_handle'], 
      'openid.identity' => $_REQUEST['openid_identity'], 
      'openid.response_nonce' => $_REQUEST['openid_response_nonce'], 
      'openid.return_to' => $_REQUEST['openid_return_to'], 
      'openid.signed' => $_REQUEST['openid_signed'], 
      'openid.sreg_email' => $_REQUEST['openid_sreg_email'], 
      'openid.sreg_fullname' => $_REQUEST['openid_sreg_fullname'], 
      'openid.sreg_nickname' => $_REQUEST['openid_sreg_nickname'] 
      //'openid_mode' => 'id_res' 
     ); 

     // The server may request that we invalidate the user's session 
     // via $_REQUEST['openid_invalidate_handle']. In this case we 
     // will clear the session data (you may need to change this 
     // depending on how you implement the session). After doing so 
     // we continue and tell the server we did via a variable 

     if (strlen($_REQUEST['openid_invalidate_handle']) > 0) 
     { 
      // Reset the session 
      session_unset(); 
      session_name('openid_server'); 
      session_start(); 

      // Set the header we need to return 
      $keys['openid.invalidate_handle'] = $_REQUEST['openid_invalidate_handle']; 
     } 

     // We need to validate the signature now. This constructs a token_contents 
     // for signing the data. The signing key is returned as openid.sig 
     // and is generated with base64(HMAC(secret(assoc_handle), token_contents) 

     $token_contents = ''; 
     foreach (explode(',', $signed) as $param) { 
      $post = preg_replace('/\./', '_', $param); 
      $token_contents .= sprintf("%s:%s\n", $param, $_REQUEST['openid_' . $post]); 
     } 

     // Generate our openid.sig and add it to the list of keys to 
     // return. 

     $keys['openid.sig'] = base64_encode(hash_hmac('sha1',$token_contents,$assoc_handle)); 

     // Add the data that we are sharing (via SReg) to the headers. 
     // For now this is fixed data (see action_authorization.php). 
     //$keys["sreg.fullname"] = 'James Rhodes'; 
     //$keys["sreg.nickname"] = 'jrhodes'; 
     //$keys["sreg.email"] = '[email protected]'; 

     // Just accept the request for now.. 
     // phpMyID does some kind of secret-shared-key thing 
     // here to determine whether it is valid. I'm not 
     // quite sure how that process works yet, so we are just 
     // going to say go ahead. 
     $keys["openid.is_valid"] = "true"; 

     // We need to format the $keys array into POST format 
     $keys_post = ""; 
     $keys_post_first = true; 
     foreach ($keys as $name => $value) 
     { 
      if ($keys_post_first) 
       $keys_post_first = false; 
      else 
       $keys_post .= "&"; 
      $keys_post .= urlencode($name) . "=" . urlencode($value); 
     } 

     // Now output the POST data 
     header('Content-Type: application/x-www-form-urlencoded'); 
     header('Content-Length: ' . strlen($keys_post)); 
     header($keys_post); 

Может ли кто-нибудь помочь мне с моей проблемой? Я пытался получить эту работу в течение нескольких месяцев, и я не могу получить прямой ответ о том, как этот этап аутентификации OpenID предназначен для работы.

ответ

1

Прежде всего, хотя PHP преобразует периоды в подчеркивания в именах параметров, обязательно укажите , отправляя периоды, а не символы подчеркивания.

Во-вторых, ваш ответ check_authentication должен иметь только три параметра, но у вас есть шесть. Check the spec и исправьте свой ответ и посмотрите, поможет ли это.

+0

Я проверил код phpMyID и, похоже, добавляет переменные SReg в ответ проверки check_authentication. Я их удалю и попробую еще раз. Я проверил с помощью HTTP-заголовков Firefox, и я отправляю периоды в заголовках. –

+0

Помимо дополнительных параметров sreg, у вас есть дополнительные параметры openid.mode и openid_mode (ни один из них не должен присутствовать). И, наверное, самое главное, вы * не указали * параметр 'ns'. –

0

Andrew Arnott, вы ошибаетесь! документация от openid.net:

11.4.2.1. Параметры запроса

openid.mode Значение: "check_authentication"

Точные копии всех полей из ответа аутентификации, для "openid.mode" за исключением.

может быть более трех полей!

+0

Не путайте людей. «Ответ на аутентификацию» - это другой ответ. Ответ на «check_authentication», должно быть 3 поля, как is_valid –

+0

я теперь только есть openid.mode is_valid пока он все еще говорит, что сервер отказал check_authentication. –

0

У меня была аналогичная проблема. В моем случае клиент (полагающаяся сторона) не смог разрешить имя провайдера OpenId правильному ip. Хотя это вряд ли будет иметь место, пожалуйста, проверьте разрешение имен на своем полагающемся сервере.