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

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

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

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2393閲覧

DRFでパーミッションをAllowAnyにしているのに401エラーが出る

satoh23

総合スコア1

Django

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

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/07/16 16:18

編集2021/07/19 15:28

前提・実現したいこと

現在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に変更する
→ 変化なし

サーバーの再起動
→ 変化なし

よろしくお願いします

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました
どうやら秘密鍵と公開鍵の生成の仕方が悪かったようです

このやり方だと特定のタイミングで鍵が再生成されるためJWTを解読できる時とできない時があり、それが原因で発生していたようです

再生成されなかった時→通る
再生成された時→通らない

投稿2021/07/20 04:42

satoh23

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問