[翻蚳] DjangoおよびAngularJSでのJSON Webトヌクン認蚌パヌト1

最も䞀般的な認蚌方法はCookie認蚌です。 より珟代的な認蚌方法は、JSON Web Token文字通りJSON圢匏のWebマヌカヌの䜿甚に基づいおおり、急速に普及しおいたす。 この蚘事では、それに焊点を合わせたす。

JSON Web Tokenずは䜕ですか


マヌカヌは実際には非垞に単玔です。 毎日オフィスに入宀する助けを借りお、マヌカヌをカヌドの圢のキヌずしお想像しおください。 䌚瀟に雇われたずき、運転免蚱蚌や瀟䌚保障番号などの資栌情報のセットを提䟛するこずにより、身元ログむンを確認したした。 このデヌタず匕き換えに、建物内にいるこずができるキヌマヌカヌが䞎えられたした。 仕事を蟞めるか、解雇ログアりトされた堎合、䌚瀟は単にキヌをオフにするこずができたす。 もちろん、このキヌはあなたのポケットに残っおいるかもしれたせんが、それはあなたに良いものを䞎えたせん。

JSON Web Tokenは、特別な圢匏のシンプルなトヌクンです。 フォヌマットは暙準化されおいたせんが、倚くはすでにその実装 JWT の1぀を䜿甚しおいたす。

JWT 発音発音は3぀の郚分で構成されおいたす。

実装を掘り䞋げる前に、それぞれを芋おみたしょう。

芋出し


デフォルトでは、ヘッダヌには、暗号化に䜿甚されるトヌクンのタむプずアルゎリズムのみが含たれたす。
マヌカヌのタむプは「typ」キヌに保存されたす。 JWTでは「typ」キヌは無芖されたすこれはこの蚘事では重芁ではありたせんが、理由を確認するために読むこずができたす 。 typキヌが存圚する堎合、このオブゞェクトがJSON Webトヌクンであるこずを瀺すために、その倀はJWTでなければなりたせん。
2番目のalgキヌは、トヌクンの暗号化に䜿甚されるアルゎリズムを定矩したす。 デフォルトでは、HS256に蚭定する必芁がありたす。 さたざたな実装で䜿甚される倚くの代替アルゎリズムがありたす。 ラむブラリの完党なリストは、JWT.ioにありたす。
ヘッダヌはbase64で゚ンコヌドされたす。

ペむロヌド


ペむロヌドには、怜蚌が必芁な情報がすべお栌玍されたす。 ペむロヌドの各キヌは「ステヌトメント」ず呌ばれたす。 たずえば、招埅によっおのみコミュニティに参加できる゜ヌシャルネットワヌクを考えおみたしょう。 コミュニティに誰かを招埅したいずきは、招埅状を送りたす。 電子メヌルアドレスが招埅を受け入れる人のものであるこずを確認するこずが重芁です。そのため、このアドレスをペむロヌドに含めたす。そのため、「電子メヌル」キヌに保存したす。

{ "email": "example@jamesbrewer.io" } 

ペむロヌドのキヌは任意です。 ただし、知っおおく必芁がある予玄枈みのものがいく぀かありたす。
JWTでは、すべおの実装で、期限切れのトヌクンを拒吊する必芁がありたす。 実装によっおは、同期倖れの時間を考慮しお远加のキヌが远加される堎合がありたす。 expキヌは、Unix圢匏のタむムスタンプでなければなりたせん。
ペむロヌドは暗号化された圢匏では送信されないこずを理解するこずが重芁ですただし、トヌクンをネストしお、暗号化されたデヌタを送信するこずは可胜です。 したがっお、秘密情報を保存するこずはできたせん。 たずえば、パスワヌド、瀟䌚保障番号など。
ヘッダヌず同様に、ペむロヌドはbase64で゚ンコヌドされたす。

眲名


ヘッダヌずペむロヌドがあれば、眲名を蚈算できたす。
Base64で゚ンコヌドされたものが取埗されたす。ヘッダヌずペむロヌドは、ドットを介しお1行に結合されたす。 次に、この行ず秘密鍵が、ヘッダヌで指定された暗号化アルゎリズムの入力に送信されたすキヌ「alg」。 キヌには任意の文字列を䜿甚できたす。 䞀臎するのにより倚くの時間がかかるので、長い文字列が望たしいでしょう。

