NuxtjsとDjango RESTフレームワークによるユーザ認証の設定[パート‐1]
チュートリアルは2つの部分に分割されている-バックエンドを設定し、フロントエンドを設定します.
repoには二つの分岐があります.
このチュートリアルおよび次のファイル.
チュートリアル2
ギタブレポhttps://github.com/IgnisDa/django-nuxtjs-authentication
トークン認証を使用しますdjoser パッケージ
認証バックエンドAPIを実装して、nuxtjsフロントエンドでそれを消費してください.
注意:簡潔さのために、私はすべてのコメントを省略します
作業の説明しかしながら、コードはよくコメントされます
githubリポジトリ経由でアクセスできます.
必要条件 Djangoレストフレームワークに精通して Nuxt Authに関する知識
バックエンドの設定
次のパッケージを仮想環境にインストールします ジャンゴ フレームワーク ドジョーザ ジャンゴコープス httpie メールの検証 共通のディレクトリを作ることから始める
デフォルト値
用途
その後
そして、
次にシリアライズを設定します
方法
パス
目的
ゲット
アカウント/データ
現在ログインしているユーザのデータを取得します.匿名ユーザーはこのページにアクセスできません.
ゲット
アカウント/ユーザー/
データベース内のすべてのユーザーの一覧.
ポスト
アカウント/ユーザー/
POSTリクエストを伴うデータを使用して新しいユーザーを作成します.
パッチ/プット
アカウント/ユーザー/
更新、またはユーザーのすべてのユーザーの詳細を変更する
ポスト
トークン/ログイン/
Aを送る
ポスト
トークン/ログアウト
Aを送る
使おう
私たちのエンドポイントの仕事.
我々のフロントエンドが
私たちのバックエンドを使用して
あなたのNuxtjsフロントエンドに認証を加える方法を学ぶために、パート2をチェックアウトしてください.
チュートリアル2
repoには二つの分岐があります.
part-1
and part-2
. part-1
このチュートリアルのファイルを含みます.part-2
含むこのチュートリアルおよび次のファイル.
チュートリアル2
ギタブレポhttps://github.com/IgnisDa/django-nuxtjs-authentication
トークン認証を使用しますdjoser パッケージ
認証バックエンドAPIを実装して、nuxtjsフロントエンドでそれを消費してください.
注意:簡潔さのために、私はすべてのコメントを省略します
作業の説明しかしながら、コードはよくコメントされます
githubリポジトリ経由でアクセスできます.
必要条件
バックエンドの設定
次のパッケージを仮想環境にインストールします
nuxtjs+drf-user-auth/
フロントエンド(Nuxtjs)とバックエンド(Djangoレストフレームワーク)が別々に住んでいるところfrontend/
and backend/
ディレクトリ.mkdir nuxtjs+drf-user-auth && cd nuxtjs+drf-user-auth/
django-admin startproject backend && cd backend/
python manage.py startapp accounts
新しいアプリとアドオンを追加しますsettings.py
.# backend/settings.py
INSTALLED_APPS = [
# other stuff
'rest_framework',
'rest_framework.authtoken',
'corsheaders',
'accounts.apps.AccountsConfig',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'corsheaders.middleware.CorsMiddleware',
# Other stuff
]
次に、ユーザー認証を処理するカスタムユーザーモデルを定義します.これにより、ユーザモデルにより多くのフィールドを追加することができますデフォルト値
django.contrib.auth.models.User
提供する用途
email
の代わりにデフォルト識別子としてusername
.# accounts/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.utils.translation import gettext_lazy as _
from . import managers # we will write this file shortly
class CustomUser(AbstractUser):
username = None
email = models.EmailField(_('email address'), unique=True)
bio = models.TextField()
gender = models.CharField(
max_length=140,
null=True,
choices=(
('Male', 'Male'),
('Female', 'Female'),
('Other', 'Other')
)
)
birth_date = models.DateField(null=True, blank=True)
pro = models.BooleanField(default=False)
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
objects = managers.CustomUserManager()
def __str__(self):
return f"{self.email}'s custom account"
# accounts/managers.py
from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import gettext_lazy as _
from validate_email import validate_email
class CustomUserManager(BaseUserManager):
def create_user(self, email, password, **extra_fields):
if not email:
raise ValueError(_('The Email must be set'))
email = self.normalize_email(email)
if not validate_email(email):
raise ValueError(_('Invalid email set'))
user = self.model(email=email, **extra_fields)
user.set_password(password)
user.save()
return user
def create_superuser(self, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
extra_fields.setdefault('is_superuser', True)
extra_fields.setdefault('is_active', True)
if extra_fields.get('is_staff') is not True:
raise ValueError(_('Superuser must have is_staff=True.'))
if extra_fields.get('is_superuser') is not True:
raise ValueError(_('Superuser must have is_superuser=True.'))
return self.create_user(email, password, **extra_fields)
関連する設定をsettings.py
ファイル.# backend/settings.py
AUTH_USER_MODEL = 'accounts.CustomUser'
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [
'rest_framework.authentication.TokenAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
],
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated',
]
}
次に、基本的なURLを設定します.# backend/urls.py
from django.contrib import admin
from django.urls import include, path
urlpatterns = [
path('accounts/', include('accounts.urls')),
path('', include('djoser.urls.authtoken')),
path('admin/', admin.site.urls),
]
ランmakemigrations
, migrate
, を使って新しいスーパーユーザを作成するcreatesuperuser
. 開発サーバーを起動するrunserver
, andその後
token/login/
あなたのブラウザで.正しい資格情報を入力しますそして、
auth_token
プロパティ.また訪問token/logout/
, それは使えませんが.次にシリアライズを設定します
CustomUser
モデル.# accounts/serializers.py
from django.contrib.auth import get_user_model
from rest_framework import serializers, validators
CustomUser = get_user_model()
class CustomUserSerializer(serializers.ModelSerializer):
email = serializers.CharField(
write_only=True, validators=[validators.UniqueValidator(
message='This email already exists',
queryset=CustomUser.objects.all()
)]
)
password = serializers.CharField(write_only=True)
birth_date = serializers.CharField(required=False)
bio = serializers.CharField(required=False)
gender = serializers.CharField(required=False)
last_name = serializers.CharField(required=False)
first_name = serializers.CharField(required=False)
birth_date = serializers.CharField(required=False)
class Meta:
model = CustomUser
fields = ('first_name', 'last_name', 'email',
'password', 'bio', 'gender', 'birth_date')
class CustomUserRetrieveSerializer(serializers.ModelSerializer):
birth_date = serializers.CharField(required=False)
bio = serializers.CharField(required=False)
gender = serializers.CharField(required=False)
class Meta:
model = CustomUser
fields = ('first_name', 'last_name', 'email',
'bio', 'gender', 'birth_date', 'id')
次に、これらのserializersを使用してフロントエンドにデータを配信するビューとビューセットを定義します.# accounts/views.py
from django.contrib.auth import get_user_model
from rest_framework import generics, permissions
from . import serializers
CustomUser = get_user_model()
class UserRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
queryset = CustomUser.objects.all()
serializer_class = serializers.CustomUserRetrieveSerializer
permission_classes = (permissions.IsAuthenticated,)
def get_object(self):
return self.request.user
# accounts/viewsets.py
from django.contrib.auth import get_user_model
from rest_framework import permissions, viewsets
from . import serializers
CustomUser = get_user_model()
class CustomUserModelViewSet(viewsets.ModelViewSet):
serializer_class = serializers.CustomUserSerializer
permission_classes = (permissions.AllowAny,)
queryset = CustomUser.objects.all()
def perform_create(self, serializer):
instance = serializer.save()
instance.set_password(instance.password)
instance.save()
# accounts/routers.py
from rest_framework import routers
from . import viewsets
router = routers.DefaultRouter()
router.register('', viewsets.CustomUserModelViewSet)
# accounts/urls.py
from django.urls import include, path
from . import routers, views
urlpatterns = [
path('data/', views.UserRetrieveUpdateDestroyAPIView.as_view(),
name='user-data'),
path('users/', include(routers.router.urls)),
]
新しいURLは以下の目的のためにいくつかのエンドポイントを公開します.方法
パス
目的
ゲット
アカウント/データ
現在ログインしているユーザのデータを取得します.匿名ユーザーはこのページにアクセスできません.
ゲット
アカウント/ユーザー/
データベース内のすべてのユーザーの一覧.
ポスト
アカウント/ユーザー/
POSTリクエストを伴うデータを使用して新しいユーザーを作成します.
パッチ/プット
アカウント/ユーザー/
<pk>
/更新、またはユーザーのすべてのユーザーの詳細を変更する
pk
.ポスト
トークン/ログイン/
Aを送る
POST
正しい資格情報を要求し、ログイントークンと呼ばれるauth_token
.ポスト
トークン/ログアウト
Aを送る
POST
リクエストauth_token
ヘッダーと対応するユーザでログアウトされます.使おう
httpie
かどうかを調べる私たちのエンドポイントの仕事.
# Register a new user
$ http POST http://127.0.0.1:8000/accounts/users/ email='[email protected]' password="test-pass" first_name="Dabreil" last_name="Ignis"
{
"bio": "",
"birth_date": null,
"first_name": "Dabreil",
"gender": null,
"last_name": "Ignis"
}
# Login using the new user
# You can visit `admin/authtoken/token/` to see the new token generated
$ http POST http://127.0.0.1:8000/token/login/ email='[email protected]' password="test-pass"
{
"auth_token": "b1a73afd0431c87b5e0c4afb4b085d401d652edb"
}
# Access data using the token generated. Make sure you use the correct token that you got in the above step
$ http GET http://127.0.0.1:8000/accounts/data/ "Authorization: Token b1a73afd0431c87b5e0c4afb4b085d401d652edb"
{
"bio": "",
"birth_date": null,
"email": "[email protected]",
"first_name": "Dabreil",
"gender": null,
"id": 3,
"last_name": "Ignis"
}
# Logout the user
$ http POST http://127.0.0.1:8000/token/logout/ 'Authorization: Token b1a73afd0431c87b5e0c4afb4b085d401d652edb'
# You won't get a response but the token will be deleted from the database. Check this from the admin.
ああ!すべての作品!今、我々はいくつかの設定を追加する必要があります我々のフロントエンドが
私たちのバックエンドを使用して
django-corsheaders
パッケージ.# backend/settings.py
CORS_ORIGIN_WHITELIST = ('http://127.0.0.1:3000', 'http://localhost:3000')
これはnuxtjsが使用するデフォルトの開発サーバです.あなたはそれに応じて設定できます.それがこの部分です.あなたのNuxtjsフロントエンドに認証を加える方法を学ぶために、パート2をチェックアウトしてください.
チュートリアル2
Reference
この問題について(NuxtjsとDjango RESTフレームワークによるユーザ認証の設定[パート‐1]), 我々は、より多くの情報をここで見つけました https://dev.to/ignisda/setting-up-user-authentication-with-nuxtjs-and-django-rest-framework-part-1-5gjiテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol