Ktai StyleとWordPress Passwordの互換性
-
WordPressPasswordを使用してサイト全体に閲覧制限をかけているブログを製作中なのですが、携帯電話からの閲覧用にKtai Styleを導入しています。
PCからの閲覧には全く問題ないのですが、携帯電話からアクセスすると
window. location=”/blog/wp-content/plugins/wp-password/login.php?err=&destination=/blog/”;An automatic redirect has failed. Youshould have been redirected to this site.
というエラーがでてしまいます。文末の「this site」部分がリンクになっており、そこに飛ぶとWP-PASSWORDのパスワード入力画面に進むのですが、上記と同様に画面上部にエラー表示がでて、
function focusit() {document.getElementByld(‘wordpress_password’).focus();} window.onload = focusit;
と記載され、パスワードを入力すると、サイトに進まず最初のエラー画面に進み、この2P間をひたすらループしてしまいます。
Ktai StyleとWordpress Passwordを共存させる事は可能でしょうか?
-
Ktai Style 作者です。
「Wordpress Password」は、
http://broome.us/archives/2007/01/31/the-wordpress-password-plugin/
で配布されているものでしょうか? WordPress のプラグインは、しばしば似た機能で同名の名称だったりするので、必ず配布元を明記して頂くようお願いします。window. location=”/blog/wp-content/plugins/wp-password/login.php?err=&destination=/blog/”;An automatic redirect has failed. Youshould have been redirected to this site.
というのは、JavaScript のソースが見えていると思われます。多くの携帯電話は JavaScript に未対応で、機種によってはソースコードがそのまま見えてしまうことがあります (特にドコモ)。
また、入力したパスワードの維持はクッキーを使っています。しかし、ドコモ携帯はクッキー未対応のため、パスワードが消えてしまい、ログインできないです。クッキーに対応している、au, ソフトバンク 3G, ウィルコム、イー・モバイル、各社スマートフォンならば、ログインはできるかもしれません。
単純に言えば、Wordpress Password はドコモ未対応ということです。対応させるには、Wordpress Password 側でクッキーを使わないでログイン状態を維持する仕組みを作らなければならず、相当困難です。プラグインの作りが悪いというより、ドコモが悪いと言えるでしょう (WordPress Password の作りも、ちょっと変なところが無きにしもあらずですが)。
書き込みありがとうございます。
プラグインのダウンロード先はlilyfanさんが記載されたURLで間違いありません。
なるほどですね。そうなると「Wordpress Password」は携帯電話で使用する環境ではあまりよろしくないのですね。。
最初は.htaccessを使用して閲覧制限をかけようと思っていたのですが、そうすると記事投稿の際の画像アップロードが上手くいかなくなってしまった為「Wordpress Password」を導入したのですが、最後の最後でつまづいてしまいました。
別の方法を探ってみます。ありがとうございました!
最初は.htaccessを使用して閲覧制限をかけようと思っていたのですが、そうすると記事投稿の際の画像アップロードが上手くいかなくなってしまった為
Basic 認証を使おうとされたわけですね。
wp-admin 配下を認証の対象外とすればよさそうなのですが、.htaccess では設定がちょっと難しいと思います。他には、登録ユーザーだけ内容を見せるプラグインなどもあったりしますが、これも携帯閲覧とは相性が悪いです。やるとすれば、テーマを表示させるとき (WP_USE_THEMES が定義ずみのとき)、PHP 側で Basic 認証を要求させるようにする手があります。以下のコードを my-hacks.php というファイルに書いて、サーバーの WordPress インストールディレクトリーに転送し、管理パネルの「その他の設定」で my-hacks.php を有効にしてみてください。
パスワードは「your_password」の部分に直書きなので、あまり安全ではありませんが、気になるならば、適宜改造してみてください。<?php define ('WPJA_SITE_PASS', 'your_password'); function wpja_force_basic_auth() { if (! defined('WP_USE_THEMES')) { return; } if (! isset($_SERVER['PHP_AUTH_PW'])) { header('WWW-Authenticate: Basic realm="Please Enter Site Password"'); header('HTTP/1.0 401 Unauthorized'); echo "Authorization Required"; exit; } elseif (strcmp($_SERVER['PHP_AUTH_PW'], WPJA_SITE_PASS) === 0) { return; } else { echo "Bad Password"; exit; } } add_action('init', 'wpja_force_basic_auth'); ?>
lilyfanさんありがとうございます。
早速書き込みいただいた
<?php
define (‘WPJA_SITE_PASS’, ‘your_password’);function wpja_force_basic_auth() {
if (! defined(‘WP_USE_THEMES’)) {
return;
}
if (! isset($_SERVER[‘PHP_AUTH_PW’])) {
header(‘WWW-Authenticate: Basic realm=”Please Enter Site Password”‘);
header(‘HTTP/1.0 401 Unauthorized’);
echo “Authorization Required”;
exit;
} elseif (strcmp($_SERVER[‘PHP_AUTH_PW’], WPJA_SITE_PASS) === 0) {
return;
} else {
echo “Bad Password”;
exit;
}
}
add_action(‘init’, ‘wpja_force_basic_auth’);
?>を追加する方法で試してみたところ
Warning: Cannot modify header information – headers already sent by (output started at /usr/home/○○○○○○/html/blog/my-hacks.php:23) in /usr/home/○○○○○○/html/blog/my-hacks.php on line 9
Warning: Cannot modify header information – headers already sent by (output started at /usr/home/○○○○○○/html/blog/my-hacks.php:23) in /usr/home/○○○○○○/html/blog/my-hacks.php on line 10
Authorization Requiredというエラーが表示されてしまいました。
ちなみに「line 9」という部分はheader(‘WWW-Authenticate: Basic realm=”Please Enter Site Password”‘);
「line 10」という部分は
header(‘HTTP/1.0 401 Unauthorized’);
となっています。
このエラーの場合、注目すべきなのは、”output started at” の方です。9行目、10行目の header コマンドを実行しようとしたけど、すでにヨソで画面出力が行なわれているので実行できない、という内容なので、「先に画面出力してしまった」方を改善しなければならないのです。
output started at /usr/home/○○○○○○/html/blog/my-hacks.php:23
ということで、my-hacks.php の23行目で画面出力がされている、となっています。コードは22行しかないので、末尾に余計な改行とかついてないでしょうか?
?>
の後には何もつけてはいけません。lilyfanさん>どうやら、ご指摘の通り、無駄な改行があったようです。
修正したところ無事に動きました。ありがとうございます。ちなみになんですがベーシック認証を呼び出した際に、通常通り、IDとパスワードを指定する画面が立ち上がりますが、IDの方も指定したい場合は、完全に勘なんですが、
define (‘WPJA_SITE_PASS’, ‘your_password’);
の下に
define (‘WPJA_SITE_ID’, ‘user_id’);
を追加…とかでいいんでしょうか?
それだけでは不十分です。13行目でパスワード照合をしていますが、ここで ID 照合も行う必要があります。
ID とパスワードを両方入れさせるならば、複数の ID, パスワードを設定できた方がいいですから、2行目の define 文はやめて、配列にした方がよさそうです。もっと凝るならば、ID, パスワード設定ファイルを外部に置いて、それを読み込むとか、パスワードは sha1 でハッシュして保存しておくとかの改造が考えられます。<?php global $wpja_site_pass; $wpja_site_pass = array( 'user_1' => 'pass_1', 'user_2' => 'pass_2', ); function wpja_force_basic_auth() { if (! defined('WP_USE_THEMES')) { return; } global $wpja_site_pass; if (! isset($_SERVER['PHP_AUTH_ID'])) { header('WWW-Authenticate: Basic realm="Please Enter Site Password"'); header('HTTP/1.0 401 Unauthorized'); echo "Authorization Required"; exit; } elseif (array_key_exists($_SERVER['PHP_AUTH_ID'], $wpja_site_pass) && strcmp($wpja_site_pass[$_SERVER['PHP_AUTH_ID']], $_SERVER['PHP_AUTH_PW']) === 0) { return; } else { echo "Bad Password"; exit; } } add_action('init', 'wpja_force_basic_auth'); ?>
度々ありがとうございます。
早速、先程のコードを丸々差し替えて‘user_1’ => ‘pass_1’,
の部分をそれぞれ
‘IDTEST’ => ‘1111’,
とテスト用にID,PASSを打ち直し試したのですが、うまくいきませんでした。。。
Basic認証は通常通り立ち上がるのですが、
それぞれ設定した文字列を入力しても本サイトに進めませんでした。ID、パスワードは前記いただいたコードと同様、上記の該当部分に直打ちでいいんですよね?
最悪、パスワードのみのコードでもいいんですが、もし差し支えなければ解決方法をご教授いただければとおもいます。
何度も申し訳ありません。。。
ごめんなさい。PHP_AUTH_ID じゃなくて PHP_AUTH_USER が正解でした。
<?php global $wpja_site_pass; $wpja_site_pass = array( 'user_1' => 'pass_1', 'user_2' => 'pass_2', ); function wpja_force_basic_auth() { if (! defined('WP_USE_THEMES')) { return; } global $wpja_site_pass; if (! isset($_SERVER['PHP_AUTH_USER'])) { header('WWW-Authenticate: Basic realm="Please Enter Site Password"'); header('HTTP/1.0 401 Unauthorized'); echo "Authorization Required"; exit; } elseif (array_key_exists($_SERVER['PHP_AUTH_USER'], $wpja_site_pass) && strcmp($wpja_site_pass[$_SERVER['PHP_AUTH_USER']], $_SERVER['PHP_AUTH_PW']) === 0) { return; } else { echo "Bad Password"; exit; } } add_action('init', 'wpja_force_basic_auth'); ?>
ブラウザー・端末によって、パスワード間違いのとき再度認証画面が出ないことがありそうです。このため、コードを以下のように直して頂けると幸いです。
<?php global $wpja_site_pass; $wpja_site_pass = array( 'user_1' => 'pass_1', 'user_2' => 'pass_2', ); function wpja_force_basic_auth() { if (! defined('WP_USE_THEMES')) { return; } global $wpja_site_pass; if (isset($_SERVER['PHP_AUTH_USER']) && array_key_exists($_SERVER['PHP_AUTH_USER'], $wpja_site_pass) && strcmp($wpja_site_pass[$_SERVER['PHP_AUTH_USER']], $_SERVER['PHP_AUTH_PW']) === 0) { return; } else { header('WWW-Authenticate: Basic realm="Please Enter Site Password"'); header('HTTP/1.0 401 Unauthorized'); if (! isset($_SERVER['PHP_AUTH_USER'])) { echo "Authorization Required"; } else { echo "Bad Password"; } exit; } } add_action('init', 'wpja_force_basic_auth'); ?>
- トピック「Ktai StyleとWordPress Passwordの互換性」には新たに返信することはできません。