Skip to content

Commit c78d37a

Browse files
ludusrussovimalloc
authored andcommitted
Ignore OPTIONS request method
fix issue #119
1 parent 32a6604 commit c78d37a

File tree

3 files changed

+73
-23
lines changed

3 files changed

+73
-23
lines changed

flask_jwt_extended/config.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,8 @@ def identity_claim_key(self):
236236
def user_claims_key(self):
237237
return current_app.config['JWT_USER_CLAIMS']
238238

239-
config = _Config()
240-
239+
@property
240+
def exempt_methods(self):
241+
return {"OPTIONS"}
241242

243+
config = _Config()

flask_jwt_extended/view_decorators.py

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,12 @@ def jwt_required(fn):
3232
"""
3333
@wraps(fn)
3434
def wrapper(*args, **kwargs):
35-
jwt_data = _decode_jwt_from_request(request_type='access')
36-
ctx_stack.top.jwt = jwt_data
37-
if not verify_token_claims(jwt_data[config.user_claims_key]):
38-
raise UserClaimsVerificationError('User claims verification failed')
39-
_load_user(jwt_data[config.identity_claim_key])
35+
if request.method not in config.exempt_methods:
36+
jwt_data = _decode_jwt_from_request(request_type='access')
37+
ctx_stack.top.jwt = jwt_data
38+
if not verify_token_claims(jwt_data[config.user_claims_key]):
39+
raise UserClaimsVerificationError('User claims verification failed')
40+
_load_user(jwt_data[config.identity_claim_key])
4041
return fn(*args, **kwargs)
4142
return wrapper
4243

@@ -81,19 +82,20 @@ def fresh_jwt_required(fn):
8182
"""
8283
@wraps(fn)
8384
def wrapper(*args, **kwargs):
84-
jwt_data = _decode_jwt_from_request(request_type='access')
85-
ctx_stack.top.jwt = jwt_data
86-
fresh = jwt_data['fresh']
87-
if isinstance(fresh, bool):
88-
if not fresh:
89-
raise FreshTokenRequired('Fresh token required')
90-
else:
91-
now = timegm(datetime.utcnow().utctimetuple())
92-
if fresh < now:
93-
raise FreshTokenRequired('Fresh token required')
94-
if not verify_token_claims(jwt_data[config.user_claims_key]):
95-
raise UserClaimsVerificationError('User claims verification failed')
96-
_load_user(jwt_data[config.identity_claim_key])
85+
if request.method not in config.exempt_methods:
86+
jwt_data = _decode_jwt_from_request(request_type='access')
87+
ctx_stack.top.jwt = jwt_data
88+
fresh = jwt_data['fresh']
89+
if isinstance(fresh, bool):
90+
if not fresh:
91+
raise FreshTokenRequired('Fresh token required')
92+
else:
93+
now = timegm(datetime.utcnow().utctimetuple())
94+
if fresh < now:
95+
raise FreshTokenRequired('Fresh token required')
96+
if not verify_token_claims(jwt_data[config.user_claims_key]):
97+
raise UserClaimsVerificationError('User claims verification failed')
98+
_load_user(jwt_data[config.identity_claim_key])
9799
return fn(*args, **kwargs)
98100
return wrapper
99101

@@ -107,9 +109,10 @@ def jwt_refresh_token_required(fn):
107109
"""
108110
@wraps(fn)
109111
def wrapper(*args, **kwargs):
110-
jwt_data = _decode_jwt_from_request(request_type='refresh')
111-
ctx_stack.top.jwt = jwt_data
112-
_load_user(jwt_data[config.identity_claim_key])
112+
if request.method not in config.exempt_methods:
113+
jwt_data = _decode_jwt_from_request(request_type='refresh')
114+
ctx_stack.top.jwt = jwt_data
115+
_load_user(jwt_data[config.identity_claim_key])
113116
return fn(*args, **kwargs)
114117
return wrapper
115118

tests/test_options_method.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from flask import Flask, Blueprint
2+
from flask_jwt_extended import (
3+
JWTManager, jwt_required, fresh_jwt_required, jwt_refresh_token_required
4+
)
5+
import pytest
6+
7+
@pytest.fixture(scope='function')
8+
def app():
9+
app = Flask(__name__)
10+
app.config['JWT_SECRET_KEY'] = 'secret'
11+
JWTManager(app)
12+
13+
@app.route('/jwt_required', methods=["GET", "OPTIONS"])
14+
@jwt_required
15+
def jwt_required_endpoint():
16+
return b'ok'
17+
18+
@app.route('/fresh_jwt_required', methods=["GET", "OPTIONS"])
19+
@fresh_jwt_required
20+
def fresh_jwt_required_endpoint():
21+
return b'ok'
22+
23+
@app.route('/jwt_refresh_token_required', methods=["GET", "OPTIONS"])
24+
@jwt_refresh_token_required
25+
def jwt_refresh_token_required_endpoint():
26+
return b'ok'
27+
28+
29+
30+
return app
31+
32+
def test_access_jwt_required_enpoint(app):
33+
res = app.test_client().options('/jwt_required')
34+
assert res.status_code == 200
35+
assert res.data == b'ok'
36+
37+
def test_access_jwt_refresh_token_required_enpoint(app):
38+
res = app.test_client().options('/jwt_refresh_token_required')
39+
assert res.status_code == 200
40+
assert res.data == b'ok'
41+
42+
def test_access_fresh_jwt_required_enpoint(app):
43+
res = app.test_client().options('/fresh_jwt_required')
44+
assert res.status_code == 200
45+
assert res.data == b'ok'

0 commit comments

Comments
 (0)