前提・実現したいこと
サーバーにデプロイした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
です。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。