クライアント認証を利用してWordPressへ自動ログイン

なんか最近はブログへのログインが面倒くさくなってきましたw
かなり前に公開したDigest認証を利用してWordPressに自動ログインさせるプラグインでDigest認証のIDとパスを記録させてエンターを押すだけでいいのだけれど、それすらメンドウクサイw
 
最近はSSLで管理画面にログインしているので、「そうだ!クライアント認証ならエンターキーも必要ないんじゃね?」ってことでクライアント認証を導入。
SSL クライアント認証
firefoxのプラグインでサイトのクライアント証明書が1つの場合は、初回のみ選択ダイアログが出て以降は自動化してくれるようにしました。
 
あとはクライアント認証の環境変数を利用してWordpressへ自動ログインさせるようにするだけ・・なんだけど・・・
通常にクライアント認証をかけるとブログ全体にクライアント認証がかかり一般のユーザーは閲覧できなくなります。
 
なのでApacheのSSLバーチャルホスト内で以下のようにしました。

<Directory "/wordpress/">
	SSLOptions +StdEnvVars

	<Files wp-login.php>
		Satisfy any
		SSLVerifyClient require
	</Files>
</Directory>
<Directory "/wordpress/wp-admin/">
	SSLVerifyClient require

	<Files admin-ajax.php>
		Satisfy any
		SSLVerifyClient none
	</Files>
	<Files ~ "\.(gif|jpg|png|css|js|xml)$">
		Satisfy any
		SSLVerifyClient none
	</Files>
</Directory>

 
プラグインの方はこんな感じ。

<?php
/*
Plugin Name: WP Auto Login
Description: HTTP認証又はクライアント認証に成功した場合、自動でWordPressへログインします。
Version: 1.1.0
Author: REIMA
Author URI: http://blog.wolfs.jp/
*/
 
class wp_autoLogin {
    private $config = array(
        'no-loginform' => false, // hide wordpress loginform
        'wordpress-user' => 'wordpress-username',
        'client-auth' => false, // certificate auth
        'client-auth-cn' => '', // certificate-common name
        'client-auth-sn' => '', // certificate-serial number
        'http-auth-user' => 'http-username',
        'http-allow-host' => ''
    );
 
    public function __construct() {
        add_action('login_form', array($this, 'autoLogin'));
    }
 
    public function autoLogin() {
        $flagSuccess = false;
        $flagRedirect = false;
 
        if (is_user_logged_in()) {
            $flagSuccess = true;
            $flagRedirect = true;
        } else if (!$_GET['loggedout'] == 'true') {
            if ($_SERVER['SERVER_PORT'] == 443 && $this->config['client-auth'] == true) {
                if ($_SERVER['SSL_CLIENT_VERIFY'] == 'SUCCESS' && $_SERVER['SSL_CLIENT_S_DN_CN'] == $this->config['client-auth-cn']) {
                    $flagSuccess = true;
 
                    if ($this->config['client-auth-sn']) {
                        if ($_SERVER['SSL_CLIENT_M_SERIAL'] != $this->config['client-auth-sn']) {
                            $flagSuccess = false;
                        }
                    }
                }
            } else {
                if ($_SERVER['REMOTE_USER'] == $this->config['http-auth-user']) {
                    $flagSuccess = true;
                }
 
                if ($this->config['http-allow-host']) {
                    if (!(preg_match('/'.$this->config['http-allow-host'].'/', gethostbyaddr($_SERVER['REMOTE_ADDR'])))) {
                        $flagSuccess = false;
                    }
                }
            }
 
            if ($flagSuccess) {
                $wpUser = get_userdatabylogin($this->config['wordpress-user']);
 
                wp_set_current_user($wpUser->ID, $this->config['wordpress-user']);
                wp_set_auth_cookie($wpUser->ID);
                do_action('wp_signon', $this->config['wordpress-user']);
 
                $flagRedirect = true;
            }
        }
 
        if ($flagSuccess) {
            if ($flagRedirect) {
                $redirect_to = $_GET['redirect_to'];
                if (!$redirect_to) {
                    $redirect_to = admin_url();
                }
                wp_safe_redirect($redirect_to);
            }
        } else {
            if ($this->config['no-loginform'] == true) {
                wp_die('認証情報が正しくない為、ログインすることはできません。', '認証エラー');
            }
        }
    }
}
 
$wp_autoLogin_ins = new wp_autoLogin();
 
?>

HTTP認証の流れは以前と同じです。
クライアント認証は設定のclient-authがtrueかつ、SSLでアクセスされた場合のみ有効になります。
 
有効なクライアント証明書でSSLでアクセスされた場合、環境変数のSSL_CLIENT_S_DN_CNと設定のclient-auth-cnが同じ場合はログインを許可するようになっています。
client-auth-snに値がある場合は、クライアント証明書のシリアルナンバーも一致しないとログインできなくなります。
 
SSLの認証局を自分の所にした場合、認証局のデータベースからシリアルナンバーの正当性確認もできますね(`・ω・)b

関連するかもしれない記事



トラックバックURL


スパム対策のためトラックバックURLを動的に生成しています。
生成されるトラックバックURLはコンテンツURLと紐付けされますので、コンテンツURLで指定したサイト以外では使用できませんのでご注意ください。
トラックバックの注意事項などの詳しい説明は About ページを閲覧してください。
「コンテンツURL」を入力し「URL生成」ボタンを押してください。
トラックバックを送る際はあなたの記事やコンテンツにこの記事のURLを書くかリンクしておいてください。
URLがない場合はスパムとして削除され以降の全トラックバックは拒否されます。
  • コメント
  • ピンバック/トラックバック
  1. 1271
    comment
    0
    0
    匿名ID: 43MRy61Ow1z/k
    2013/05/07 (火曜日) 20:33:58返信

    Satisfy anyは何の意味が?

    • 1273
      comment
      0
      0
      れいまID: -
      2013/05/09 (木曜日) 22:18:09

      以前の記事にあるDigest認証で自動ログインさせる方法を変更した物なので、
      それと同時に導入してあると
       1.クライアント認証
       2.Digest認証
      のように2回認証することになるので「Satisfy any」でDigest認証をしないようにしています。

  2. 1263
    comment
    0
    0
    匿名ID: 36YQri3f.CCnE
    2013/04/13 (土曜日) 09:17:59返信

    プラグインの50~51行目ぐらいににゴミがありますぞー

    if (is_empty())
    SSL_CLIENT_M_SERIAL

    • 1264
      comment
      0
      0
      れいまID: -
      2013/04/13 (土曜日) 12:21:55

      ありがとうございます、修正しました。


コメントを残す

メールアドレスは公開されません、また は必須項目です。
このブログに初めてコメントする方は こちら をご覧ください。


画像認証は待機中です、先にコメント本文を入力して下さい。

コメントを送信しています、しばらくお待ち下さい...
(Akismetスパムデータベース及びブラックリストへの照会を行っています)


キャンセルをした場合でもコメント投稿が完了している場合があります