Skip to content

Commit b87c32e

Browse files
committed
fix: remove "none" algorithm from default jwt instance
1 parent bb7a315 commit b87c32e

File tree

7 files changed

+36
-11
lines changed

7 files changed

+36
-11
lines changed

authlib/jose/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,22 @@
4646
OKPKey.kty: OKPKey,
4747
}
4848

49-
jwt = JsonWebToken(list(JsonWebSignature.ALGORITHMS_REGISTRY.keys()))
49+
jwt = JsonWebToken(
50+
[
51+
"HS256",
52+
"HS384",
53+
"HS512",
54+
"RS256",
55+
"RS384",
56+
"RS512",
57+
"ES256",
58+
"ES384",
59+
"ES512",
60+
"PS256",
61+
"PS384",
62+
"PS512",
63+
]
64+
)
5065

5166

5267
__all__ = [

authlib/oauth2/rfc9101/authorization_server.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
from authlib.jose import jwt
1+
from authlib.jose import JsonWebSignature
2+
from authlib.jose import JsonWebToken
23
from authlib.jose.errors import JoseError
34

45
from ..rfc6749 import AuthorizationServer
@@ -135,8 +136,8 @@ def _decode_request_object(
135136
self, request, client: ClientMixin, raw_request_object: str
136137
):
137138
jwks = self.resolve_client_public_key(client)
138-
139139
try:
140+
jwt = JsonWebToken(list(JsonWebSignature.ALGORITHMS_REGISTRY.keys()))
140141
request_object = jwt.decode(raw_request_object, jwks)
141142
request_object.validate()
142143

authlib/oidc/core/grants/util.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from authlib.common.encoding import to_native
44
from authlib.common.urls import add_params_to_uri
55
from authlib.common.urls import quote_url
6-
from authlib.jose import jwt
6+
from authlib.jose import JsonWebToken
77
from authlib.oauth2.rfc6749 import InvalidRequestError
88
from authlib.oauth2.rfc6749 import scope_to_list
99

@@ -111,7 +111,7 @@ def generate_id_token(
111111
payload["at_hash"] = to_native(at_hash)
112112

113113
payload.update(user_info)
114-
return to_native(jwt.encode(header, payload, key))
114+
return to_native(JsonWebToken([alg]).encode(header, payload, key))
115115

116116

117117
def create_response_mode_response(redirect_uri, params, response_mode):

authlib/oidc/core/userinfo.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Optional
22

33
from authlib.consts import default_json_headers
4-
from authlib.jose import jwt
4+
from authlib.jose import JsonWebToken
55
from authlib.oauth2.rfc6749.authorization_server import AuthorizationServer
66
from authlib.oauth2.rfc6749.authorization_server import OAuth2Request
77
from authlib.oauth2.rfc6749.resource_protector import ResourceProtector
@@ -74,7 +74,9 @@ def __call__(self, request: OAuth2Request):
7474
user_info["iss"] = self.get_issuer()
7575
user_info["aud"] = client.client_id
7676

77-
data = jwt.encode({"alg": alg}, user_info, self.resolve_private_key())
77+
data = JsonWebToken([alg]).encode(
78+
{"alg": alg}, user_info, self.resolve_private_key()
79+
)
7880
return 200, data, [("Content-Type", "application/jwt")]
7981

8082
return 200, user_info, default_json_headers

tests/flask/test_oauth2/test_jwt_authorization_request.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import pytest
44

55
from authlib.common.urls import add_params_to_uri
6+
from authlib.jose import JsonWebToken
67
from authlib.jose import jwt
78
from authlib.oauth2 import rfc7591
89
from authlib.oauth2 import rfc9101
@@ -213,7 +214,8 @@ def test_server_require_request_object_alg_none(test_client, server, metadata):
213214
metadata["require_signed_request_object"] = True
214215
register_request_object_extension(server, metadata=metadata)
215216
payload = {"response_type": "code", "client_id": "client-id"}
216-
request_obj = jwt.encode(
217+
jwt_none = JsonWebToken(["none"])
218+
request_obj = jwt_none.encode(
217219
{"alg": "none"}, payload, read_file_path("jwk_private.json")
218220
)
219221
url = add_params_to_uri(
@@ -277,7 +279,8 @@ def test_client_require_signed_request_object_alg_none(test_client, client, serv
277279
db.session.commit()
278280

279281
payload = {"response_type": "code", "client_id": "client-id"}
280-
request_obj = jwt.encode({"alg": "none"}, payload, "")
282+
jwt_none = JsonWebToken(["none"])
283+
request_obj = jwt_none.encode({"alg": "none"}, payload, "")
281284
url = add_params_to_uri(
282285
authorize_url, {"client_id": "client-id", "request": request_obj}
283286
)

tests/flask/test_oauth2/test_openid_code_grant.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from authlib.common.urls import url_decode
88
from authlib.common.urls import url_encode
99
from authlib.common.urls import urlparse
10+
from authlib.jose import JsonWebToken
1011
from authlib.jose import jwt
1112
from authlib.oauth2.rfc6749.grants import (
1213
AuthorizationCodeGrant as _AuthorizationCodeGrant,
@@ -340,7 +341,8 @@ def test_client_metadata_alg_none(test_client, server, app, db, client):
340341
headers=headers,
341342
)
342343
resp = json.loads(rv.data)
343-
claims = jwt.decode(
344+
jwt_none = JsonWebToken(["none"])
345+
claims = jwt_none.decode(
344346
resp["id_token"],
345347
"secret",
346348
claims_cls=CodeIDToken,

tests/flask/test_oauth2/test_userinfo.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import authlib.oidc.core as oidc_core
55
from authlib.integrations.flask_oauth2 import ResourceProtector
66
from authlib.integrations.sqla_oauth2 import create_bearer_token_validator
7+
from authlib.jose import JsonWebToken
78
from authlib.jose import jwt
89
from tests.util import read_file_path
910

@@ -285,7 +286,8 @@ def test_scope_signed_unsecured(test_client, db, token, client):
285286
rv = test_client.get("/oauth/userinfo", headers=headers)
286287
assert rv.headers["Content-Type"] == "application/jwt"
287288

288-
claims = jwt.decode(rv.data, None)
289+
jwt_none = JsonWebToken(["none"])
290+
claims = jwt_none.decode(rv.data, None)
289291
assert claims == {
290292
"sub": "1",
291293
"iss": "https://provider.test",

0 commit comments

Comments
 (0)