OAuthを使ってDjangoでソーシャル認証システムを構築する方法

ソーシャル認証は、パスワードを使用する代わりにソーシャルアカウントを使用して個人の身元を確認する方法です。Web開発では、パスワードなしでユーザーを認証することが常に役立ちます。これにより、ユーザーはGoogle、Twitter、GitHubなどのソーシャルアプリでログインできます。

ソーシャル認証を有効にすると、一般的なパスワード関連の脆弱性のリスクを軽減することにより、アプリケーションのセキュリティを強化できます。また、ユーザーは多くのパスワードを覚える必要がないため、アプリのユーザーエクスペリエンスが向上します。

Djangoでのユーザー認証

Djangoは、開発者が使用できるデフォルトの認証システムを提供しています。ただし、この認証システムは従来の認証を使用しており、ユーザー名、メール、パスワード、名、姓などのデータを手動で収集する必要があります。

Djangoの認証システムは設計上非常に汎用性が高く、今日のほとんどのWeb認証システムで使用されている多くの機能を提供していません。これを補完するために、django-allauthパッケージなどのサードパーティ製パッケージを使用する必要があります。

DjangoでOAuthを有効にする方法

DjangoアプリケーションでOAuthを使用してユーザーを認証するには、django-allauthというDjangoパッケージを使用できます。

Django Allauthは、Djangoプロジェクトの認証、登録、アカウント管理、サードパーティ(ソーシャル)アカウント認証を処理するパッケージです。次の手順に従うと、DjangoプロジェクトのDjango Allauthを設定できます。

ステップ1:Django-Allauthのインストールと設定

まだ実行していない場合は、仮想環境を作成し、pip経由でdjango-allauthをインストールします。

pip install django-allauth

動作させるには、Python 3.5以上とDjango 2.0以上を使用している必要があります。

ステップ2:Django-Allauth用の必須アプリをDjangoに追加する

django-allauthをインストールしたら、settings.pyファイルを開き、次のアプリをINSTALLED_APPSリストに追加します。

INSTALLED_APPS = [
"""
Add your other apps here
"""
# Djang Allauth configuration apps
'django.contrib.sites',
'allauth',
'allauth.account',
'allauth.socialaccount',
]

上記のアプリのいくつかについて注意すべき点がいくつかあります。

  • allauth.socialaccountアプリを使用すると、ユーザーはX(旧Twitter)、Instagram、GitHubなどのソーシャルアプリでサインインできます。
  • django.contrib.sitesアプリは、django-allauthを動作させるために必要なDjangoフレームワークの組み込みアプリです。このアプリは、単一のDjangoプロジェクト内で複数のサイトを管理し、区別する機能を提供します。Djangoのドキュメントを参照して、その仕組みを理解できます。

ステップ3:プロジェクトの認証バックエンドを定義する

次のステップは、ユーザーを認証する方法を定義することです。これは、settings.pyファイルでAUTHENTICATION_BACKENDSを構成することで実行できます。django-allauthの場合は、次のものを追加する必要があります。

AUTHENTICATION_BACKENDS = [
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
]

上記のコードスニペットは2つの認証バックエンドを定義します。

  1. 1つ目は、Djangoで使用されるデフォルトのものです。これにより、管理者はdjango-allauthの構成に関係なく、管理パネルにログインできます。
  2. 2つ目は、django-allauthの認証バックエンドを定義します。

ステップ4:サイトIDを追加する

設定ファイルに、サイトのIDを追加する必要があります。例を次に示します。

SITE_ID = 1

デフォルトでは、管理パネルにexample.comというサイトがあります。このサイトを変更するか、自分でサイトを追加することを決定できます。いずれの場合も、管理パネルにログインしてサイトアプリに移動する必要があります。

DjangoサイトのサイトIDを取得するには、コマンドラインインターフェイス(CLI)を開いて次のコマンドを実行します。

python manage.py shell

次に、このスクリプトをPythonシェルに書き込みます。

from django.contrib.sites.models import Site
current_site = Site.objects.get_current()
site_id = current_site.id
site_name = current_site.name
print("Site ID:", site_id)
print("Site Name:", site_name)

上記のコードは、サイトの名前とそのIDを出力します。

ステップ5:URLを構成する

プロジェクトのurls.pyファイルで、django-allauthのURLパターンを構成します。以下のようにする必要があります。

from django.urls import path, include
urlpatterns = [
# Djang-allauth url pattern
path('accounts/', include('allauth.urls')),
]

