Skip to content

Commit 4c8ab90

Browse files
ISSUE #398
1 parent 3ccd647 commit 4c8ab90

File tree

4 files changed

+79
-6
lines changed

4 files changed

+79
-6
lines changed

packages/plugins/minos-discovery-kong/minos/plugins/kong/client.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ async def create_route(
9090
methods: list[str],
9191
paths: list[str],
9292
service: str,
93+
regex_priority: int,
9394
strip_path: bool = False,
9495
):
9596
url = f"{endpoint}/routes"
@@ -98,6 +99,7 @@ async def create_route(
9899
"methods": methods,
99100
"paths": paths,
100101
"service": {"id": service},
102+
"regex_priority": regex_priority,
101103
"strip_path": strip_path,
102104
}
103105

@@ -180,7 +182,7 @@ async def activate_jwt_plugin_on_route(self, route_id: str):
180182
resp = await client.post(f"{self.route}/routes/{route_id}/plugins", json=payload)
181183
return resp
182184

183-
async def get_jwt_token(
185+
async def generate_jwt_token(
184186
self, key: str, secret: str, algorithm: str = "HS256", exp: datetime = None, nbf: datetime = None
185187
) -> str:
186188
payload = {"iss": key, "exp": exp, "nbf": nbf}
@@ -194,3 +196,17 @@ async def get_jwt_token(
194196
payload["nbf"] = current
195197

196198
return jwt.encode(payload, secret, algorithm=algorithm)
199+
200+
@staticmethod
201+
async def decode_token(token: str, algorithm: str = "HS256"):
202+
return jwt.decode(token, options={"verify_signature": False}, algorithms=[algorithm])
203+
204+
async def get_jwt_by_id(self, id: str):
205+
async with httpx.AsyncClient() as client:
206+
resp = await client.get(f"{self.route}/jwts/{id}")
207+
return resp
208+
209+
async def get_consumer_jwts(self, consumer: str):
210+
async with httpx.AsyncClient() as client:
211+
resp = await client.get(f"{self.route}/consumers/{consumer}/jwt")
212+
return resp

packages/plugins/minos-discovery-kong/minos/plugins/kong/discovery.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,18 @@ async def subscribe(
103103
for endpoint in endpoints:
104104
endpointClass = Endpoint(endpoint["url"])
105105

106+
regex_priority = 0
107+
if "regex_priority" in endpoint:
108+
regex_priority = endpoint["regex_priority"]
109+
106110
fn = partial(
107111
self.client.create_route,
108112
self.route,
109113
["http"],
110114
[endpoint["method"]],
111115
[endpointClass.path_as_str],
112116
content_service["id"],
117+
regex_priority,
113118
False,
114119
)
115120
response = await self.with_circuit_breaker(fn) # send the route request

packages/plugins/minos-discovery-kong/tests/test_kong/test_client.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ async def test_activate_basic_auth_plugin_on_route(self):
151151
methods=["GET"],
152152
paths=["/foo"],
153153
service=res["id"],
154+
regex_priority=2,
154155
strip_path=False,
155156
)
156157

@@ -178,6 +179,7 @@ async def test_activate_jwt_plugin_on_route(self):
178179
methods=["GET"],
179180
paths=["/foo"],
180181
service=res["id"],
182+
regex_priority=0,
181183
strip_path=False,
182184
)
183185

@@ -201,7 +203,7 @@ async def test_jwt_token_generation(self):
201203
self.assertTrue(201 == response.status_code)
202204
resp = response.json()
203205

204-
token = await self.kong.get_jwt_token(key=resp["key"], secret=resp["secret"])
206+
token = await self.kong.generate_jwt_token(key=resp["key"], secret=resp["secret"])
205207

206208
self.assertGreater(len(token), 50)
207209

@@ -219,7 +221,7 @@ async def test_jwt_token_generation_with_expiration(self):
219221
resp = response.json()
220222

221223
current = datetime.now(tz=utc)
222-
token = await self.kong.get_jwt_token(
224+
token = await self.kong.generate_jwt_token(
223225
key=resp["key"],
224226
secret=resp["secret"],
225227
exp=current + timedelta(minutes=10),
@@ -228,6 +230,56 @@ async def test_jwt_token_generation_with_expiration(self):
228230

229231
self.assertGreater(len(token), 50)
230232

233+
async def test_token_decode(self):
234+
res = await self.kong.decode_token(
235+
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ5ZTBRdURsNG03UW1qbnpFR0pJaUVyQnZieFBqSXM3VyIsImV4cCI6MTY1"
236+
"MDM2NzE0NywibmJmIjoxNjUwMzY3MDI3fQ.SDH5Zq1mUSU0GkCyC_kF81_uoiF45u62Hgwnuv4wl5U")
237+
self.assertIn('iss', res)
238+
self.assertIn('exp', res)
239+
self.assertIn('nbf', res)
240+
241+
async def test_get_token_by_id(self):
242+
user_uuid = uuid4()
243+
user_name = self.generate_underscore_uuid()
244+
response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[])
245+
246+
self.assertTrue(201 == response.status_code)
247+
resp = response.json()
248+
249+
response = await self.kong.add_jwt_to_consumer(consumer=resp["id"])
250+
251+
self.assertTrue(201 == response.status_code)
252+
resp = response.json()
253+
254+
token = await self.kong.generate_jwt_token(key=resp["key"], secret=resp["secret"])
255+
256+
self.assertGreater(len(token), 50)
257+
258+
response = await self.kong.get_jwt_by_id(resp['id'])
259+
self.assertTrue(200 == response.status_code)
260+
resp = response.json()
261+
262+
self.assertIn('key', resp)
263+
self.assertIn('secret', resp)
264+
265+
async def test_get_consumer_jwts(self):
266+
user_uuid = uuid4()
267+
user_name = self.generate_underscore_uuid()
268+
response = await self.kong.create_consumer(username=user_name, user=user_uuid, tags=[])
269+
270+
self.assertTrue(201 == response.status_code)
271+
resp = response.json()
272+
consumer_id = resp["id"]
273+
response = await self.kong.add_jwt_to_consumer(consumer=resp["id"])
274+
275+
self.assertTrue(201 == response.status_code)
276+
277+
response = await self.kong.get_consumer_jwts(consumer_id)
278+
self.assertTrue(200 == response.status_code)
279+
resp = response.json()
280+
281+
self.assertEqual(len(resp['data']), 1)
282+
231283

232284
class TestKongClientFromConfig(unittest.IsolatedAsyncioTestCase):
233285
KONG_HOST = os.getenv("KONG_HOST", "localhost")

packages/plugins/minos-discovery-kong/tests/test_kong/test_discovery.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ async def test_subscribe_with_auth(self):
8787
5660,
8888
name,
8989
[
90-
{"url": "/", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"]},
91-
{"url": "/foo", "method": "POST", "authenticated": True, "authorized_groups": ["super_admin", "admin"]},
92-
{"url": "/bar", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"]},
90+
{"url": "/", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"], "regex_priority": 0},
91+
{"url": "/foo", "method": "POST", "authenticated": True, "authorized_groups": ["super_admin", "admin"], "regex_priority": 0},
92+
{"url": "/bar", "method": "GET", "authenticated": True, "authorized_groups": ["super_admin", "admin"], "regex_priority": 0},
9393
],
9494
)
9595
self.assertTrue(201 == response.status_code)

0 commit comments

Comments
 (0)