みずラテ

牛乳と水を2対1で。

Django2.0でsocial-auth-app-djangoを使用してTwitter認証してみる

Djangoで作成中のアプリで、Twitterからユーザーログインをさせたいと思っており、調べてやってみました。

超参考にさせていただいた記事

いろんな記事を漁りましたが、こちらの記事をほとんどコピペでいけました。
qiita.com

環境

レンタルサーバーを借りており、以下の環境になります。

CentOS Linux release 7.4.1708
Python 3.6.4
Django 2.0.2
Apache 2.4.6

なお、今回Djangoプロジェクトはmysite、アプリ名はappsにしています。

Twitter Appsでアプリ設定

Twitter認証をするためには

  • Consumer Key
  • Consumer Secret

が必要となります。
そのため、https://apps.twitter.com/にアクセスして、Create New Appをクリックします。※当然ですが、ツイッターのアカウントが一つ必要です。
f:id:taris777:20180310203454p:plain

こんな感じに入力しました。後で変更も可能なので、ざっくり入れます。

作成が完了すると、Keys and Access TokensにConsumer KeyとConsumer Secretがありますので、メモしておきましょう。

social-auth-app-djangoのインストール

簡単にTwitter認証を実装できるsocial-auth-app-djangoを使用します。
virtualenvに入った上で、以下のpipコマンドにてインストール

pip install social-auth-app-django

Twitter認証キーの保存

mysite/mysite/configs/twitter.py

SOCIAL_AUTH_TWITTER_KEY = 'XXXXXX'
SOCIAL_AUTH_TWITTER_SECRET = 'XXXXXX'

Settings.py

追加する記述は以下。

mysite/mysite/settings.py

from mysite.configs import twitter

INSTALLED_APPS = [
    :
    'social_django',
]

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]

#ログイン未済の時のリダイレクト先
LOGIN_URL = '/login/'

###twitter認証関連
AUTHENTICATION_BACKENDS = [
    'social_core.backends.twitter.TwitterOAuth',
    'django.contrib.auth.backends.ModelBackend',
]

#Twitter認証のConsumer Keyなど
SOCIAL_AUTH_TWITTER_KEY = twitter.SOCIAL_AUTH_TWITTER_KEY
SOCIAL_AUTH_TWITTER_SECRET = twitter.SOCIAL_AUTH_TWITTER_SECRET

#OAuth認証後のリダイレクト先 トップページとか
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/top/'

トップページ、ログインページ、ログアウトページを作成

トップページはtemplates内に、index.html(url petternでtopという名前で後で呼び出す。)を作成。
同じくtemplates内にlogin.htmlと、logout.htmlを作成

/mysite/apps/templates/apps/index.html

<!DOCTYPE html>
<html lang="ja-jp">
<head>
  <title>Twitter認証</title>
</head>
<body>
  <br></br>
  <p>{{ user }}</p>
  <br></br>
</body>
</html>

userは認証後のTwitter IDを返します。 (views.pyに記述要、下に書きます。)

/mysite/apps/templates/apps/login.html

<!DOCTYPE html>
<html lang="ja-jp">
<head>
  <title>Rankin5</title>
</head>
<body>
  <button type="button" onclick="location.href='{% url 'social:begin' 'twitter' %}'">Twitter</button>
</body>
</html>

/mysite/apps/templates/apps/logout.html

<!DOCTYPE html>
<html>
<head>
 <title>ログアウト</title>
</head>
<body>
  <div>
    <p>
      ログアウトしました。
    </p>
    <p>
      <a href="/login"><button type="button" >ログインページへ</button></a>
    </p>
  </div>
</body>
</html>

login.html、logout.htmlは超適当です。

urls.pyの編集

/mysite/mysite/urls.py

from django.contrib import admin
from django.urls import include, path
from apps import views
import django.contrib.auth.views

urlpatterns = [
    path('', include('social_django.urls', namespace = 'social')),
    path('top/', views.index, name='index'),
    path('admin/', admin.site.urls),
    path('login/', django.contrib.auth.views.login, {'template_name': 'apps/login.html'}, name='login'),
    path('logout/', django.contrib.auth.views.logout, {'template_name': 'apps/logout.html'}, name='logout'),
]

views.pyの編集

/mysite/apps/views.py

from django.shortcuts import render,
from django.http import HttpResponse
from django.contrib.auth.decorators import login_required
from social_django.models import UserSocialAuth

# Create your views here.
@login_required
def index(request):
    user = UserSocialAuth.objects.get(user_id=request.user.id)
    pageDic = { 'user':user }
    return render(request, 'apps/index.html', pageDic)

user.idにはTwitterのIDが格納されており、これをindex.htmlで表示してみます。

migrate

social-auth-app-djangoをインストールした後、migrateしてDBに反映させる必要があります。
コマンドラインにて

python manage.py migrate

確認!

これで大丈夫なはずです。いろんな記事をみてようやくできるようになりました。

いろんなサービスで導入されているTwitterログインがちゃんと動くとなんかワクワクしますね〜

ちなみに、adminでユーザーテーブルをみてみるとログインしたTwitterアカウントの情報が登録されていました。

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング

  • 作者:Al Sweigart
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2017/06/03
  • メディア: 単行本(ソフトカバー)