前提・実現したいこと
現在DjangoRestFrameworkを使ってAPIサーバーを建てています
そこで使っているJWT認証を安定させたいです
具体的には、パーミッションをAllowAnyにしているにも関わらずJWT認証が通ったり通らなくなったりしています
トークンはCookieに保存されています
ログインしていない状態ではこの現象は起きません
また、ローカルではこの問題は起きません
これを改善したいです
具体的な情報は下に書きます
補足情報(FW/ツールのバージョンなど)
dj-rest-auth==2.1.4
django-rest-auth==0.9.5
djangorestframework==3.12.2
djangorestframework-serializer-extensions==2.0.1
djangorestframework-simplejwt==4.6.0
エラーメッセージ
HTTP 401 Unauthorized Allow: GET, HEAD, OPTIONS Content-Type: application/json Vary: Accept WWW-Authenticate: JWT realm="api" { "detail": "Given token not valid for any token type", "code": "token_not_valid", "messages": [ { "token_class": "AccessToken", "token_type": "access", "message": "Token is invalid or expired" } ] }
該当のソースコード
python
1INSTALLED_APPS = [ 2 'django.contrib.admin', 3 'django.contrib.auth', 4 'django.contrib.contenttypes', 5 'django.contrib.sessions', 6 'django.contrib.messages', 7 'django.contrib.staticfiles', 8 'django.contrib.sites', 9 'corsheaders', 10 'allauth', 11 'allauth.account', 12 'allauth.socialaccount', 13 'rest_framework', 14 'rest_framework.authtoken', 15 'rest_framework_simplejwt', 16 'rest_framework_simplejwt.token_blacklist', 17 'rest_framework_serializer_extensions', 18 'rest_auth', 19 'dj_rest_auth', 20 'dj_rest_auth.registration', 21 'accounts.apps.AccountsConfig', 22 'article.apps.ArticleConfig', 23 'api.apps.ApiConfig', 24] 25 26MIDDLEWARE = [ 27 'corsheaders.middleware.CorsMiddleware', 28 'django.middleware.security.SecurityMiddleware', 29 'django.contrib.sessions.middleware.SessionMiddleware', 30 'django.middleware.common.CommonMiddleware', 31 'django.middleware.csrf.CsrfViewMiddleware', 32 'django.contrib.auth.middleware.AuthenticationMiddleware', 33 'django.contrib.messages.middleware.MessageMiddleware', 34 'django.middleware.clickjacking.XFrameOptionsMiddleware', 35] 36 37# allauth設定 38ACCOUNT_USERNAME_REQUIRED = False 39ACCOUNT_AUTHENTICATION_METHOD = 'email' 40ACCOUNT_EMAIL_REQUIRED = True 41ACCOUNT_UNIQUE_EMAIL = True 42ACCOUNT_EMAIL_VERIFICATION = 'mandatory' 43ACCOUNT_LOGIN_ATTEMPTS_TIMEOUT = 600 44 45# dj_rest_auth設定 46SITE_ID = 1 47REST_USE_JWT = True 48JWT_AUTH_SAMESITE = 'None' 49JWT_AUTH_COOKIE = 'access' 50JWT_AUTH_REFRESH_COOKIE = 'refresh' 51JWT_AUTH_HTTPONLY = True 52JWT_AUTH_SECURE = True 53REST_AUTH_SERIALIZERS = { 54 'USER_DETAILS_SERIALIZER': 'accounts.serializers.CustomUserSerializer' 55} 56 57# simple_jwt設定 58key = RSA.generate(2048) 59PRIVATE_KEY = key.export_key() 60PUBLIC_KEY = key.publickey().export_key() 61SIMPLE_JWT = { 62 'AUTH_HEADER_TYPES': ('JWT',), 63 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5), 64 'REFRESH_TOKEN_LIFETIME': timedelta(hours=12), 65 'ROTATE_REFRESH_TOKENS': True, 66 'BLACKLIST_AFTER_ROTATION': True, 67 'ALGORITHM': 'RS256', 68 'SIGNING_KEY': PRIVATE_KEY, 69 'VERIFYING_KEY': PUBLIC_KEY, 70} 71 72# drf設定 73REST_FRAMEWORK = { 74 'DEFAULT_PERMISSION_CLASSES': [ 75 'rest_framework.permissions.IsAuthenticated', 76 ], 77 'DEFAULT_AUTHENTICATION_CLASSES': [ 78 'dj_rest_auth.utils.JWTCookieAuthentication', 79 ], 80}
Django
1from rest_framework.permissions import AllowAny 2from rest_framework import generics 3from article.serializers import ListDetailSerializer 4from article.models import Detail 5 6 7class ListDetailView(generics.ListAPIView): 8 queryset = Detail.objects.all() 9 serializer_class = ListDetailSerializer 10 permission_classes = (AllowAny,) 11
Herokuのログ
通った時
2021-07-16T16:08:47.134485+00:00 app[web.1]: 10.63.117.210 - - [17/Jul/2021:01:08:47 +0900] "GET /api/v1/get-list-article/ HTTP/1.1" 200 5256 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/91.0.4472.114 Safari/537.36" 2021-07-16T16:08:47.134422+00:00 heroku[router]: at=info method=GET path="/api/v1/get-list-article/" host=projecttyoitasi.herokuapp.com request_id=e9cdb637-63cd-4ef3-9491-58ac64326d82 fwd="180.56.78.139" dyno=web.1 connect=1ms service=137ms status=200 bytes=5729 protocol=https
通らなかった時
2021-07-16T16:09:45.437090+00:00 heroku[router]: at=info method=GET path="/api/v1/get-list-article/" host=projecttyoitasi.herokuapp.com request_id=68e5cf57-c100-400d-987c-a4cec1034927 fwd="180.56.78.139" dyno=web.1 connect=2ms service=98ms status=401 bytes=6228 protocol=https 2021-07-16T16:09:45.433557+00:00 app[web.1]: Unauthorized: /api/v1/get-list-article/ 2021-07-16T16:09:45.437696+00:00 app[web.1]: 10.63.55.157 - - [17/Jul/2021:01:09:45 +0900] "GET /api/v1/get-list-article/ HTTP/1.1" 401 5710 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/91.0.4472.114 Safari/537.36"
試したこと
Cookie内のトークンを削除してリクエストしてみる
→ 問題なく機能するようになりました
settingsで設定できるパーミッションをIsAuthenticatedからAllowAnyに変更する
→ 変化なし
サーバーの再起動
→ 変化なし
よろしくお願いします
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。