この設定により、開発サーバーを起動してhttp://127.0.0.1:8000/accounts/に移動できます。DEBUGTrueに設定している場合、django-allauthで使用可能なURLパターンのリストが表示されます。

上記の手順が完了したら、プロジェクトはソーシャル認証の準備が整います。

DjangoアプリでGoogleログイン/サインアップを実装する方法

django-allauthの設定後、ユーザーがGoogleなどのソーシャルアカウントで認証できるようにする準備が整います。

ステップ1:インストール済みアプリにソーシャルアカウントプロバイダーを登録する

settings.pyファイルで、INSTALLED_APPSにソーシャルアカウントプロバイダーを追加する必要があります。この場合は、Googleです。その他のオプションには、Instagram、Xなどがあります。

INSTALLED_APPS = [
"""
Add your other apps here
"""
# Social account provider (google)
'allauth.socialaccount.providers.google',
]

ステップ2:GoogleでクライアントIDとシークレットキーを作成する

この手順を完了するには、Googleアカウントを作成しておく必要があります。作成済みであれば、次の手順に従ってください。

  1. Google Cloudコンソールにアクセスして、新しいプロジェクトを作成します。まず、下の画像に示されているドロップダウンをクリックします。
  2. 次に、新しいプロジェクトをクリックします。
  3. プロジェクトの名前を入力し、作成ボタンをクリックします。
  4. プロジェクトを選択したら、ハンバーガーメニューをクリックします。APIとサービスを選択し、次に認証情報を選択します。
  5. 次に、同意画面の構成というオプションをクリックし、外部を選択します。
  6. 次のページで、アプリの名前を入力し、必要に応じてメールを含めます。カスタマイズのために構成を調べることもできます。完了したら、保存して続行をクリックします。
  7. 左側のメニューで、認証情報を選択します。その後、認証情報の作成をクリックし、OAuthクライアントIDを選択します。
  8. 次に、アプリケーションの種類を選択し、同じ名前を入力します。このチュートリアルでは、アプリケーションの種類Webアプリケーションになります。
  9. 次に、承認されたJavaScriptのオリジン承認されたリダイレクトURIのURIを追加します。WebサイトのホストはJavaScriptのオリジンである必要があり、認証後にシステムはユーザーをリダイレクトURIにリダイレクトします。リダイレクトURIは通常、your-host-name/accounts/google/login/callback/を含める必要があります。開発モードの場合は、http://127.0.0.1:8000/accounts/google/login/callback/になります。完了したら、作成をクリックします。
  10. 認証情報を作成したら、クライアントIDまたはクライアントシークレットを安全な場所にコピーするか、JSONファイルとしてダウンロードできます。

ステップ3:クライアントIDとシークレットキーをDjangoアプリに追加する

必要な認証情報を作成したら、http://127.0.0.1:8000/adminに移動し、ソーシャルアプリケーションを選択して、新しいソーシャルアプリケーションを作成します。新しいソーシャルアプリを作成するには、次の手順に従います。

  1. プロバイダーを追加します。プロバイダーとは、ユーザーを認証するアプリを指します。この場合はGoogleですが、別の場合はSnapchatになる可能性があります。
  2. 新しいソーシャルアプリの名前を入力します。妥当な名前であることを確認してください
  3. GoogleからコピーしたクライアントIDを貼り付けます。
  4. シークレットキーには、Googleからコピーしたクライアントシークレットを貼り付けます。
  5. キーフィールドはGoogleでの認証には適用されないので、無視してください。
  6. 最後に、ソーシャルアプリケーションを関連付けるサイトを選択します。

ステップ4:Google認証をテストする

管理パネルからログアウトし、http://127.0.0.1:8000/accounts/login/に移動します。Google経由でログインするオプションが表示されます。

クリックすると同意画面にリダイレクトされます。次に、ログインするアカウントを選択します。

アカウントを選択すると、http://127.0.0.1:8000/accounts/profile/にリダイレクトされます。これは、アプリが正常に機能していることを意味します。カスタムテンプレートを作成して、デフォルトのテンプレートを置き換えることができます。

Djangoでソーシャル認証でユーザー登録を強化する

ソーシャル認証を有効にすると、ユーザーがアプリケーションに登録する際に素晴らしいエクスペリエンスを提供するのに最適な方法です。Djangoでは認証を有効にする方法は他にもあり、ユースケースに最適なものを決定するためにそれらを調査する必要があります。