1.14 AWS CognitoアカウントでDjangoにログイン(シングルサインオン) [Django]
最近、AWSを仕事で触ったりSPAに触れています。
DjangoでAWSのCognitoを利用してログインが出来たので
ここにやり方の備忘録を記載する。
仕様:
・Django通常?ADFS連携などと同様に、Cognitoアカウントでログインした時にそのユーザが存在しなければ
Django管理DBへユーザ情報を保存してくれます。
・Cognitoから受け取ったトークン情報をSessionに保持してくれます。
・シングルサインオンが実現出来る
--------------------------------------------------
▼追記
あとで調べると、こちらのパッケージで、ソース修正なしで対応されているらしい。
次回はこちらのツールを使って確認したいと思います。
https://django-allauth.readthedocs.io/en/latest/installation.html
▲追記ここまで
--------------------------------------------------
--------------------------------------------------
▼2021.10.23 追記
django-allauthを使って動作確認はこちらのサイトに記載しました。
https://qiita.com/MakotoPlus/items/894bc8c6c408fddc79a8
▲2021.10.23 追記ここまで
--------------------------------------------------
下記が環境構築作業になります。
前提条件、AWS側のcognito環境は出来ている。
1.初めに環境とか
ライブラリは、django-warrant 0.6.1を利用
下記pipコマンドでインストール
pip list コマンド結果は下記
2. DJangoプロジェクを作成
起動確認(画像は使いまわし)
コマンド:python manage.py runserver
3. cognito_prj/setting.pyファイルの修正
django-warrantで利用される情報を設定して行く
4. DB作成と、管理者ユーザ作成
下記コマンドを実行
起動確認して管理画面アクセス確認
6. cognito_prj/urls.pyソースの修正
(1) ログイン画面のURLは accounts/は、django_warrantパッケージ側でCognitoとのやりとりを処理してくれる
(2) user_info/は、ログイン後にトークンなどを参照できる画面
7. cognito_prj/templatetags/cognito_tags.pyファイル
どこかでtaglibを利用しているらしく作成が必要らしい
8. htmlテンプレートファイル群
ログイン画面などは実際には自分で作成する必要があるが、
サンプルのHTMLが用意されているのでダウンロードして配置する。
実際にどこか読み込まれているか分からないが面倒だったので下記3フォルダに配置した。
cognito_prj/templates/warrant/
templates/warrant/
templates/registration/
サンプルHTMLファイル
https://github.com/MetaMetricsInc/django-warrant/tree/master/django_warrant/templates/warrant
8. django-warrant ライブラリソースの修正
django-warrantが Django3.0に対応されていないためこのままでは動作しない・・。
ライブラリ更新がされていないからなのかな?
下記内容に書き換える必要がある。
いつか更新されるといいね。
(1) backend.py ファイルの修正
Djangoのバージョンチェックをしているがここが正しく動作していないらしい。
ググったりしてもこの情報はなんこかヒットしていましたのでそちらを参照し修正
ファイル:venv\Lib\site-packages\django_warrant\backend.py
参考サイト
(2) urls.pyファイルの修正
auth_views.login, auth_views.logout がエラーを起こすので書き換え
ファイル:venv\Lib\site-packages\django_warrant\urls.py
9. 稼働確認
(1) Django起動して下記URLへアクセスしてみます
http://localhost:8000/accounts/login/
(2) AWSアカウントユーザのログインID,パスワードを
入力してログインすると下記画面でアカウント情報も無事に出力されます。
(3) トークンID確認のため下記URLへアクセスすると、
セッションに保存されているのが確認できます。
http://localhost:8000/user_info/
10. 最後に
(1) このサンプルではユーザ変更も出来そうな感じですがこちらの動作は確認していません。
(2) 今回動作確認したプロジェクトはこちらのGitに保存しています。
https://github.com/MakotoPlus/cognito_prj
本家サイト:https://github.com/MetaMetricsInc/django-warrant
参考サイト: https://cloudstep.io/2019/03/18/cognito-authentication-integration-with-django-using-authorization-code-grant/
DjangoでAWSのCognitoを利用してログインが出来たので
ここにやり方の備忘録を記載する。
仕様:
・Django通常?ADFS連携などと同様に、Cognitoアカウントでログインした時にそのユーザが存在しなければ
Django管理DBへユーザ情報を保存してくれます。
・Cognitoから受け取ったトークン情報をSessionに保持してくれます。
・シングルサインオンが実現出来る
--------------------------------------------------
▼追記
あとで調べると、こちらのパッケージで、ソース修正なしで対応されているらしい。
次回はこちらのツールを使って確認したいと思います。
https://django-allauth.readthedocs.io/en/latest/installation.html
▲追記ここまで
--------------------------------------------------
--------------------------------------------------
▼2021.10.23 追記
django-allauthを使って動作確認はこちらのサイトに記載しました。
https://qiita.com/MakotoPlus/items/894bc8c6c408fddc79a8
▲2021.10.23 追記ここまで
--------------------------------------------------
下記が環境構築作業になります。
前提条件、AWS側のcognito環境は出来ている。
1.初めに環境とか
ライブラリは、django-warrant 0.6.1を利用
下記pipコマンドでインストール
Python version 3.8.5 Django==3.2 django-warrant django-utils-six==2.0
pip list コマンド結果は下記
Package Version ---------------------- --------- asgiref 3.3.4 boto3 1.17.62 botocore 1.20.62 certifi 2020.12.5 chardet 4.0.0 Django 3.2 django-braces 1.14.0 django-crispy-forms 1.11.2 django-extensions 3.1.3 django-utils-six 2.0 django-warrant 0.1.0 ecdsa 0.16.1 envs 1.3 future 0.18.2 idna 2.10 jmespath 0.10.0 pip 21.1.1 pycryptodome 3.3.1 python-dateutil 2.8.1 python-jose-cryptodome 1.3.2 pytz 2021.1 requests 2.25.1 s3transfer 0.4.2 setuptools 47.1.0 six 1.15.0 sqlparse 0.4.1 urllib3 1.26.4 warrant 0.6.1
2. DJangoプロジェクを作成
django-admin startproject cognito_prj
起動確認(画像は使いまわし)
コマンド:python manage.py runserver
3. cognito_prj/setting.pyファイルの修正
django-warrantで利用される情報を設定して行く
# # 自分のセキュリティKEYを設定してね SECRET_KEY = '' INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'django_warrant', 'crispy_forms', 'django_extensions', 'cognito_prj' ] # # 認証情報追加 # (django.contrib.auth.backends.ModelBackendはデフォルト) AUTHENTICATION_BACKENDS = [ 'django_warrant.backend.CognitoBackend', 'django.contrib.auth.backends.ModelBackend' ] # AWS CognitoユーザプールのプールID COGNITO_USER_POOL_ID='XXXXXXXX' # AWS CognitoアプリクライアントID COGNITO_APP_ID='XXXXXXXXXX' COGNITO_ATTR_MAPPING={ 'email': 'email', 'given_name': 'first_name', 'family_name': 'last_name', } # True=Djangoユーザを作成する(Default) # False=既存Djangoユーザのみが更新される COGNITO_CREATE_UNKNOWN_USERS=True # 使用したいAWSアクセスキーを設定します。デフォルトはNoneで、~/.aws/credentialsファイルにあるデフォルトのクレデンシャルが使用されます。 # AWS_ACCESS_KEY_ID # AWS_SECRET_ACCESS_KEY
4. DB作成と、管理者ユーザ作成
下記コマンドを実行
python manage.py migrate python manage.py createsuperuser
起動確認して管理画面アクセス確認
6. cognito_prj/urls.pyソースの修正
(1) ログイン画面のURLは accounts/は、django_warrantパッケージ側でCognitoとのやりとりを処理してくれる
(2) user_info/は、ログイン後にトークンなどを参照できる画面
app_name ='cognito_prj' from django.contrib import admin from django.urls import path from django.conf.urls import url, include from django.contrib.auth.views import LoginView, TemplateView urlpatterns = [ path('admin/', admin.site.urls), url(r'^accounts/', include(('django_warrant.urls','dw'))), path(r'user_info/', TemplateView.as_view(template_name='warrant/user_info.html'), name='user_info'), url(r'', LoginView.as_view(), {'template_name': 'warrant/login.html'}, name='login'), ]
7. cognito_prj/templatetags/cognito_tags.pyファイル
どこかでtaglibを利用しているらしく作成が必要らしい
from django import template register = template.Library() @register.filter('username') def username(user): return user._metadata.get('username')
8. htmlテンプレートファイル群
ログイン画面などは実際には自分で作成する必要があるが、
サンプルのHTMLが用意されているのでダウンロードして配置する。
実際にどこか読み込まれているか分からないが面倒だったので下記3フォルダに配置した。
cognito_prj/templates/warrant/
templates/warrant/
templates/registration/
サンプルHTMLファイル
https://github.com/MetaMetricsInc/django-warrant/tree/master/django_warrant/templates/warrant
8. django-warrant ライブラリソースの修正
django-warrantが Django3.0に対応されていないためこのままでは動作しない・・。
ライブラリ更新がされていないからなのかな?
下記内容に書き換える必要がある。
いつか更新されるといいね。
(1) backend.py ファイルの修正
Djangoのバージョンチェックをしているがここが正しく動作していないらしい。
ググったりしてもこの情報はなんこかヒットしていましたのでそちらを参照し修正
ファイル:venv\Lib\site-packages\django_warrant\backend.py
if DJANGO_VERSION[1] > 10: ↓ if DJANGO_VERSION[1] > 10 or DJANGO_VERSION[0] > 1:
参考サイト
(2) urls.pyファイルの修正
auth_views.login, auth_views.logout がエラーを起こすので書き換え
from django.conf.urls import url from django.contrib.auth import views as auth_views from .views import ProfileView,UpdateProfileView,MySubsriptions,\ AdminListUsers,AdminSubscriptions # # Add. from django.contrib.auth.views import LoginView from django.contrib.auth.views import LogoutView urlpatterns = ( #url(r'^login/$', auth_views.login, {'template_name': 'warrant/login.html'}, name='login'), #url(r'^logout/$', auth_views.logout, {'template_name': 'warrant/logout.html'}, name='logout'), url(r'^login/$', LoginView.as_view(), {'template_name': 'warrant/login.html'}, name='login'), url(r'^logout/$', LogoutView.as_view(), {'template_name': 'warrant/logout.html'}, name='logout'), url(r'^profile/$', ProfileView.as_view(),name='profile'), url(r'^profile/update/$', UpdateProfileView.as_view(),name='update-profile'), url(r'^profile/subscriptions/$', MySubsriptions.as_view(),name='subscriptions'), url(r'^admin/cognito-users/$', AdminListUsers.as_view(),name='admin-cognito-users'), url(r'^admin/cognito-users/(?P[-\w]+)$', AdminSubscriptions.as_view(),name='admin-cognito-user') )
ファイル:venv\Lib\site-packages\django_warrant\urls.py
9. 稼働確認
(1) Django起動して下記URLへアクセスしてみます
http://localhost:8000/accounts/login/
(2) AWSアカウントユーザのログインID,パスワードを
入力してログインすると下記画面でアカウント情報も無事に出力されます。
(3) トークンID確認のため下記URLへアクセスすると、
セッションに保存されているのが確認できます。
http://localhost:8000/user_info/
10. 最後に
(1) このサンプルではユーザ変更も出来そうな感じですがこちらの動作は確認していません。
(2) 今回動作確認したプロジェクトはこちらのGitに保存しています。
https://github.com/MakotoPlus/cognito_prj
本家サイト:https://github.com/MetaMetricsInc/django-warrant
参考サイト: https://cloudstep.io/2019/03/18/cognito-authentication-integration-with-django-using-authorization-code-grant/
コメント 0