Почему пример Janrain Engage работает только в IE?

Во-первых, позвольте мне предварить это тем фактом, что я совершенно новичок в OpenID и не очень разбираюсь в PHP.

Я настроил пример Janrain Engage на своем веб-сайте (Apache/PHP), включив их JavaScript в раздел заголовка:

(function() {

   if (typeof window.janrain !== 'object') {
      window.janrain = {};
   }
   if (typeof window.janrain.settings !== 'object') {
      window.janrain.settings = {};
   }

   janrain.settings.tokenUrl = 'http://mydomain.com/tokenform.php';

   function isReady() {
      janrain.ready = true;
   };

   if (document.addEventListener) {
      document.addEventListener("DOMContentLoaded", isReady, false);
   } else {
      window.attachEvent('onload', isReady);
   }

   var e = document.createElement('script');
   e.type = 'text/javascript';
   e.id = 'janrainAuthWidget';

   if (document.location.protocol === 'https:') {
      e.src = 'https://rpxnow.com/js/lib/myapp/engage.js';
   } else {
      e.src = 'http://widget-cdn.rpxnow.com/js/lib/myapp/engage.js';
   }

   var s = document.getElementsByTagName('script')[0];
   s.parentNode.insertBefore(e, s);

})();

И я добавил их тег DIV:

<div id="janrainEngageEmbed"></div>

Я построил следующую страницу получения токена на основе их инструкций:

<?php

header('Content-Type: text/html; charset=utf-8');

?>
<html>
   <head>
      <title>Janrain Engage example</title>
   </head>
   <body>
      <pre>
<?php

$rpx_api_key = file_get_contents('/path/apikey.txt');

/* STEP 1: Extract token POST parameter */
$token = $_POST['token'];

echo "SERVER VARIABLES:\n";
var_dump($_SERVER);
echo "HTTP POST ARRAY:\n";
var_dump($_POST);

// test the length of the token; it should be 40 characters
if (strlen($token) == 40) {

   /* STEP 2: Use the token to make the auth_info API call */
   $post_data = array('token'  => $token,
                     'apiKey' => $rpx_api_key,
                     'format' => 'json',
                     'extended' => 'false');

   $curl = curl_init();
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($curl, CURLOPT_URL, 'https://rpxnow.com/api/v2/auth_info');
   curl_setopt($curl, CURLOPT_POST, true);
   curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
   curl_setopt($curl, CURLOPT_HEADER, false);
   curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
   curl_setopt($curl, CURLOPT_FAILONERROR, true);
   $result = curl_exec($curl);
   if ($result == false){
      echo "\n".'Curl error: ' . curl_error($curl);
      echo "\n".'HTTP code: ' . curl_errno($curl);
      echo "\n"; var_dump($post_data);
   }
   curl_close($curl);

   /* STEP 3: Parse the JSON auth_info response */
   $auth_info = json_decode($result, true);

   if ($auth_info['stat'] == 'ok') {

      echo "\n You're in!";
      echo "\n auth_info:";
      echo "\n"; var_dump($auth_info);

      /* STEP 4: Use the identifier as the unique key to sign the user into your system.
         This will depend on your website implementation, and you should add your own
         code here. The user profile is in $auth_info.
      */

   } else {
      // Gracefully handle auth_info error.  Hook this into your native error handling system.
      echo "\n".'An error occured: ' . $auth_info['err']['msg']."\n";
      var_dump($auth_info);
      echo "\n";
      var_dump($result);
   }
} else {
   // Gracefully handle the missing or malformed token.  Hook this into your native error handling system.
   echo 'Authentication canceled.';
}

?>
      </pre>
   </body>
</html>

Мой виджет принимает входы из Google, Facebook, Twitter, Yahoo, LinkedIn и Windows Live. Все работает как рекламируется, пока я использую IE. Если я пробую любого провайдера с помощью Firefox или Chrome, я, кажется, аутентифицирован, диалоговое окно входа исчезает, но я застреваю на странице с виджетом выбора провайдера Open ID.

Любые идеи?


person trw    schedule 20.11.2012    source источник


Ответы (1)


Оказывается, Janrain, кажется, полагается на сторонние файлы cookie, чтобы заставить их механизм работать. Хотя это может быть где-то задокументировано, я не нашел его даже после нескольких часов поиска.

В Firefox Инструменты, Параметры, Конфиденциальность и проверка сторонних файлов cookie позволили примеру Janrain начать работать.

В Chrome процедура следующая: chrome://chrome/settings/, Показать дополнительные настройки, Настройки контента, снять флажок «Блокировать сторонние файлы cookie и данные сайта».

Пример Janrain продолжал работать в IE9 независимо от настройки «Блокировать сторонние файлы cookie». У меня был такой же опыт с Safari на iOS. (Он был настроен на прием файлов cookie только с посещенных сайтов.)

person trw    schedule 22.11.2012