|
1 | 1 | import datetime
|
2 | 2 | import unittest
|
3 | 3 |
|
| 4 | +import jwt |
| 5 | +import jwt.exceptions |
4 | 6 | import mock
|
5 | 7 |
|
6 | 8 | import atlassian_jwt_auth
|
7 | 9 | import atlassian_jwt_auth.exceptions
|
| 10 | +import atlassian_jwt_auth.key |
| 11 | +import atlassian_jwt_auth.signer |
8 | 12 | from atlassian_jwt_auth.tests import utils
|
9 | 13 |
|
10 | 14 |
|
| 15 | +class NoneAlgorithmJwtSigner(atlassian_jwt_auth.signer.JWTAuthSigner): |
| 16 | + """ A JwtSigner that generates JWTs using the none algorithm |
| 17 | + and supports specifying arbitrary alg jwt header values. |
| 18 | + """ |
| 19 | + |
| 20 | + def generate_jwt(self, audience, **kwargs): |
| 21 | + alg_header = kwargs.get('alg_header', 'none') |
| 22 | + key_identifier, private_key_pem = self.private_key_retriever.load( |
| 23 | + self.issuer) |
| 24 | + return jwt.encode(self._generate_claims(audience, **kwargs), |
| 25 | + algorithm=None, |
| 26 | + key=None, |
| 27 | + headers={'kid': key_identifier.key_id, |
| 28 | + 'alg': alg_header}) |
| 29 | + |
| 30 | + |
11 | 31 | class BaseJWTAuthVerifierTest(object):
|
12 | 32 |
|
13 | 33 | """ tests for the JWTAuthVerifier class. """
|
@@ -45,6 +65,25 @@ def test_verify_jwt_with_valid_jwt(self):
|
45 | 65 | self.assertEqual(v_claims['aud'], self._example_aud)
|
46 | 66 | self.assertEqual(v_claims['iss'], self._example_issuer)
|
47 | 67 |
|
| 68 | + def test_verify_jwt_with_none_algorithm(self): |
| 69 | + """ tests that verify_jwt does not accept jwt that use the none |
| 70 | + algorithm. |
| 71 | + """ |
| 72 | + verifier = self._setup_jwt_auth_verifier(self._public_key_pem) |
| 73 | + private_key_ret = atlassian_jwt_auth.key.StaticPrivateKeyRetriever( |
| 74 | + self._example_key_id, self._private_key_pem.decode()) |
| 75 | + jwt_signer = NoneAlgorithmJwtSigner( |
| 76 | + issuer=self._example_issuer, |
| 77 | + private_key_retriever=private_key_ret, |
| 78 | + ) |
| 79 | + for algorithm in ['none', 'None', 'nOne', 'nonE', 'NONE']: |
| 80 | + jwt_token = jwt_signer.generate_jwt( |
| 81 | + self._example_aud, alg_header=algorithm) |
| 82 | + jwt_headers = jwt.get_unverified_header(jwt_token) |
| 83 | + self.assertEqual(jwt_headers['alg'], algorithm) |
| 84 | + with self.assertRaises(jwt.exceptions.InvalidAlgorithmError): |
| 85 | + verifier.verify_jwt(jwt_token, self._example_aud) |
| 86 | + |
48 | 87 | def test_verify_jwt_with_key_identifier_not_starting_with_issuer(self):
|
49 | 88 | """ tests that verify_jwt rejects a jwt if the key identifier does
|
50 | 89 | not start with the claimed issuer.
|
|
0 commit comments