SSブログ

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コマンドでインストール
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
WS000003.JPG


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


起動確認して管理画面アクセス確認
WS000069.JPG


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/
WS000070.JPG

(2) AWSアカウントユーザのログインID,パスワードを
入力してログインすると下記画面でアカウント情報も無事に出力されます。
WS000071.JPG

(3) トークンID確認のため下記URLへアクセスすると、
セッションに保存されているのが確認できます。
http://localhost:8000/user_info/

WS000072.JPG


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/








nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。