はじめに
    こんにちは。開発本部の関根と申します。
    早いもので入社してもうすぐ半年が過ぎようとしています。
    今回も前回に引き続きPython関連のご紹介をさせて頂きます。
    少し前の話になりますが、日本を含めた世界7箇所でDjango Sprintが開催されました。
    私も参加させて頂き、django-allauthに関する調査および実装を行いましたので、
今回はその内容をご紹介させて頂きたいと思います。
    (個人ブログでもご紹介させて頂きましたが、django-allauthはとてもすばらしいプロダクトなので、改めてご紹介させて頂きます。)
django-allauthとは?
django-allauthを利用するとDjangoのアプリケーション上からFacebook、twitter、GitHubなどの
サードパーティ製の認証システムを利用してログインすることが可能になります。
https://github.com/pennersr/django-allauth
現在対応しているメディアは下記の通りです。
    * Facebook (both OAuth2 and JS SDK)
    * Github
    * Google (OAuth2)
    * LinkedIn
    * OpenId
    * Persona
    * SoundCloud (OAuth2)
    * Stack Exchange (OAuth2)
    * Twitter
    * Weibo (OAuth2)
    上記のソーシャルメディア以外でもログイン処理を実装したクラスを追加して拡張が可能です。
    またとても高機能で、下記のような機能に対応しています。
    * Signup of both local and social accounts (ローカルアカウント、シャールアカウント両方に対応)
    * Connecting more than one social account to a local account
    (ローカルアカウントに1つ以上のソーシャルアカウントを紐づける。)
    * Disconnecting a social account — requires setting a password if only the local account remains
    ( ソーシャルアカウントとの紐付けの解除)
    * Optional instant-signup for social accounts — no questions asked
    * E-mail address management (multiple e-mail addresses, setting a primary) (メールアドレスの管理)
    * Password forgotten flow(パスワードを忘れた場合の確認機能)
    * E-mail address verification flow(メールアドレスの確認機能)
今回はDjanogのプロジェクトを作成し、各ソーシャルメディアでログイン処理が出来るまでを試してみました。
仮想環境の構築
まずはプロジェクト用の仮想環境を構築します。
| 
					 1  | 
						mkvirtualenv django-allauth-sample  | 
					
必要なモジュールのインストール
djangoとdjango-allauthをインストールします。
| 
					 1 2  | 
						pip install django pip install django-allauth  | 
					
Djangoのプロジェクトの作成
Djangoのプロジェクトを作成します。
| 
					 1  | 
						django-admin.py startproject django_allauth_sample  | 
					
    /etc/hostsの変更
    ログイン認証時のコールバック用に、/etc/hostsに下記の記述を追加します。
| 
					 1  | 
						127.0.0.1	local-test.com  | 
					
    テスト起動
manage.pyを叩いて動作を確認します。
下記のURLをブラウザで開いて正常に表示されていればOKです。
http://local-test.com:8000/
| 
					 1 2 3 4 5 6 7 8 9  | 
						cd django_allauth_sample/ python manage.py runserver Validating models... 0 errors found Django version 1.4.5, using settings 'django_allauth_sample.settings' Development server is running at http://127.0.0.1:8000/ Quit the server with CONTROL-C. [22/Feb/2013 21:26:38] "GET / HTTP/1.1" 200 1972  | 
					
Djangoに関する基本的な設定の追加、編集
下記の記述を参考にsettings.pyを変更します。
    BASE_DIRの設定
    settings.pyの上部に記述を追加します。
| 
					 1 2  | 
						import os BASE_DIR = os.path.dirname(os.path.abspath(__file__))  | 
					
    DBに関する記述を変更
    今回はsqlite3を使用するので、下記のように修正します。
