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をクリックします。※当然ですが、ツイッターのアカウントが一つ必要です。
こんな感じに入力しました。後で変更も可能なので、ざっくり入れます。
作成が完了すると、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にやらせよう ―ノンプログラマーにもできる自動化処理プログラミング
- 作者:Al Sweigart
- 出版社/メーカー: オライリージャパン
- 発売日: 2017/06/03
- メディア: 単行本(ソフトカバー)