外部認証モジュール for Drupal 4.7.x

 

Drupal で外部認証を実現するためのモジュール、extauth.module を作成しました。 バージョン 0.1.0 では、「はてな認証」と「TypeKey認証」の2つをサポートしています。

このサイトでは、このモジュールを試験運用するために、 画面右上のリンクからログインできるようにしています。 ログインするとコメント投稿の権限を得ることができます。

このモジュールでは、分っている範囲で3つのテーブル(authmap, users, sessions)を更新します。 そのため、モジュールの使用に当たっては、データベースのバックアップを取ることを強く推奨します。

Download

  • extauth.module 0.1.0  (2006-08-02)
    このモジュールでは、TypeKey認証を実装するために、次の2つのライブラリを使用しています。 あわせて入手してください。
  • DSA.php
  • TypeKey.php

インストール

ファイルの配置

ダウンロードした3つのファイルを次のように配置してください。

<modules>
  │
  ├─ <extauth>
  │   │
  │   ├─ extauth.module
  │   ├─ DSA.php
  │   └─ TypeKey.php

TypeKey.php の修正

TypeKey.php を、フォルダの構成に合わせるために修正します。 (将来的には、TypeKey.php が無くても動かせるように、extauth.module を修正したいところです。)

  • 22行目
    require_once 'Security/DSA.php';
         ↓
    require_once './modules/extauth/DSA.php';
  • 134行目
    require_once 'Security/DSA.php';
         ↓
    // require_once 'Security/DSA.php';

modules/user.module の修正

extauth はメールアドレスもパスワードも収集しません。 そのため、外部認証ユーザがパスワードの再発行を要求できないようにブロックします。 これを行うには、user.module に次の強調部分を追加します。

……… 省略 ………
function user_pass_submit($form_id, $form_values) {
  global $base_url;

  $account = $form_values['account'];
  if (!$account->mail) {
    watchdog('user', "外部認証ユーザのパスワード再発行要求を拒否しました:$account->name");
    drupal_set_message("要求が拒否されました。");
    return 'user';
  }
  $from = variable_get('site_mail', ini_get('sendmail_from'));
  ……… 省略 ………

また、外部認証ユーザの場合はアカウントの編集タブを消すことにより、 メールアドレスやパスワードを設定できないようにします。 これを行うには、user.module に次の強調部分を追加します。

……… 省略 ………
function user_menu($may_cache) {
    ……… 省略 ………
      if ($user !== FALSE) {
        // Always let a user view their own account
        $view_access |= $user->uid == arg(1);
        // Only admins can view blocked accounts
        $view_access &= $account->status || $admin_access;

        $items[] = array('path' => 'user/'. arg(1), 'title' => t('user'),
          'type' => MENU_CALLBACK, 'callback' => 'user_view',
          'callback arguments' => array(arg(1)), 'access' => $view_access);

        $items[] = array('path' => 'user/'. arg(1) .'/view', 'title' => t('view'),
          'access' => $view_access, 'type' => MENU_DEFAULT_LOCAL_TASK, 'weight' => -10);

        if ($account->mail) {

          $items[] = array('path' => 'user/'. arg(1) .'/edit', 'title' => t('edit'),
            'callback' => 'user_edit', 'access' => $admin_access || $user->uid == arg(1),
            'type' => MENU_LOCAL_TASK);

          $items[] = array('path' => 'user/'. arg(1) .'/delete', 'title' => t('delete'),
            'callback' => 'user_edit', 'access' => $admin_access,
            'type' => MENU_CALLBACK);

        }
……… 省略 ………

設定

extauth の有効化

管理者アカウントでログインして、メニューから「管理」→「モジュール」をクリックします。 次に、extauth のチェックボックスにチェックを入れます。

extauth の設定

メニューから「管理」→「環境設定」→「extauth」をクリックすると、次の画面が表示されます。


図1 extauth の設定

はてな認証

  • はてな認証を有効にする。
    有効にすると、次の2つのURLが使用可能になります。
    (1) http://example.com/extauth/hatena_auth
    (2) http://example.com/extauth/hatena_cert

    (1)は、ログインの起点となるURLで、使い方は後述する「ログイン用リンクの作成」 で確認してください。 (2)は、コールバックURLで、はてなにおいてAPIキーを有効にするときに入力します。
  • APIキー
    はてなから取得したAPIキーを入力します。
  • 秘密鍵
    APIキーとセットで取得した、秘密鍵を入力します。
  • はてなユーザ識別サフィックス
    外部認証ユーザのIDの重複を避けるために、IDの後につけるサフィックスを入力します。 例えば、はてなIDが「foobar」で、サフィックスが「@hatena」であれば、 データベースには「foobar@hatena」が登録されます。

TypeKey認証

  • TypeKey認証を有効にする。
    有効にすると、次の2つのURLが使用可能になります。
    (1) http://example.com/extauth/typekey_auth
    (2) http://example.com/extauth/typekey_cert

    (1)は、ログインの起点となるURLで、使い方は後述する「ログイン用リンクの作成」 で確認してください。 (2)は、コールバックURLで、次の2箇所において同じコールバックURLを入力します。
    • TypeKey にログインして「アカウント設定」→「コメント登録するウェブログの指定」
    • extauth の設定項目「TypeKey認証」→「コールバックURL」
  • TypeKeyトークン
    TypeKey から取得した TypeKey トークンを入力します。
  • TypeKeyユーザ識別サフィックス
    外部認証ユーザのIDの重複を避けるために、IDの後につけるサフィックスを入力します。 例えば、TypeKey IDが「foobar」で、サフィックスが「@typekey」であれば、 データベースには「foobar@typekey」が登録されます。

ログイン用リンクの作成

extauth は、ブロックやメニューを提供しません。 ここでは、図2 のようなログイン用リンクを作成します。


図2 ログイン用リンク

このリンクは、このサイトの画面右上に表示されているものです。 このサイトでは themes/bluemarine/page.tpl.php に対して、 次の強調部分を追加しています。

……… 省略 ………
<table border="0" cellpadding="0" cellspacing="0" id="header">
  <tr>
    <td id="logo">
      ……… 省略 ………
    </td>
    <td id="menu">
      ……… 省略 ………
    </td>
    <td style="padding:5px 10px; text-align:right; vertical-align:top;">
        <?php
            global $user;

            $dest = $_GET["destination"];
            if (!$dest) {
                $uri = $_SERVER["REQUEST_URI"];
                $dest = substr($uri, 1, strlen($uri) - 1);
            }

            if ($user->uid == "0") {
                print('<strong>anonymous</strong>');
                print('<font color="dimgray"> | Login via: </font>');
                print('<a href="/extauth/hatena_auth?dest='.$dest.'">Hatena</a> ');
                print('<a href="/extauth/typekey_auth?dest='.$dest.'">TypeKey</a>');
            }
            else {
                print("<strong>$user->name</strong>");
                print('<font color="dimgray"> | </font><a href="/logout">Logout</a>');
            }
        ?>
    </td>
  </tr>
  <tr>
    <td colspan="2"><div><?php print $header ?></div></td>
  </tr>
</table>
……… 省略 ………

CGIパラメータ dest は、ログインが完了した後の飛び先です。

改版履歴

日付 内容
2006-08-02 初版