| 
					 1 2 3 4 5 6 7 8 9 10  | 
						DATABASES = {     'default': {     'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.     'NAME': os.path.join(BASE_DIR, '../../db/sample.db'),     # Or path to database file if using sqlite3.     'USER': '',                      # Not used with sqlite3.     'PASSWORD': '',                  # Not used with sqlite3.     'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.     'PORT': '',                      # Set to empty string for default. Not used with sqlite3.     } }  | 
					
タイムゾーンの変更
| 
					 1  | 
						TIME_ZONE = 'Asia/Tokyo'  | 
					
言語コードの変更
| 
					 1  | 
						LANGUAGE_CODE = 'ja'  | 
					
    TEMPLATE_DIRSの設定
    今回はテンプレートファイルを/templates/配下に設置するので、その設定を追加します。
| 
					 1 2 3 4 5 6  | 
						TEMPLATE_DIRS = ( # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. os.path.join(BASE_DIR, 'templates/'), )  | 
					
django-allauthに関する設定の追加、編集
    django-allauthのドキュメントを参考に、
    各種動作に必要なsetteings.pyの変更をします。
* https://github.com/pennersr/django-allauth#welcome-to-django-allauth
    TEMPLATE_CONTEXT_PROCESSORSの変更
    TEMPLATE_CONTEXT_PROCESSORSの内容を設定します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13  | 
						TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.debug', 'django.core.context_processors.i18n', 'django.core.context_processors.media', 'django.core.context_processors.static', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'django.core.context_processors.request', # 追加 "allauth.account.context_processors.account", "allauth.socialaccount.context_processors.socialaccount", )  | 
					
    INSTALLED_APPSの変更
    INSTALLED_APPSの設定を変更します。
    管理画面用のadmin、allauthの動作に必要なアプリケーション、
    各種ログインに利用するソーシャルメディアのアプリケーションを有効にします。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  | 
						INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'allauth', 'allauth.account', 'allauth.socialaccount', # ... include the providers you want to enable: 'allauth.socialaccount.providers.twitter', 'allauth.socialaccount.providers.facebook', 'allauth.socialaccount.providers.github', #'allauth.socialaccount.providers.linkedin', #'allauth.socialaccount.providers.openid', #'allauth.socialaccount.providers.persona', #'allauth.socialaccount.providers.soundcloud', #'allauth.socialaccount.providers.stackexchange', )  | 
					
    AUTHENTICATION_BACKENDSの設定
    allauthの認証システムを利用するので、記述を追加します。
| 
					 1 2 3 4  | 
						AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', "allauth.account.auth_backends.AuthenticationBackend", )  | 
					
    SOCIALACCOUNT_PROVIDERSの設定
    各ソーシャルメディア用の具体的な設定(スコープ等)は、
SOCIALACCOUNT_PROVIDERSに設定していきます。
| 
					 1 2 3 4 5 6 7 8 9 10 11  | 
						SOCIALACCOUNT_PROVIDERS = {     'facebook': {     'SCOPE': ['email', 'publish_stream'],     'AUTH_PARAMS': {'auth_type': 'reauthenticate'},     'METHOD': 'oauth2',     'LOCALE_FUNC': lambda request: 'ja_JP'     },     'github': {     'SCOPE': ['user:follow', 'gist']     } }  | 
					
    LOGIN_REDIRECT_URLの設定
ログインした後、デフォルトで表示するページのURLを指定します。
参考URL
* https://docs.djangoproject.com/en/1.4/ref/settings/#login-redirect-url
| 
					 1  | 
						LOGIN_REDIRECT_URL = '/'  | 
					
    テーブルの作成
    テーブルを作成します。
| 
					 1  | 
						python manage.py syncdb  | 
					
    urls.pyの設定
    管理画面用、allauth用、indexページ用の設定を追加します。
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  | 
						from django.conf.urls import patterns, include, url # Uncomment the next two lines to enable the admin: from django.contrib import admin admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'django_allauth_sample.views.home', name='home'), # url(r'^django_allauth_sample/', include('django_allauth_sample.foo.urls')), # Uncomment the admin/doc line below to enable admin documentation: # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: url(r'^admin/', include(admin.site.urls)), url(r'^accounts/', include('allauth.urls')), url(r'^$', login_required(direct_to_template), {'template': 'index.html'}), )  | 
					
    各種ソーシャルメディアのアプリケーションの登録
    ログインに使用するソーシャルメディアのアプリケーションを登録します。
    詳細は割愛しますがFacebook、Twitter、GitHubの各アプリ登録ページから登録することが可能です。
    今回はテスト用ドメインをlocal-test.comとしたので、
    各コールバックURLは下記のように設定しました。
| 
					 1 2 3  | 
						http://local-test.com:8000/accounts/facebook/login/callback/ (Facebook) http://local-test.com:8000/accounts/twitter/login/callback/ (Twitter) http://local-test.com:8000/accounts/github/login/callback/ (GitHub)  | 
					
    登録したアプリケーションの追加
    
サンプルアプリケーションに上記で登録したアプリケーションを追加していきます。
* 管理画面にログイン(http://local-test.com:8000/admin/)
* [Social apps]のリンクをクリック
* [social app を追加]をクリック
* 追加画面になるので、各アプリケーションを追加
(Client idとSecretはメディアによって名称が違います。)
* Providerを選択
* Nameを入力
* Client idを入力
* Secretを入力
* Sitesを選択
ログイン
上記の設定を行った後、ログイン用のURLにアクセスするとログイン画面が表示され、
各ソーシャルメディアのアカウントを利用してログインする事が可能になります。
 * http://local-test.com:8000/accounts/login/

* 注 Emailの設定を適切に設定しないと、signup時の確認用のメールが送信される際に
Connection refusedのエラーが発生します。
確認用のEmailを送信しないようにするには、下記のように設定します。
| 
					 1  | 
						ACCOUNT_EMAIL_VERIFICATION = 'none';  | 
					
まとめ
    今回はdjango-allauthを利用した、ソーシャルログイン機能の実装についてご紹介させて頂きました。
    django-allauthを利用するとDjango標準の認証機能に対して、
とても簡単にソーシャルログイン機能を追加することができます。
   またその他メールアドレスの確認機能やパスワードを忘れた場合の機能などもあり、
とても便利なライブラリだと思います。今回はほんの一部の機能のご紹介しか出来ませんでしたが、
今後はもっと詳細に踏み込んだ内容をご紹介していければと思っています。
    サンプルソース
    今回の記事を書くために作成したサンプルソースを公開致します。
    下記のリンクより閲覧可能です。
    * https://github.com/checkpoint/allauth-sample
    BootstrapやjQueryを利用して若干デザインを見やすいように修正しています。
    Django1.4にて動作を確認しています。
Python、JavaScript関連の話題を中心に、ソフトウェア開発全般に関するお話を書いていこうと思います。
                
            


        