= OAuth for Geeklog - Twitter Facebook LinkedIn を経由して認証するハック =

  対応バージョン: Geeklog 1.7.0
  対応サービス: Twitter, Facebook, LinkedIn

  Author: Hiroshi Sakuramoto 
  Presented by
    IVY WE CO.,LTD. / Tetsuko Komma (Ivy) / komma AT ivywe DOT co DOT jp
    WinKey / Hiroshi Sakuramoto (hiroron) / hiro AT winkey DOT jp

                                                        Modified Date 2010/08/22
                                                                   Version 1.0.0


Geeklogに対してOAuthによる認証を追加するハック(OAuthハック)です。

TwitterやFacebook、LinkedInではOAuth APIが提供されており、Geeklogサイトへのログイ
ンをスムーズに行なうことができます。

3rdPartyによるログインより、OAuth APIによるログインがスマートで、そのサイトでID、
パスワードを入力することがないのでさらに安心です。

OpenIDによるログインと、OAuth APIによるログインは似ていますが、そのサイトでOpenID
プロバイダーのURLを入力することがないのでスムーズにログインできます。

なお、Geeklogサイトで一般のアカウントと同様にユーザアカウントが作成され、グループ
権限などを付与できます。

FacebookのOAuth APIではメールアドレスを含めた各種情報を取得し、アカウント情報に設
定します。

TwitterとLinkedInのOAuth APIではメールアドレスが取得できておらず、さらにパスワード
も発行していないので、現状ではアカウント情報の変更はできません。

TwitterのOAuth APIではユーザアカウント作成時にTwitterの Direct message 機能を活用
してお礼メッセージを送信しています。このメッセージ内容は変更することも可能です。





== インストール ==

以下の説明で、

  * <geeklog_dir>は、Geeklogシステムのdb-config.phpが存在するフォルダ（ディレクトリ）
  * <public_html>は、lib-common.phpのあるフォルダ
  * <admin>は、管理用ファイルがあるフォルダ（ふつうは、<public_html>ディレクトリの直下）

を表しています。



=== 変更を加えるファイル一覧 ===

これらのファイルを変更します。あらかじめバックアップしてください。

  <geeklog_dir>/language/english.php
  <geeklog_dir>/language/japanese_utf-8.php
  <geeklog_dir>/system/lib-security.php
  <public_html>/lib-common.php
  <public_html>/users.php
  <public_html>/layout/<theme>/loginform.thtml
  <public_html>/layout/<theme>/users/loginform.thtml



=== インストール ===

  1. OAuthハックのアーカイブを適当な場所へ展開（解凍）します。展開したフォルダ内の language フォルダの内容を <geeklog_dir>/language/フォルダ内にコピーします。
  2. 展開したフォルダ内の system/pear フォルダの内容を <geeklog_dir>/system/pear/フォルダ内にコピーします。
  3. 展開したフォルダ内の system/classes フォルダの内容を <geeklog_dir>/system/classes/フォルダ内にコピーします。
  4. 展開したフォルダ内の system/lib-security.php ファイルを <geeklog_dir>/system/フォルダ内にコピーします。
  5. 展開したフォルダ内の public_html/images フォルダの内容を <public_html>/images/フォルダ内にコピーします。
  5. 展開したフォルダ内の public_html/layout フォルダの内容を <public_html>/layout/フォルダ内にコピーします。
  6. 展開したフォルダ内の public_html/ フォルダの lib-common.php, users.php ファイルを <public_html>/フォルダ内にコピーします。
  7. 次項の 設定>各APIへのクライアント登録 を参考に各API用のKEYを取得して、 <geeklog_dir>/system/classes/oauth/フォルダ内の各.auth.class.phpファイルを開き $consumer_key, $consumer_secret を設定します。詳しくは 設定>各APIへのクライアント登録 を御覧ください。

  ※配置場所が上記説明で分かりにくい場合は "OAuthハックのファイル構成" を参考にしてください。
  ※各OAuth用クラスには開発に用いたテストサイト用のKeyが登録してありますが各自のサイト用に「設定>各APIへのクライアント登録」を参考に取得しなおしてください。


== 設定 ==

== 各APIへのクライアント登録 ==

=== Twitter ===

Twitterのクライアント登録サイトへアクセスし、情報を登録しKEYを取得してください。

クライアント登録サイト: https://twitter.com/apps

入力情報の補足

「アプリケーションの種類」は「ブラウザアプリケーション 」を選択。
「コールバックURL」へはsite_urlと同じものを入力。
「Default Access type」は「Read & Write」を選択。
「Twitterでログインする」は「はい、Twitterをログインに使用します。 」にチェック。

これらを入力して、取得した「Consumer key」と「Consumer secret」を
<geeklog_dir>/system/classes/oauth/twitter.auth.class.php の41,42行目にセットします。

    public $consumer_key = 'xxxxxxxxxxxxxxxxxxxxx';                   // <-- Consumer key
    public $consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';  // <-- Consumer secret


=== Facebook ===

Facebookのクライアント登録サイトへアクセスし、情報を登録しKEYを取得してください。

クライアント登録サイト: http://developers.facebook.com/setup/

入力情報の補足

「アプリのURL」へはsite_urlと同じものを入力。

