Your browser (Internet Explorer 6) is out of date. It has known security flaws and may not display all features of this and other websites. Learn how to update your browser.
X
Post

docomoのOpenIdで詰まった

ちょっと仕事でdocomoのOpenId認証を実装する必要があり、
そこの動作検証で結構詰まってしまったのでメモ。



サイト運営者様向け | docomo ログイン | NTTドコモ

ここのドキュメントの後半にサンプルがあり、
それを構築して動作確認するだけの簡単なお仕事。
ここではライブラリとしてOpenID EnabledのPHP OpenID Libraryを使用しています。

OpenID Enabled


このライブラリを落とし、
サンプルに書かれている通りにコードを書いて動作チェック
……するが思うように処理が動かない。

問題の箇所はライブラリの中のようなのでライブラリを追っていく。
ずーっとライブラリの処理を追いかけていって、ようやく原因を突き止めた。


ライブラリの次のファイル中で問題が起こってました。

Auth/Yadis/XML.php

function Auth_Yadis_getXMLParser()
{
    global $__Auth_Yadis_defaultParser;
   
    if (isset($__Auth_Yadis_defaultParser)) {
        return $__Auth_Yadis_defaultParser;
    }
    foreach(Auth_Yadis_getSupportedExtensions() as $extension => $classname)
    {
      if (extension_loaded($extension))
      {
        $p = new $classname();
        Auth_Yadis_setDefaultParser($p);
        return $p;
      }
    }
    return false;
}

phpのモジュールに応じて取ってくるXMLパーサを切り換える処理です。
Auth_Yadis_getSupportedExtensions()はこんな感じでした。

function Auth_Yadis_getSupportedExtensions()
{
    return array('dom'    => 'Auth_Yadis_dom',
                 'domxml' => 'Auth_Yadis_domxml');
}


処理的にはdomかdomxml、いずれかのextensionが必須なのに、
どちらも見つからなかった時にエラーを返さずfalseで処理を進めてしまっていました。
エラー検出がなかったため、
ここに問題がある事を特定するまでにかなり骨が折れてしまった。


これが原因と気付いてから、
ふとdocomoのドキュメントを読み返してみると……
条件に「DOMモジュールが利用できること」とハッキリ書いてあった。
結構な時間詰まっていたのにドキュメントの読み落としで済む話だった。


で、せっかくなのでPHP OpenID Libraryの方もドキュメントをチェックしてみる。
まずはexamplesフォルダ内にあるファイルを動かして、
そこでサーバの設定状況など確認するのが本来の手続きだったらしい。
それをdocomoドキュメント内にサンプルがあったために
いきなりそっちを動かそうとしたのがまずかった模様。

detect.phpというのでサーバの設定回りに不備がないかチェックしてくれるらしい。
なるほど、まずここからやるのか……と思っていたら、こっちでも問題発見。


function detect_xml($r, &$out)
{
    global $__Auth_Yadis_xml_extensions;

    $out .= $r->h2('XML Support');

    // Try to get an XML extension.
    $ext = Auth_Yadis_getXMLParser();

    if ($ext !== null) {
        $out .= $r->p('XML parsing support is present using the '.
                      $r->b(get_class($ext)).' interface.');
        return true;
    } else {
        $out .= $r->p('XML parsing support is absent; please install one '.
                      'of the following PHP extensions:');
        foreach ($__Auth_Yadis_xml_extensions as $name => $cls) {
            $out .= "<li>" . $r->b($name) . "</li>";
        }
        return false;
    }
}


検証ファイル中でdomのモジュールが入っているのかチェックする関数がこれ。
nullであればパーサが見つからなかったという判定ですが……
falseが返るようになっているのでこれでは動作しないのです。


実際、モジュールが入っていないサーバで動かしてもfalseにはならなかった。
しかもモジュール名が抜けるだけなのでパッと見で分かりにくい。

まさか自分が見落としたところが
別の検証処理でもピンポイントで抜けているとは思わなかった。
まぁこっちは原因特定後に気付いた箇所なので大した問題ではなかったのですが、
詰まったのと同じ所で問題が見つかってちょっと頭抱えました。


……で、この問題を解決したら今度はまた違う問題で詰まってしまいました。
何となく解決の見通しは立っているような、いないような、という状況なので、
これも対応できたらまた報告します。


追記:
docomoのopenid絡みのトラブルについて、
検索エンジンから直接ヒットするケースが増えてきました。


ナビゲーションのためdocomo openidへの一連の記事へのリンクを並べておきます。

docomoのOpenIdで詰まった
続・docomoのOpenIdで詰まった
続続・docomoのOpenIdで詰まった
docomoのOpenIdで詰まった・終
PHP OpenId Libraryを使ってstatelessモードで認証する方法

TrackBack URL :

Leave a comment  

name

email

website

Submit comment