Help us understand the problem. What is going on with this article?

DjangoでGoogle認証を行う

More than 5 years have passed since last update.

DjangoでGoogle認証を行う

Djangoのログインを独自のものではなくGoogleのアカウントを使ってやります。利用するモジュールのReadMeを読んでもぱっとわからなかったのでメモ。

使用するもの

バージョンは私が利用したものです。

  • Python: 2.7.8
    • Django: 1.7.7
    • python-social-auth: 0.2.3
    • その他上記のライブラリの依存関係にあるもの

手順

python manage.py runserverが実行できる状態であると仮定しています。
また、google appは作成済みでIDやsecret keyは取得しておいてください。

まずはpython-social-authをインストール
pip install python-social-auth

次にsettings.pyとurls.pyに設定を書き込みます。

project/setting.pyに以下を追記

INSTALLED_APPS = (
   ...
   'social.apps.django_app.default',
   ...
)

TEMPLATE_CONTEXT_PROCESSORS = (
   'django.contrib.auth.context_processors.auth',
   'django.core.context_processors.debug',
   'django.core.context_processors.i18n',
   'django.core.context_processors.media',
   'django.core.context_processors.static',
   'django.core.context_processors.tz',
   'django.contrib.messages.context_processors.messages',
   'social.apps.django_app.context_processors.backends',
   'social.apps.django_app.context_processors.login_redirect',
)

AUTHENTICATION_BACKENDS = (
   'social.backends.facebook.FacebookOAuth2',
   'social.backends.google.GoogleOAuth2',
   'social.backends.twitter.TwitterOAuth',
   'django.contrib.auth.backends.ModelBackend',
)

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = 'your secret id'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 'your secret key'

project_name/urls.py

urlpatterns = patterns('',
...
url('', include('social.apps.django_app.urls', namespace='social')),
url('', include('django.contrib.auth.urls', namespace='auth')),
...
)

次にtemplateの編集を行っていきます。
今回は管理画面のログイン・ユーザー登録をGoogle認証に置き換えます。

まずは管理画面のログイン画面を作成して既存のものにオーバーライドします。

templates/admin/login.htmlを作成し、こちらのファイルをコピペしてください。コピペしたファイル内のcontentブロックを書き換えます。(本来はlogin.html全体ではなく、部分的にオーバーライドするらしいのですが、わからないので全体をオーバーライドしています...)

{% block content %}
  <center>
  {% if user and not user.is_anonymous %}
     <h1><a href="{% url 'auth:logout' %}?next={{ request.path }}">Logout</a></h1>
  {% else %}
      <h1><a href="{% url 'social:begin' 'google-oauth2' %}?next={% url 'admin:index' %}">Login with Google</a></h1>
  {% endif %}
      </center>
{% endblock %}

手順は以上です。それでは実際に実行して確認してみてください。
以下、躓きやすい点をリストアップしました。

login.htmlをオーバーライドできない

  • settings.pyのTEMPLATE_DIRSを確認
    • settings.pyにTEMPLATE_DIRSを設定してプロジェクトのtemplates/admin内にlogin.htmlを置くことでオーバーライド出来ました。
    • TEMPLATE_DIRS = [os.path.join(BASE_DIR, 'templates')]

google認証でInvalid ~ と出る

  • たいていはリダイレクト先のURL登録ミス(私)
  • メールアドレスはgoogle appに登録したか?
  • そもそもsecret keyなどの情報は合っているか?

以上になります。作成してから書いたので抜け漏れがあるかもしれません。何か気づいた点があれば教えていただけると幸いです。

その他

メールアドレスでバリデーションする

settings.pyに以下を追加すればOK
SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_EMAILS = ['email address']
メールアドレスではなくメールアドレスのドメインでバリデーションする場合は以下を追加
SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = ['domain']

デフォルトでstaff, superuserを有効化する

adminにソーシャルログインして何も見られないのはつらいのでis_staffとis_superuserを最初から有効化したかったので、pipelineに独自で作成した関数を追加してやります。今回は作成したユーザーのis_staff, is_superuserを書き換えてやります。

project_name/custome_pipeline.py

def set_superuser(user, *args, **kwargs):
    user.is_staff = True
    user.is_superuser = True
    user.save()

あとはsettings.pyに以下を追加してやります。create_userのあとに作成した処理を差し込むのがポイント

SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details',
    'social.pipeline.social_auth.social_uid',
    'social.pipeline.social_auth.auth_allowed',
    'social.pipeline.social_auth.social_user',
    'social.pipeline.user.get_username',
    'social.pipeline.user.create_user',
    'project_name.custom_pipeline.set_superuser',  # 用意した関数へのパス
    'social.pipeline.social_auth.associate_user',
    'social.pipeline.social_auth.load_extra_data',
    'social.pipeline.user.user_details'
)

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away