これらを入力して、取得した「アプリケーションID」と「シークレットキー」を
<geeklog_dir>/system/classes/oauth/facebook.auth.class.php の38,39行目にセットします。

    public $consumer_key = 'xxxxxxxxxxxxxxx';                         // <-- アプリケーションID
    public $consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';     // <-- シークレットキー


=== LinkedIn ===

LinkedInのクライアント登録サイトへアクセスし、情報を登録しKEYを取得してください。

クライアント登録サイト: https://www.linkedin.com/secure/developer

入力情報の補足

「Application Type」は「Web application」を選択。
「OAuth Redirect URL」へはsite_urlと同じものを入力。

これらを入力して、取得した「API Key」と「Secret Key」を
<geeklog_dir>/system/classes/oauth/linkedin.auth.class.php の41,42行目にセットします。

    public $consumer_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';  // <-- API Key
    public $consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';  // <-- Secret Key





=== コンフィギュレーション ===

  ※現在のハックでは、コンフィギュレーションで設定できるようにまでにはなっておりま
せん。しかし将来のGeeklog本体への取り込みやコンフィギュレーションで設定できるハック
に対応できるように lib-common.php ファイルの末尾に $_CONF を追加して設定しています。
設定を変更する場合は直接ファイルを編集してください。

$_CONF['user_login_method']['oauth'] == OAuth認証を利用する。true=利用(default) / false=利用しない


OAuthログインにて作成されるユーザIDは各リモートサイトのIDを採用しております。
これはAPIが分かりやすい名前のようなIDの値を返さないためこうなっております。
また各サイトで同じ名前を利用していることも多いため重複により結局数値付きの
名前に置き換えられてしまいますから、そのままリモートサイトのIDを採用してます。
このIDはランダムな数値のようなIDのリモートサイトもありますので、サイト上に表示する
ユーザ名をフルネームでの運用をおすすめします。

コンフィギュレーション＞ユーザと投稿＞ユーザ＞フルネームを表示する を「はい」

こう設定することでフルネーム表示になります。



=== テンプレートファイル ===

ログイン用の"Sing in"画像のあるFORMのテンプレートファイルを個別に作成できます。

デフォルトでは共通で <public_html>/layout/<your_theme>/login_oauth.thtml ファイル
を読み込みます。

ただし、<public_html>/layout/<your_theme>/login_<servicename>.thtml ファイルがある
場合は、そちらを優先して読み込みます。

個別にstyle設定や画像ファイル名等を指定したい場合は、このファイルを作成してください。


=== Twitterのダイレクトメッセージ ===

初めてTwitter認証でログインした時、ユーザが作成されたことを伝えるダイレクトメッセージが
送信されます。このメッセージは140文字以内で自由に編集できます。

<geeklog_dir>/language/<言語ファイル> の $MESSAGE が宣言してある中の 113 がこの
メッセージですので、ここを編集してください。

この中で {site_url} は、あなたのサイトのURLが短縮URLで置き換えられます。



=== 要らない認証を消す方法 ===

要らない認証方法を消す方法は、<geeklog_dir>/system/classes/oauth/フォルダ内の
消したいxxxxx.auth.class.phpファイルを削除するだけでOKです。



== 作成ユーザに関する補足（注意点） ==

  ※パスワード無し、メールアドレス無し、だとマイアカウントでパスワード変更やメー
ルアドレス登録ができない。またGeeklogサイトからのメール通知（グループメール等）を
該当ユーザに送れない。

   OAuthサイト    |    パスワード    |    メールアドレス    
------------------+------------------+----------------------
 Twitter          | 無し             | 無し
------------------+------------------+----------------------
 Facebook         | 無し             | 有り
------------------+------------------+----------------------
 LinkedIn         | 無し             | 無し
------------------+------------------+----------------------
(参考)OpenID      | 無し             | OpenIDサーバーが
                  |                  | 情報を返せば有り
------------------+------------------+----------------------



== OAuthハックのファイル構成 ==

Geeklog 1.7.0 へ OAuth認証を追加するハックのファイル構成

(+)は新規追加
システム領域の変更
  language/english.php
  language/japanese_utf-8.php
  system/lib-security.php
  system/classes/oauthhelper.class.php (+)
  system/classes/oauth/twitter.auth.class.php (+)
  system/classes/oauth/facebook.auth.class.php (+)
  system/classes/oauth/linkedin.auth.class.php (+)

PEARへの追加
  system/pear/Net/URL2.php (+)      <- Net_URL2-0.3.1
  system/pear/HTTP/Request2.php (+) <- HTTP_Request2-0.5.2
  system/pear/HTTP/Request2/* (+)   <- HTTP_Request2-0.5.2
  system/pear/HTTP/OAuth.php (+)    <- HTTP_OAuth-0.1.18
  system/pear/HTTP/OAuth/* (+)      <- HTTP_OAuth-0.1.18
  

公開領域の変更
  public_html/lib-common.php
  public_html/users.php
  public_html/images/sign-in-with-twitter.png (+)
  public_html/images/sign-in-with-twitter-sm.png (+)
  public_html/images/sign-in-with-facebook.png (+)
  public_html/images/sign-in-with-linkedin.png (+)

テーマの変更
  public_html/layout/<theme>/loginform.thtml
  public_html/layout/<theme>/loginform_oauth.thtml (+)
  public_html/layout/<theme>/users/loginform.thtml


