Drupal で外部認証を実現するためのモジュール、extauth.module を作成しました。
バージョン 0.1.0 では、「はてな認証」と「TypeKey認証」の2つをサポートしています。
このサイトでは、このモジュールを試験運用するために、
画面右上のリンクからログインできるようにしています。
ログインするとコメント投稿の権限を得ることができます。
このモジュールでは、分っている範囲で3つのテーブル(authmap, users, sessions)を更新します。
そのため、モジュールの使用に当たっては、データベースのバックアップを取ることを強く推奨します。
Download
インストール
ファイルの配置
ダウンロードした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 は、ログインが完了した後の飛び先です。