質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Q&A

1回答

2848閲覧

サーバーにデプロイしたdjango rest frameworkが認証エラーを起こす。

ikepon_kk

総合スコア0

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

0グッド

0クリップ

投稿2021/10/14 05:15

前提・実現したいこと

サーバーにデプロイしたdjango rest frameworkとのやり取りで、jwt tokenを正常に受け渡ししたいです。

django rest frameworkを使用しており、
認証にはjwtを使用しています。
サーバーはLinodeを使用していて、普通のlinuxサーバーです。

ローカルでは問題なく動いているのですが、サーバーにdeployした際にjwtのトークンを入れているにもかかわらず、認証情報が含まれていません。
というエラーが出ます。 postmanでテストしてみても、401 authentication errorが起きます。

発生している問題・エラーメッセージ

{ "detail": "認証情報が含まれていません。" }

該当のソースコード

import os from datetime import timedelta from django.urls import reverse from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent DEBUG = True ALLOWED_HOSTS = ['*'] # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! # SECURITY WARNING: don't run with debug turned on in production! try: from .secret_key import * except ImportError: pass # Application definition INSTALLED_APPS = [ 'channels', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'djoser', 'users', 'invitations', 'dm', 'posts', 'corsheaders', "rest_framework_serializer_field_permissions", ] MIDDLEWARE = [ 'corsheaders.middleware.CorsMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] ROOT_URLCONF = '[アプリ名].urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ] WSGI_APPLICATION = 'evers_backend.wsgi.application' ASGI_APPLICATION = 'evers_backend.routing.application' CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [os.environ.get('REDIS_URL', 'redis://localhost:6379')], }, }, } CORS_ALLOW_ALL_ORIGINS = True CORS_ALLOW_CREDENTIALS = True REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], 'DATE_INPUT_FORMATS': ['iso-8601', '%Y-%m-%dT%H:%M:%S.%fZ'], } SIMPLE_JWT = { 'AUTH_HEADER_TYPES': ('JWT',), 'ACCESS_TOKEN_LIFETIME': timedelta(weeks=200), } # Database # https://docs.djangoproject.com/en/3.1/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } # Password validation # https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] # Internationalization # https://docs.djangoproject.com/en/3.1/topics/i18n/ LANGUAGE_CODE = 'ja-jp' TIME_ZONE = 'Asia/Tokyo' USE_I18N = True USE_L10N = True USE_TZ = True # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/3.1/howto/static-files/ STATIC_URL = '/static/' AUTH_USER_MODEL = 'users.User' STATIC_ROOT = os.path.join(BASE_DIR, 'static') STATIC_URL = '/static/'
async function fetchAsyncGetMyProf() { const localJWT = await AsyncStorage.getItem("localJWT"); const res = await axios.get(`${apiUrl}users/myprofile/`, { headers: { Authorization: `JWT ${localJWT}`, }, }); setMyProfile(res.data[0]); return res.data[0]; }
class MyProfileListView(generics.ListAPIView): queryset = User.objects.all() serializer_class = serializers.UserProfileWithFriendsSerializer permission_classes = (IsAuthenticated,) def get_queryset(self): return self.queryset.filter(email=self.request.user)

試したこと

一度permission classをAllowAnyにしてみたところ、認証は問題なかったのですが、self.reqeust.userの部分に、ログイン中のユーザーの情報が入っていませんでした。
ですので、headersに入れているauthrozationの情報が上手く認識されていいないのかと思います。

ローカル上では正常に動いているので、コードではない別の問題な気がします。
サーバー上で行ったことは、
ソースコードをgit clone、
pip3 install -r requirements.txt,
python3 manage.py migrate,
python manage.py collectstatic
chown www-data mysite/
chown www-data mysite/db.sqlite3
です。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

permission_classes = (IsAuthenticated,)
だけでなく、認証のauthentication classを指定していないからかもしれません。

settings.pyでデフォルト設定していてローカルで動いていても、本番環境で動かないことがあります。

投稿2021/10/17 00:43

prof

総合スコア179

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問