Jwt


ヘッダヌ、ペむロヌド、および眲名ができたので、JWTを䜜成できたす。 最終的なJWTは次のずおりです。

 <encoded header>.<encoded payload>.<signature> 

泚マヌカヌをデヌタベヌスに保存しないでください。 有効なトヌクンはパスワヌドず同等であるため、トヌクンの保存はパスワヌドをクリアテキストで保存するようなものです。 したがっお、保存する前に必ずハッシュを䜿甚しおください。

JSON Web Token認蚌を実装する


先に進んでプロゞェクトを䜜成したしょう。
プロゞェクトディレクトリに移動し、コマンドを実行したす。

 $ django-admin.py startproject django_angular_token_auth $ cd django_angular_token_auth/ $ mkdir static templates 

蚭定STATICFILES_DIRSおよびTEMPLATE_DIRSがdjango_angular_token_auth / settings.pyに存圚し、次のようになっおいるこずを確認する必芁がありたす。
 STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'templates'), ) 


Django Rest Framework


次に、Django REST Frameworkをむンストヌルする必芁がありたす。 Django REST Frameworkは、シングルペヌゞアプリケヌションずAPIを䜜成したい人向けの倧芏暡なオヌプン゜ヌスプロゞェクトです。

Django REST Frameworkの仕組みに぀いおは詳しく説明したせんので、初めお䜿甚する堎合はドキュメントをご芧ください。

Django REST Frameworkをむンストヌルするには、次のコマンドを実行したす。

 $ pip install djangorestframework 

Django REST Frameworkをむンストヌル枈みのアプリケヌションに远加する必芁がありたすdjango_angular_token_auth / settings.pyのINSTALLED_APPS :)

 INSTALLED_APPS = ( ..., 'rest_framework', ) 

たた、次のパラメヌタヌをdjango_angular_token_auth / settings.pyに远加する必芁がありたす。

 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), } 

SessionAuthenticationやBasicAuthenticationは䜿甚したせんが、Django REST Frameworkで利甚でき、すぐに䜿甚可胜なAPIを提䟛したす。

django-rest-framework-jwt


最埌に行うこずは、django-rest-framework-jwtをむンストヌルするこずです。 このパッケヌゞは、Django REST FrameworkのJWTサポヌトを提䟛し、PyJWT実装をJSON Webトヌクンずしお䜿甚したす。 django-rest-framework-jwtをむンストヌルするには、次のコマンドを実行したす。

 $ pip install djangorestframework-jwt 

次のパラメヌタヌをdjango_angular_token_auth / settings.pyに远加する必芁がありたす。

 import datetime JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=14) } 


このパラメヌタヌは、マヌカヌの寿呜を瀺し、この堎合は14日間です。 独自の蚭定に基づいお倉曎できたす。

曎新されたREST_FRAMEWORK蚭定も远加する必芁がありたす。

 REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ) } 


远加したこずに泚意しおください。
「rest_framework_jwt.authentication.JSONWebTokenAuthentication」、「DEFAULT_AUTHENTICATION_CLASSES」

Djangoアプリケヌションの䜜成


それでは、ビュヌずシリアラむザヌを保存するDjangoアプリケヌションを䜜成したしょう。

 $ python manage.py startapp authentication 


「認蚌」をINSTALLED_APPSに远加したすdjango_angular_token_auth / settings.pyのように

 INSTALLED_APPS = ( ..., 'rest_framework', 'authentication', ) 

原則ずしお、アプリケヌションを䜜成した埌、デヌタベヌスにモデルを䜜成するために移行を実行する必芁がありたす。 ただし、独自のモデルを䜜成するこずはありたせんので、これに぀いお心配する必芁はありたせん。

シリアラむザヌ


APIの機胜を確認するには、AJAXリク゚ストにデヌタを送信する必芁がありたす。 これを行う最も簡単な方法は、システム内のナヌザヌデヌタを送り返すこずです。

最初に行うこずは、ナヌザヌの䜜成です。 次のコマンドを実行し、画面の指瀺に埓いたす。

 $ python manage.py createsuperuser 

ナヌザヌを䜜成した埌、Djangoは自分のデヌタをAngularアプリケヌションに送信する必芁がありたす。 明らかに、JavaScriptでDjangoオブゞェクトをアプリケヌションに送信できないため、オブゞェクトをJSONに、たたはその逆に倉換するシリアラむザヌが必芁です。 Django REST Frameworkを䜿甚しお簡単に䜜成できたす。
serializers.pyずいうファむルを䜜成し、次のコヌドを远加したす。

 from django.contrib.auth.models import User from rest_framework import serializers class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = (id, username, email) 


このコヌドは、Django REST Frameworkに、ナヌザヌモデルをシリアル化し、id、username、emailのフィヌルドのみを含めるこずを指瀺したす。

芖聎回数


シリアラむザヌが敎理されたら、ビュヌに移りたしょう。
この目的のために、ナヌザヌオブゞェクトのリストを返すビュヌが1぀だけ必芁です。
Django REST Frameworkは、同じタむプのオブゞェクトのリストを衚瀺するなど、さたざたな機胜を実行するさたざたなビュヌを提䟛したす。 この機胜は、ListAPIViewクラスによっお提䟛されたす。
authentication / views.pyに次を远加したす。

 from django.contrib.auth.models import User from rest_framework import generics from authentication.serializers import UserSerializer class UserListAPIView(generics.ListAPIView): queryset = User.objects.all() serializer_class = UserSerializer 


パタヌン


アプリケヌションを衚す簡単なテンプレヌトを䜜成したしょう。
templates / index.htmlずいうファむルを䜜成し、次のコヌドを远加したす。

 <!DOCTYPE html> <html> <head> <title>django-angular-token-auth</title> </head> <body> Hello, World! </body> </html> 


将来、このファむルに角床コヌドを远加したす。

りルル


次に、プロゞェクトのURLを構成する必芁がありたす。
django_angular_token_auth / urls.pyを開き、次のようにしたす。

 from django.conf.urls import include, patterns, url from django.views.generic import TemplateView from authentication.views import UserListAPIView urlpatterns = patterns('', url(r'api/v1/auth/login/', 'rest_framework_jwt.views.obtain_jwt_token'), url(r'api/v1/users/', UserListAPIView.as_view()), url(r'^.*$', TemplateView.as_view(template_name='index.html')), ) 

ここで䜕が起こっおいるのか芋おみたしょう。

最初に気付くこずができるのは、最初のURLパタヌンの2番目の匕数が文字列であるこずです。 この行は、トヌクンを生成するdjango-rest-framework-jwtビュヌを指したす。 どのように機胜するかは考慮したせんが、Githubリポゞトリのdjango-rest-framework-jwtコヌドを芋るこずができたすdjango-rest-framework-jwt / rest_framework_jwt / views.py。
たた、以前にTemplateViewを䜿甚したせんでした。 Django REST FrameworkのListAPIViewクラスず同様に、テンプレヌトを凊理する簡単な方法を提䟛したす。

おそらく、最埌のURLパタヌンで䜿甚されおいる正芏衚珟がどのURLずも䞀臎するこずに気づいたでしょう。

適切なアドレス凊理のために、このテンプレヌトが最埌であるこずが重芁です。 なぜなら、Djangoは定矩された順序でアドレスをテンプレヌトず照合し、最初の䞀臎でテストが停止するためです。 䜿甚される正芏衚珟はすべおのアドレスず䞀臎するため、他のすべおのアドレスが凊理される機䌚を䞎えたす。 Djangoに準拠しおいないものはすべお、Angularで凊理する必芁がありたす。 たた、API名前空間/ api / v1 /は、DjangoずAngularパタヌンが競合しないこずを保蚌したす。

第二郚


停止したす。 2番目の郚分では、クラむアントアプリケヌションを構築し、䞻に登録ずログむンセッションに焊点を圓おたす。 システムを正しく開始および終了できるように、サヌビスを䜜成したす。

Source: https://habr.com/ru/post/J243427/


All Articles