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

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

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

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

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

Q&A

解決済

1回答

1510閲覧

Django REST FrameworkのJWT認証がうまくいかない

sasaki0628

総合スコア106

Django

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

JWT(JSON Web Token)

JWT(JSON Web Token)とは、JSONをベースとしたアクセストークンの仕様。電子署名付きのURL safeなJSONのことを指します。電子署名が付いているため、改ざんをチェックできる点がメリットです。

0グッド

0クリップ

投稿2022/10/28 02:28

permission_classes = [IsAuthenticatedOrReadOnly] のAPIを作成し、ターミナルからの以下のコマンドでJWTを取得しました。

curl -X POST http://xxx.xxx.xxx.xxx/api/v1/auth/jwt/create/ -H "Accept:application/json" -H "Content-type: application/json" -d '{"username": "admin","password": 12345}'

取得したアクセストークンを利用して、testuserを削除するコマンドを実行しました。

curl -v -X DELETE http://xxx.xxx.xxx.xxx/api/v1/accounts/testuser/ -H 'Authorization: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY2OTE5MjE2LCJqdGkiOiJmNDNkMGVhNGIwYjM0ZmY3YjM2MmIwOTZlN2FmN2ViNiIsInVzZXJfaWQiOjF9.6EKlLtemKd2MAbSeb5d1uqWQfyxKvhoW1.........'

認証情報が含まれていません、という結果が出力されました。原因を解決したいと思っています。

* Trying xxx.xxx.xxx.xxx:80... * Connected to xxx.xxx.xxx.xxx (xxx.xxx.xxx.xxx) port 80 (#0) > DELETE /api/v1/accounts/testuser/ HTTP/1.1 > Host: xxx.xxx.xxx.xxx > User-Agent: curl/7.82.0 > Accept: */* > Authorization: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjY2OTE5MjE2LCJqdGkiOiJmNDNkMGVhNGIwYjM0ZmY3YjM2MmIwOTZlN2FmN2ViNiIsInVzZXJfaWQiOjF9.6EKlLtemKd2MAbSeb5d1uqWQfyxKvhoW1......... > * Mark bundle as not supporting multiuse < HTTP/1.1 401 Unauthorized < Date: Fri, 28 Oct 2022 01:03:23 GMT < Server: Apache < WWW-Authenticate: JWT realm="api" < Vary: Accept,Origin < Allow: GET, PUT, PATCH, DELETE, HEAD, OPTIONS < X-Frame-Options: DENY < Content-Length: 55 < X-Content-Type-Options: nosniff < Referrer-Policy: same-origin < Cross-Origin-Opener-Policy: same-origin < Content-Type: application/json < * Connection #0 to host xxx.xxx.xxx.xxx left intact {"detail":"認証情報が含まれていません。"}

これは、APIの作成方法に問題がある(認証情報を含んだAPIを作成できていない)ということでしょうか?

settings.pyのSIMPLE_JWTは以下のように設定しています。

SIMPLE_JWT = { 'ACCESS_TOKEN_LIFETIME': timedelta(minutes=10), 'REFRESH_TOKEN_LIFETIME': timedelta(days=1), 'ROTATE_REFRESH_TOKENS': True, 'BLACKLIST_AFTER_ROTATION': False, 'UPDATE_LAST_LOGIN': False, 'ALGORITHM': 'HS256', 'SIGNING_KEY': SECRET_KEY, 'VERIFYING_KEY': None, #'AUDIENCE': None, #'ISSUER': None, #'JWK_URL': None, #'LEEWAY': 0, 'AUTH_HEADER_TYPES': ('JWT',), #'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION', 'USER_ID_FIELD': 'id', 'USER_ID_CLAIM': 'user_id', #'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule', 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',), 'TOKEN_TYPE_CLAIM': 'token_type', #'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser', #'JTI_CLAIM': 'jti', #'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp', #'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5), #'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1), }

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

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

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

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

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

guest

回答1

0

自己解決

https://www.django-rest-framework.org/api-guide/authentication/
Apacheのhttpd.confの設定の問題でした。
WSGIPassAuthorization On
を設定することで解決しました。

投稿2022/10/28 04:03

sasaki0628

総合スコア106

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問