0

最初に、私は OpenID にまったく慣れておらず、PHP の経験もあまりないという事実から前置きさせてください。

Janrain の Engage の例を自分の Web サイト (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 プロバイダー選択ウィジェットのあるページでスタックします。

何か案は?

4

1 に答える 1

2

Janrain は、メカニズムを機能させるためにサードパーティの Cookie に依存しているようです。どこかに文書化されているかもしれませんが、何時間も探しても見つかりませんでした。

Firefox では、ツール、オプション、プライバシー、およびサード パーティの Cookie をチェックすることで、Janrain の例が機能し始めました。

Chrome での手順は次のとおりです: chrome://chrome/settings/、詳細設定を表示、コンテンツ設定、[サードパーティの Cookie とサイト データをブロックする] のチェックを外します。

Janrain の例は、サードパーティの Cookie をブロックする設定に関係なく、IE9 で動作し続けました。iOSのSafariでも同じ経験がありました。(訪問したサイトからのクッキーのみを受け入れるように設定されていました。)

于 2012-11-22T13:50:37.037 に答える