Skip to content

Commit 459b888

Browse files
committed
Test for Yandex jwt
1 parent 8a36b2b commit 459b888

File tree

5 files changed

+93
-11
lines changed

5 files changed

+93
-11
lines changed

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ grpcio>=1.42.0
22
packaging
33
protobuf>=3.13.0,<5.0.0
44
aiohttp<4
5+
pyjwt==2.8.0

test-requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,5 @@ pylint-protobuf
4646
cython
4747
freezegun==1.2.2
4848
pytest-cov
49+
yandexcloud
4950
-e .

tests/auth/__init__.py

Whitespace-only changes.

tests/auth/test_credentials.py

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
import jwt
2+
import concurrent.futures
3+
import grpc
4+
import time
5+
6+
import ydb.iam
7+
8+
from yandex.cloud.iam.v1 import iam_token_service_pb2_grpc
9+
from yandex.cloud.iam.v1 import iam_token_service_pb2
10+
11+
SERVICE_ACCOUNT_ID = "sa_id"
12+
ACCESS_KEY_ID = "key_id"
13+
PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC75/JS3rMcLJxv\nFgpOzF5+2gH+Yig3RE2MTl9uwC0BZKAv6foYr7xywQyWIK+W1cBhz8R4LfFmZo2j\nM0aCvdRmNBdW0EDSTnHLxCsFhoQWLVq+bI5f5jzkcoiioUtaEpADPqwgVULVtN/n\nnPJiZ6/dU30C3jmR6+LUgEntUtWt3eq3xQIn5lG3zC1klBY/HxtfH5Hu8xBvwRQT\nJnh3UpPLj8XwSmriDgdrhR7o6umWyVuGrMKlLHmeivlfzjYtfzO1MOIMG8t2/zxG\nR+xb4Vwks73sH1KruH/0/JMXU97npwpe+Um+uXhpldPygGErEia7abyZB2gMpXqr\nWYKMo02NAgMBAAECggEAO0BpC5OYw/4XN/optu4/r91bupTGHKNHlsIR2rDzoBhU\nYLd1evpTQJY6O07EP5pYZx9mUwUdtU4KRJeDGO/1/WJYp7HUdtxwirHpZP0lQn77\nuccuX/QQaHLrPekBgz4ONk+5ZBqukAfQgM7fKYOLk41jgpeDbM2Ggb6QUSsJISEp\nzrwpI/nNT/wn+Hvx4DxrzWU6wF+P8kl77UwPYlTA7GsT+T7eKGVH8xsxmK8pt6lg\nsvlBA5XosWBWUCGLgcBkAY5e4ZWbkdd183o+oMo78id6C+PQPE66PLDtHWfpRRmN\nm6XC03x6NVhnfvfozoWnmS4+e4qj4F/emCHvn0GMywKBgQDLXlj7YPFVXxZpUvg/\nrheVcCTGbNmQJ+4cZXx87huqwqKgkmtOyeWsRc7zYInYgraDrtCuDBCfP//ZzOh0\nLxepYLTPk5eNn/GT+VVrqsy35Ccr60g7Lp/bzb1WxyhcLbo0KX7/6jl0lP+VKtdv\nmto+4mbSBXSM1Y5BVVoVgJ3T/wKBgQDsiSvPRzVi5TTj13x67PFymTMx3HCe2WzH\nJUyepCmVhTm482zW95pv6raDr5CTO6OYpHtc5sTTRhVYEZoEYFTM9Vw8faBtluWG\nBjkRh4cIpoIARMn74YZKj0C/0vdX7SHdyBOU3bgRPHg08Hwu3xReqT1kEPSI/B2V\n4pe5fVrucwKBgQCNFgUxUA3dJjyMES18MDDYUZaRug4tfiYouRdmLGIxUxozv6CG\nZnbZzwxFt+GpvPUV4f+P33rgoCvFU+yoPctyjE6j+0aW0DFucPmb2kBwCu5J/856\nkFwCx3blbwFHAco+SdN7g2kcwgmV2MTg/lMOcU7XwUUcN0Obe7UlWbckzQKBgQDQ\nnXaXHL24GGFaZe4y2JFmujmNy1dEsoye44W9ERpf9h1fwsoGmmCKPp90az5+rIXw\nFXl8CUgk8lXW08db/r4r+ma8Lyx0GzcZyplAnaB5/6j+pazjSxfO4KOBy4Y89Tb+\nTP0AOcCi6ws13bgY+sUTa/5qKA4UVw+c5zlb7nRpgwKBgGXAXhenFw1666482iiN\ncHSgwc4ZHa1oL6aNJR1XWH+aboBSwR+feKHUPeT4jHgzRGo/aCNHD2FE5I8eBv33\nof1kWYjAO0YdzeKrW0rTwfvt9gGg+CS397aWu4cy+mTI+MNfBgeDAIVBeJOJXLlX\nhL8bFAuNNVrCOp79TNnNIsh7\n-----END PRIVATE KEY-----\n"
14+
PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu+fyUt6zHCycbxYKTsxe\nftoB/mIoN0RNjE5fbsAtAWSgL+n6GK+8csEMliCvltXAYc/EeC3xZmaNozNGgr3U\nZjQXVtBA0k5xy8QrBYaEFi1avmyOX+Y85HKIoqFLWhKQAz6sIFVC1bTf55zyYmev\n3VN9At45kevi1IBJ7VLVrd3qt8UCJ+ZRt8wtZJQWPx8bXx+R7vMQb8EUEyZ4d1KT\ny4/F8Epq4g4Ha4Ue6OrplslbhqzCpSx5nor5X842LX8ztTDiDBvLdv88RkfsW+Fc\nJLO97B9Sq7h/9PyTF1Pe56cKXvlJvrl4aZXT8oBhKxImu2m8mQdoDKV6q1mCjKNN\njQIDAQAB\n-----END PUBLIC KEY-----\n"
15+
16+
17+
def test_credentials():
18+
credentials = ydb.iam.MetadataUrlCredentials()
19+
raised = False
20+
try:
21+
credentials.auth_metadata()
22+
except Exception:
23+
raised = True
24+
25+
assert raised
26+
27+
28+
class IamTokenServiceForTest(iam_token_service_pb2_grpc.IamTokenServiceServicer):
29+
def Create(self, request, context):
30+
print("IAM token service request: {}".format(request))
31+
# Validate jwt:
32+
decoded = jwt.decode(request.jwt, key=PUBLIC_KEY, algorithms=["PS256"], audience="https://iam.api.cloud.yandex.net/iam/v1/tokens")
33+
assert decoded["iss"] == SERVICE_ACCOUNT_ID
34+
assert decoded["aud"] == "https://iam.api.cloud.yandex.net/iam/v1/tokens"
35+
assert abs(decoded["iat"] - time.time()) <= 60
36+
assert abs(decoded["exp"] - time.time()) <= 3600
37+
38+
response = iam_token_service_pb2.CreateIamTokenResponse(iam_token="test_token")
39+
response.expires_at.seconds = int(time.time() + 42)
40+
return response
41+
42+
43+
class IamTokenServiceTestServer(object):
44+
def __init__(self):
45+
self.server = grpc.server(concurrent.futures.ThreadPoolExecutor(max_workers=2))
46+
iam_token_service_pb2_grpc.add_IamTokenServiceServicer_to_server(IamTokenServiceForTest(), self.server)
47+
self.server.add_insecure_port(self.get_endpoint())
48+
self.server.start()
49+
50+
def stop(self):
51+
self.server.wait_for_termination()
52+
53+
def get_endpoint(self):
54+
return "[::]:54321"
55+
56+
57+
class TestServiceAccountCredentials(ydb.iam.ServiceAccountCredentials):
58+
def __init__(
59+
self,
60+
service_account_id,
61+
access_key_id,
62+
private_key,
63+
iam_endpoint=None,
64+
iam_channel_credentials=None,
65+
):
66+
super(TestServiceAccountCredentials, self).__init__(
67+
service_account_id,
68+
access_key_id,
69+
private_key,
70+
iam_endpoint,
71+
iam_channel_credentials,
72+
)
73+
74+
def _channel_factory(self):
75+
return grpc.insecure_channel(
76+
self._iam_endpoint
77+
)
78+
79+
def get_expire_time(self):
80+
return self._expires_in - time.time()
81+
82+
83+
def test_service_account_credentials():
84+
server = IamTokenServiceTestServer()
85+
iam_endpoint = server.get_endpoint()
86+
grpc_channel_creds = grpc.local_channel_credentials()
87+
credentials = TestServiceAccountCredentials(SERVICE_ACCOUNT_ID, ACCESS_KEY_ID, PRIVATE_KEY, iam_endpoint, grpc_channel_creds)
88+
credentials.set_token_expiration_timeout(1)
89+
t = credentials.get_auth_token()
90+
assert t == "test_token"
91+
assert credentials.get_expire_time() <= 42

tests/table/test_tx.py

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,6 @@ def test_tx_begin(driver_sync, database):
3838
tx.rollback()
3939

4040

41-
def test_credentials():
42-
credentials = ydb.iam.MetadataUrlCredentials()
43-
raised = False
44-
try:
45-
credentials.auth_metadata()
46-
except Exception:
47-
raised = True
48-
49-
assert raised
50-
51-
5241
def test_tx_snapshot_ro(driver_sync, database):
5342
session = driver_sync.table_client.session().create()
5443
description = (

0 commit comments

Comments
 (0)