ここの情報は古いです。ご理解頂いた上でお取り扱いください。

Opened 12 years ago

Closed 12 years ago

#2857 closed enhancement (fixed)

sfOpenPNEAuthLoginIDPlugin による簡易的な登録機能の追加

Reported by: ebihara Owned by: ebihara
Priority: minor Milestone: OpenPNE3alpha1
Component: 指定しない Version:
Keywords: Cc:

Description

sfOpenPNEAuthLoginIDPlugin に登録をおこなうための処理を追加し、簡易的な登録機能を実現する。

Change History (3)

comment:1 Changed 12 years ago by ebihara

Owner: changed from nobody to ebihara
Status: newassigned

comment:2 Changed 12 years ago by ebihara

Keywords: 確認中 added

以下のリビジョンでベースとなる部分の実装を完了しました。

  • r7833, r7834 : 認証用フォームの親クラスとなる sfOpenPNEAuthForm を追加
  • r7835, r7837 : すでに登録が完了しログイン可能なメンバーに SNSMember というクレデンシャルを付加し、デフォルトで SNSMember クレデンシャルを求めるようにした
  • r7836 : 登録処理の追加

今回実装した機能に加え、 #2848 で実装した認証機能もあわせて以下に解説します。

  • OpenPNE の frontend 側の認証は複数の認証方法に対応する必要があるなどの理由により、 sfBasicSecurityUser の派生クラスである sfOpenPNESecurityUser を使っておこないます
  • sfOpenPNESecurityUser を使った認証をおこなうには、アプリケーション生成時に自動で作られる myUser クラスの親クラスを、 sfBasicSecurityUser から sfOpenPNESecurityUser に変更します
  • sfOpenPNESecurityUser は、 app.yml の openpne_auth_mode に従って認証方法を決定します。たとえば以下のように記述すると、sfOpenPNEAuthContainer_LoginID と sfOpenPNEAuthForm_LoginID を使用することになります
    openpne_auth_mode: LoginID
    
  • sfOpenPNEAuthContainer では、認証に関する処理をおこないます
    • フォームの入力値などから、認証が適切におこなえるかどうかのチェック
    • 認証用データ(ログインに用いるIDとメンバーIDのひも付け)の登録処理
    • 登録入力段階であるかどうか、登録完了段階であるかどうかなど、登録処理に関する状態をチェック
    • 登録処理を完了するためのアクションを取得
  • sfOpenPNEAuthForm では、認証に必要なフォームの準備やバリデーションをおこないます
    • ログインをおこなうためのフォームに関する設定
    • 登録をおこなうためのフォームに関する設定
  • SNSのメンバーや登録をおこなおうとしている人には、それぞれの権限を表すクレデンシャルが付与されます
    • SNSMember : SNSのメンバーである(メンバーID を所有し、SNSにログイン可能である)ことを表すクレデンシャルです
    • SNSRegisterBegin : 登録用のデータを入力する権限を持つことを表すクレデンシャルです。SNSに登録しようとする場合、この権限をまず得なければいけません
    • SNSRegisterEnd : 登録処理を完了するアクションを実行する権限を持つことを表すクレデンシャルです。SNSへの登録を完了しようとする(ログイン可能になる)場合、この権限を得なければなりません
  • SlavePNE などを考慮し、Member モデルに isActive というフラグを追加しました。isActive が有効でない限りはプロフィールなどを所有していたとしても、そのメンバーには SNSMember クレデンシャルを付与しません
  • ログイン処理は以下のような過程を踏んでおこなわれます(ログインとは、ログイン用のIDとメンバーIDのひも付けをおこない、SNSMemberクレデンシャルの付与を求めることをいいます)
    1. モジュール側で用意したログイン用アクションにおいて、sfOpenPNEAuthForm のインスタンスを取得し、画面上にフォームを表示させます
    2. フォームの入力内容のバリデーションをおこない、 sfOpenPNESecurityUser::login() に sfOpenPNEAuthForm のインスタンスを渡します
    3. 内部的に sfOpenPNEAuthContainer の fetchData() がコールされ、 sfOpenPNEAuthForm から取得できる値などをチェックし、 isActive なメンバーであるかどうかなどを確認した上でログインを許可するかどうかを決定します
  • 登録処理は以下のような過程を踏んでおこなわれます(登録とは、ログイン用IDとメンバーIDのひも付けをおこない、isActive が 1 であるメンバーになることをいいます)
    1. なんらかの手段で SNSRegistrBegin クレデンシャルを取得します
    2. モジュール側で用意した登録用アクションにおいて、sfOpenPNEAuthForm のインスタンスを取得し、登録用のウィジェットを追加した上で画面上にフォームを表示させます
    3. フォームの入力内容のバリデーションをおこない、isActive が 0 であるメンバーとして登録をおこないます
    4. sfOpenPNESecurityUser::getRegisterEndAction() (プラグイン側が用意した登録完了用のアクション)にリダイレクトします(この後、認証方法によって個別に登録を完了させるために必要な処理をおこなっていきます)
    5. 何らかの手段で SNSRegisterEnd クレデンシャルを取得します
    6. 登録完了アクションを実行します。これにより、isActive が 1 のメンバーとなり、 SNSMember クレデンシャルが付与され、ログイン可能となります

現状判明している問題点は以下です。これは後のバージョンアップにおいて、様々な認証方法を実現していくうえで解決していきたいと思っています。

  • 認証方法を変更する際に、バージョン管理されるはずの app.yml を直接変更する必要がある
    • 管理画面からも変更できるようにして対処
  • SNSRegisterBegin を取得する方法、 登録用データを入力する画面に遷移する手段がプラグイン側から用意されておらず、モジュール内に用意する必要がある
    • Social Application Layer に既存のテンプレートを自由に追記できるような仕組み(エントリーポイントのような仕組み)を提供し、それを認証用のプラグイン側から利用することで対応
  • クレデンシャルの名前はいかがなものか
  • 登録用データ入力後に sfOpenPNESecurityUser::getRegisterEndAction() から取得できるアクションに遷移するが、必ずしも登録完了用アクションにリダイレクトする必要はないのではないか

以上、ご確認ください。 また現状解決するべき問題点などあればご指摘ください。

comment:3 Changed 12 years ago by ebihara

Keywords: 確認中 removed
Resolution: fixed
Status: assignedclosed
Note: See TracTickets for help on using tickets.