wiki:pne-openpne3-develop/specification/authentication
 ここの情報は古いです。ご理解頂いた上でお取り扱いください。

OpenPNE3 機能・仕様解説 / メンバー登録・認証機能

TOC(inline,heading=目次,depth=3)?

導入

OpenPNE3 におけるメンバー登録・認証処理は、すべてプラグインによっておこなわれます。

OpenPNE ではメールアドレスや OpenID など、様々な認証を使用できるようにする必要があります。そのため、認証にかかわる機能はプラグインとして提供し、認証方法の使用設定を切り替えたり、認証方法を増やしたりといったことを容易にします。

プラグイン

認証用に作られる各プラグインは plugins ディレクトリ以下に、 「opAuth」 からはじまる名称のディレクトリとして置かれます。

認証プラグインの最小構成は以下のようになります。

※この他にも、必要に応じて認証用のスキーマ定義ファイルやモデルクラスを追加していきます。

opAuth***/
  config/
    settings.yml                            // 認証に関する設定
  lib/
    form/
      ***Form.class.php                     // フォームクラス
    user/
      sfOpenPNEAuthContainer_***.class.php  // 認証処理・登録処理をおこなうクラス

※***には認証の名称を記述する

settings.yml でおこなえる設定

settings.yml では以下の項目について設定をおこなうことができます。

  • openpne_register_end_action(必須・廃止予定)
    • 登録処理を完了し、SNSへメンバー登録をするためのアクション
    • アクション名は固定であっても構わないので、この設定項目は廃止する

使用方法

アプリケーションの lib/myUser.class.php の親クラスを、以下のように sfOpenPNESecurityUser に変更します。

class myUser extends sfOpenPNESecurityUser
{

こうすることで、 OpenPNE に特化した認証処理をおこなえるようになります。また、 sfOpenPNESecurityUser を経由して、認証用プラグインで定義された認証処理や登録処理をおこなうことができるようになります。

アクションからは、 sfAction::getUser() によって myUser クラスのインスタンスにアクセスすることができます。

認証処理

ログインフォームの表示

ログイン用のIDやパスワードなど、認証方法によって必要なフォームフィールドは変化します。 OpenPNE では特定の認証に依存しないように、ログインに必要なフォームをプラグイン側で用意していく形を採っています。

sfOpenPNESecurityUser::getAuthForm() をコールすることで、プラグイン側であらかじめ用意されたログイン用のフォームクラス(sfOpenPNEAuthForm の派生クラス)のインスタンスを取得することができます。

アクション内では以下のような記述によって取得します。

$this->form = $this->getUser()->getAuthForm();

テンプレートでは以下のようにしてフォームを出力します。

<form action="<?php echo url_for('member/login') ?>" method="post">
<table>
<?php echo $form ?>
<tr>
<td colspan="2"><input type="submit" value="Submit" /></td>
</tr>
</table>
</form>

sfOpenPNESecurityUser::getAuthForm() は、「認証名 + Form」という名称のクラスのインスタンスを返します。このクラスの定義はプラグイン内でおこなわなければなりません。また、抽象クラス sfOpenPNEAuthForm を継承している必要があります。

ログイン処理

member モジュールの login アクションによってログイン処理はおこなわれます。

フォーム入力値の検証をおこなった後、 sfOpenPNESecurityUser::login() をコールし、 ユーザを認証済みとするかどうかを決定します。

sfOpenPNESecurityUser::login() のなかで、 sfOpenPNEAuthContainer_[認証名]::fetchData() がコールされます。この fetchData() では、入力値やデータベースなど認証に必要な情報を取得し、各認証方法にとって適切な検証(入力されたIDとパスワードが正しいかどうか、登録処理中でないかどうかなど)をおこなったうえで、認証に成功したかどうかを真偽値で返します。

fetchData() が true を返す場合、 sfOpenPNESecurityUser::login() は SNSMember クレデンシャルを発行します。

ログイン後ページへのアクセス

member モジュールの home アクションをはじめとする、ログイン後でなければ入れないページについては、 SNSMember クレデンシャルを所持しているかどうかをチェックしています。

クレデンシャルはアクセスのたびに再発行されます。

登録処理

概要

「メンバー情報入力」「メンバー登録完了」を追加

登録処理は主に以下の手順でおこなわれます。

  • メンバー情報入力
  • メンバー登録完了

これらの処理をおこなう権限を持っているかどうかをクレデンシャルによってチェックします。

適切なクレデンシャルを持っていない場合、処理を続行することができません。

クレデンシャルを得る条件は認証方法によって異なります。特別なURLを経由した場合のみメンバー情報入力のためのクレデンシャルを付与する認証方法や、誰に対してもメンバー情報入力を許す認証方法など様々です。

登録用クレデンシャルの扱い

登録用クレデンシャルはアクセスの度に sfOpenPNESecurityUser::initializeCredentials() をコールすることにより初期化されます。

sfOpenPNESecurityUser::initializeCredentials() は、以下のメソッドをコールし、現在アクセスしている者がどのような状態であるかを識別し、適切なクレデンシャルを発行します。

  • sfOpenPNEAuthContainer_[認証名]::isRegisterBegin()
  • sfOpenPNEAuthContainer_[認証名]::isRegisterFinish()

sfOpenPNEAuthContainer::isRegisterBegin(), sfOpenPNEAuthContainer::isRegisterFinish() は実装のない抽象メソッドとして定義されているため、派生クラスである sfOpenPNEAuthContainer_[認証名] で必ず実装されなければなりません。どのような条件下でこれらのメソッドの返り値が true, false になるかについては認証方法によって(=これらのメソッドの実装によって)異なります。

sfOpenPNEAuthContainer_[認証名]::isRegisterBegin() が true の場合は SNSRegisterBegin クレデンシャルが、 sfOpenPNEAuthContainer_[認証名]::isRegisterFinish() が true の場合は SNSRegisterFinish クレデンシャルが発行されます。

どちらの条件にも当てはまらない場合、(メンバーが存在していれば)SNSMember クレデンシャルが発行されます。

メンバー情報入力

member モジュールの registerInput アクションにてメンバー情報入力をおこないます。このアクションで入力された情報が DB に登録されます。

registerInput アクションにアクセスするには、 SNSRegisterBegin クレデンシャルを所持している必要があります。

SNSRegisterBegin クレデンシャルを付与するタイミングの一例

  • loginID
    1. SNSMember クレデンシャルを所持している場合を除き、常に付与
  • PCAddress
    1. ログイン画面の「新規登録」にアクセス
    2. メールアドレスを入力し、招待メールを受信する
    3. 招待メール内のURL(pcAddress モジュールの register アクションへのURL)をクリックする
    4. URL 内の hash パラメータの値が authentication_pc_address.register_session と一致する場合、 SNSRegisterBegin クレデンシャルを付与

メンバー登録完了

member モジュールの registerInput にてメンバー情報入力が完了すると、 openpne_register_end_action で定義されたアクションに遷移します。

このアクションでは認証方法にとって適切なチェックをおこない、 SNS を利用可能にしても構わないと判断される場合、 member.is_active を 1 にして SNSMember クレデンシャルを発行します。

openpne_register_end_action で定義されたアクションにアクセスするには、 SNSRegisterFinish クレデンシャルを所持している必要があります。

SNSRegisterFinish クレデンシャルを付与するタイミングの一例

  • loginID, PCAddress
    1. member テーブルに member.is_active が 0 であるデータが既に登録されている場合、付与
Last modified 9 years ago Last modified on Sep 9, 2008, 9:12:26 PM

Attachments (1)

Download all attachments as: .zip