質問: PHPで作られたAPIがあり、CGI版のPHP5.4が動作するサーバー上で動かそうとしています。 無断でAPIを利用されないようにするために何らかの認証を持たせたいのですが、 DIGEST認証やBASIC認証はモジュール版で無ければ動かないようで、正しいパスワードを入力しても再入力を求められてしまいます。(検証した方法: 『PHPによるHTTP認証』) そのためタイムベースのワンタイムパスワードなどの別の手段で代替しようと考えていますが、このようなケースでは一般的にどのような認証方法を用いるのが最適なのでしょうか? 条件: * 認証に必要な情報はhtpasswdではなくPHPファイルから読み込まれます。 * APIサーバーもクライアントも自分で管理しているサーバーで、ある程度自由に変更できます。 * データベースを扱うAPIサーバーから取得した情報を、別のサーバーにある複数のサイト上で表示するのが目的です。 * サーバーとクライアント間の通信は暗号化されていません。(非SSL) * 認証は curl の POST で行う予定です。 具体的な実装方法というよりも方式や流れを知りたいと思っています。よろしくお願いします。 --- 追記: .htaccessに下記を追加する方法も試しましたが、特定のサーバー(さくら)では機能したものの目的のサーバー(heteml)では機能しませんでした。 ``` RewriteEngine on RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] ```
回答: HTTP認証の情報が載ってるAuthorizationヘッダはCGIでは落とされるので使えません。別の環境変数に載せ替えるテクニックが一般に使われてるようですが、これが出来るかどうかはサーバの設定次第です。 * 独自拡張ヘッダ(X-ヘッダ)に載せる * POSTパラメータに含める のが確実です。 具体的な認証方法は必要なセキュリティレベル次第です。 * 平文ID/パスワード * 固定トークン * OAuthなどの標準プロトコル なお、BASIC認証はID、パスワードを連結してBase64でエンコードしてるだけなので、実質平文です。