Cognito-IDP describe_resource_server() and list_resource_servers() (#6717)
This commit is contained in:
parent
d351853276
commit
b6a582e624
@ -75,7 +75,7 @@ cognito-idp
|
|||||||
- [X] delete_user_pool_client
|
- [X] delete_user_pool_client
|
||||||
- [X] delete_user_pool_domain
|
- [X] delete_user_pool_domain
|
||||||
- [X] describe_identity_provider
|
- [X] describe_identity_provider
|
||||||
- [ ] describe_resource_server
|
- [X] describe_resource_server
|
||||||
- [ ] describe_risk_configuration
|
- [ ] describe_risk_configuration
|
||||||
- [ ] describe_user_import_job
|
- [ ] describe_user_import_job
|
||||||
- [X] describe_user_pool
|
- [X] describe_user_pool
|
||||||
@ -108,7 +108,7 @@ cognito-idp
|
|||||||
- [ ] list_devices
|
- [ ] list_devices
|
||||||
- [X] list_groups
|
- [X] list_groups
|
||||||
- [X] list_identity_providers
|
- [X] list_identity_providers
|
||||||
- [ ] list_resource_servers
|
- [X] list_resource_servers
|
||||||
- [ ] list_tags_for_resource
|
- [ ] list_tags_for_resource
|
||||||
- [ ] list_user_import_jobs
|
- [ ] list_user_import_jobs
|
||||||
- [X] list_user_pool_clients
|
- [X] list_user_pool_clients
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# autogenerated by scripts/update_backend_index.py
|
# autogenerated by /Users/plussier/dev/github/moto/scripts/update_backend_index.py
|
||||||
import re
|
import re
|
||||||
|
|
||||||
backend_url_patterns = [
|
backend_url_patterns = [
|
||||||
@ -114,7 +114,7 @@ backend_url_patterns = [
|
|||||||
),
|
),
|
||||||
(
|
(
|
||||||
"meteringmarketplace",
|
"meteringmarketplace",
|
||||||
re.compile("https?://metering\\.marketplace.(.+).amazonaws.com"),
|
re.compile("https?://metering.marketplace.(.+).amazonaws.com"),
|
||||||
),
|
),
|
||||||
("meteringmarketplace", re.compile("https?://aws-marketplace.(.+).amazonaws.com")),
|
("meteringmarketplace", re.compile("https?://aws-marketplace.(.+).amazonaws.com")),
|
||||||
("mq", re.compile("https?://mq\\.(.+)\\.amazonaws\\.com")),
|
("mq", re.compile("https?://mq\\.(.+)\\.amazonaws\\.com")),
|
||||||
|
@ -1705,6 +1705,25 @@ class CognitoIdpBackend(BaseBackend):
|
|||||||
user_pool.resource_servers[identifier] = resource_server
|
user_pool.resource_servers[identifier] = resource_server
|
||||||
return resource_server
|
return resource_server
|
||||||
|
|
||||||
|
def describe_resource_server(
|
||||||
|
self, user_pool_id: str, identifier: str
|
||||||
|
) -> CognitoResourceServer:
|
||||||
|
user_pool = self.user_pools.get(user_pool_id)
|
||||||
|
if not user_pool:
|
||||||
|
raise ResourceNotFoundError(f"User pool {user_pool_id} does not exist.")
|
||||||
|
|
||||||
|
resource_server = user_pool.resource_servers.get(identifier)
|
||||||
|
if not resource_server:
|
||||||
|
raise ResourceNotFoundError(f"Resource server {identifier} does not exist.")
|
||||||
|
|
||||||
|
return resource_server
|
||||||
|
|
||||||
|
@paginate(pagination_model=PAGINATION_MODEL) # type: ignore[misc]
|
||||||
|
def list_resource_servers(self, user_pool_id: str) -> List[CognitoResourceServer]:
|
||||||
|
user_pool = self.user_pools[user_pool_id]
|
||||||
|
resource_servers = list(user_pool.resource_servers.values())
|
||||||
|
return resource_servers
|
||||||
|
|
||||||
def sign_up(
|
def sign_up(
|
||||||
self,
|
self,
|
||||||
client_id: str,
|
client_id: str,
|
||||||
|
@ -534,6 +534,30 @@ class CognitoIdpResponse(BaseResponse):
|
|||||||
)
|
)
|
||||||
return json.dumps({"ResourceServer": resource_server.to_json()})
|
return json.dumps({"ResourceServer": resource_server.to_json()})
|
||||||
|
|
||||||
|
def describe_resource_server(self) -> str:
|
||||||
|
user_pool_id = self._get_param("UserPoolId")
|
||||||
|
identifier = self._get_param("Identifier")
|
||||||
|
resource_server = self.backend.describe_resource_server(
|
||||||
|
user_pool_id, identifier
|
||||||
|
)
|
||||||
|
return json.dumps({"ResourceServer": resource_server.to_json()})
|
||||||
|
|
||||||
|
def list_resource_servers(self) -> str:
|
||||||
|
max_results = self._get_param("MaxResults")
|
||||||
|
next_token = self._get_param("NextToken")
|
||||||
|
user_pool_id = self._get_param("UserPoolId")
|
||||||
|
resource_servers, next_token = self.backend.list_resource_servers(
|
||||||
|
user_pool_id, max_results=max_results, next_token=next_token
|
||||||
|
)
|
||||||
|
response: Dict[str, Any] = {
|
||||||
|
"ResourceServers": [
|
||||||
|
resource_server.to_json() for resource_server in resource_servers
|
||||||
|
]
|
||||||
|
}
|
||||||
|
if next_token:
|
||||||
|
response["NextToken"] = str(next_token)
|
||||||
|
return json.dumps(response)
|
||||||
|
|
||||||
def sign_up(self) -> str:
|
def sign_up(self) -> str:
|
||||||
client_id = self._get_param("ClientId")
|
client_id = self._get_param("ClientId")
|
||||||
username = self._get_param("Username")
|
username = self._get_param("Username")
|
||||||
|
@ -49,6 +49,12 @@ PAGINATION_MODEL = {
|
|||||||
"limit_default": 60,
|
"limit_default": 60,
|
||||||
"unique_attribute": "id",
|
"unique_attribute": "id",
|
||||||
},
|
},
|
||||||
|
"list_resource_servers": {
|
||||||
|
"input_token": "next_token",
|
||||||
|
"limit_key": "max_results",
|
||||||
|
"limit_default": 60,
|
||||||
|
"unique_attribute": "identifier",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3537,7 +3537,7 @@ def test_update_user_attributes_unknown_accesstoken():
|
|||||||
|
|
||||||
|
|
||||||
@mock_cognitoidp
|
@mock_cognitoidp
|
||||||
def test_resource_server():
|
def test_create_resource_server():
|
||||||
client = boto3.client("cognito-idp", "us-west-2")
|
client = boto3.client("cognito-idp", "us-west-2")
|
||||||
name = str(uuid.uuid4())
|
name = str(uuid.uuid4())
|
||||||
res = client.create_user_pool(PoolName=name)
|
res = client.create_user_pool(PoolName=name)
|
||||||
@ -3573,6 +3573,224 @@ def test_resource_server():
|
|||||||
assert ex.value.response["ResponseMetadata"]["HTTPStatusCode"] == 400
|
assert ex.value.response["ResponseMetadata"]["HTTPStatusCode"] == 400
|
||||||
|
|
||||||
|
|
||||||
|
@mock_cognitoidp
|
||||||
|
def test_describe_resource_server():
|
||||||
|
|
||||||
|
# Create a user pool to attach a resource server to
|
||||||
|
client = boto3.client("cognito-idp", "us-west-2")
|
||||||
|
name = str(uuid.uuid4())
|
||||||
|
user_pool = client.create_user_pool(PoolName=name)
|
||||||
|
user_pool_id = user_pool["UserPool"]["Id"]
|
||||||
|
|
||||||
|
server_id = "my_server"
|
||||||
|
server_name = "new_remote_server"
|
||||||
|
scopes = [
|
||||||
|
{"ScopeName": "app:write", "ScopeDescription": "write scope"},
|
||||||
|
{"ScopeName": "app:read", "ScopeDescription": "read scope"},
|
||||||
|
]
|
||||||
|
|
||||||
|
# Create a new resource server
|
||||||
|
new_resource_server = client.create_resource_server(
|
||||||
|
UserPoolId=user_pool_id, Identifier=server_id, Name=server_name, Scopes=scopes
|
||||||
|
)
|
||||||
|
|
||||||
|
assert new_resource_server["ResourceServer"]["UserPoolId"] == user_pool_id
|
||||||
|
assert new_resource_server["ResourceServer"]["Identifier"] == server_id
|
||||||
|
assert new_resource_server["ResourceServer"]["Name"] == server_name
|
||||||
|
assert new_resource_server["ResourceServer"]["Scopes"] == scopes
|
||||||
|
|
||||||
|
# Describe the newly created resource server
|
||||||
|
response = client.describe_resource_server(
|
||||||
|
UserPoolId=user_pool_id, Identifier=server_id
|
||||||
|
)
|
||||||
|
|
||||||
|
# Assert all the values we expect are seen in the description.
|
||||||
|
assert response["ResourceServer"]["UserPoolId"] == user_pool_id
|
||||||
|
assert response["ResourceServer"]["Identifier"] == server_id
|
||||||
|
assert response["ResourceServer"]["Name"] == server_name
|
||||||
|
assert response["ResourceServer"]["Scopes"] == scopes
|
||||||
|
|
||||||
|
# Make sure attempting to describe a non-existent server fails in
|
||||||
|
# the expected manner
|
||||||
|
fake_server_id = "non_existent_server"
|
||||||
|
negative_response = None
|
||||||
|
with pytest.raises(ClientError) as ex:
|
||||||
|
negative_response = client.describe_resource_server(
|
||||||
|
UserPoolId=user_pool_id, Identifier=fake_server_id
|
||||||
|
)
|
||||||
|
|
||||||
|
# Assert that error message content is what's expected for a failure.
|
||||||
|
assert negative_response is None
|
||||||
|
assert ex.value.operation_name == "DescribeResourceServer"
|
||||||
|
assert ex.value.response["Error"]["Code"] == "ResourceNotFoundException"
|
||||||
|
assert (
|
||||||
|
ex.value.response["Error"]["Message"]
|
||||||
|
== f"Resource server {fake_server_id} does not exist."
|
||||||
|
)
|
||||||
|
assert ex.value.response["ResponseMetadata"]["HTTPStatusCode"] == 400
|
||||||
|
|
||||||
|
|
||||||
|
@mock_cognitoidp
|
||||||
|
def test_list_resource_servers_empty_set():
|
||||||
|
|
||||||
|
# Create a user pool to attach a resource server to
|
||||||
|
client = boto3.client("cognito-idp", "us-west-2")
|
||||||
|
name = str(uuid.uuid4())
|
||||||
|
user_pool = client.create_user_pool(PoolName=name)
|
||||||
|
user_pool_id = user_pool["UserPool"]["Id"]
|
||||||
|
|
||||||
|
# Empty list, because we aren't creating any.
|
||||||
|
all_resource_svrs = []
|
||||||
|
|
||||||
|
max_return = 50
|
||||||
|
servers = client.list_resource_servers(
|
||||||
|
UserPoolId=user_pool_id, MaxResults=max_return
|
||||||
|
)
|
||||||
|
|
||||||
|
expected_keys = ["ResourceServers", "ResponseMetadata"]
|
||||||
|
assert all(key in servers for key in expected_keys)
|
||||||
|
assert servers["ResponseMetadata"].get("HTTPStatusCode")
|
||||||
|
assert servers["ResponseMetadata"]["HTTPStatusCode"] == 200
|
||||||
|
assert servers.get("NextToken", False) is False
|
||||||
|
assert len(servers["ResourceServers"]) == len(all_resource_svrs)
|
||||||
|
assert len(servers["ResourceServers"]) == 0
|
||||||
|
|
||||||
|
|
||||||
|
@mock_cognitoidp
|
||||||
|
def test_list_resource_servers_single_page():
|
||||||
|
|
||||||
|
# Create a user pool to attach a resource server to
|
||||||
|
client = boto3.client("cognito-idp", "us-west-2")
|
||||||
|
name = str(uuid.uuid4())
|
||||||
|
user_pool = client.create_user_pool(PoolName=name)
|
||||||
|
user_pool_id = user_pool["UserPool"]["Id"]
|
||||||
|
create_num = 48
|
||||||
|
|
||||||
|
all_resource_svrs = []
|
||||||
|
for id_num in range(0, create_num, 1):
|
||||||
|
server_id = f"my_server{id_num}"
|
||||||
|
server_name = "new_remote_server{id_num}"
|
||||||
|
scopes = [
|
||||||
|
{
|
||||||
|
"ScopeName": f"app:write{id_num}",
|
||||||
|
"ScopeDescription": f"write scope{id_num}",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ScopeName": f"app:read{id_num}",
|
||||||
|
"ScopeDescription": f"read scope{id_num}",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
# Create a new resource server
|
||||||
|
new_resource_server = client.create_resource_server(
|
||||||
|
UserPoolId=user_pool_id,
|
||||||
|
Identifier=server_id,
|
||||||
|
Name=server_name,
|
||||||
|
Scopes=scopes,
|
||||||
|
)
|
||||||
|
|
||||||
|
all_resource_svrs.append(new_resource_server)
|
||||||
|
|
||||||
|
max_return = 50
|
||||||
|
servers = client.list_resource_servers(
|
||||||
|
UserPoolId=user_pool_id, MaxResults=max_return
|
||||||
|
)
|
||||||
|
|
||||||
|
expected_keys = ["ResourceServers", "ResponseMetadata"]
|
||||||
|
assert all(key in servers for key in expected_keys)
|
||||||
|
assert servers["ResponseMetadata"].get("HTTPStatusCode")
|
||||||
|
assert servers["ResponseMetadata"]["HTTPStatusCode"] == 200
|
||||||
|
assert servers.get("NextToken", False) is False
|
||||||
|
assert len(servers["ResourceServers"]) == create_num
|
||||||
|
returned_servers = servers["ResourceServers"]
|
||||||
|
|
||||||
|
for idx in range(0, create_num - 1, 1):
|
||||||
|
for key in returned_servers[idx].keys():
|
||||||
|
assert (
|
||||||
|
returned_servers[idx][key]
|
||||||
|
== all_resource_svrs[idx]["ResourceServer"][key]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@mock_cognitoidp
|
||||||
|
def test_list_resource_servers_multi_page():
|
||||||
|
|
||||||
|
# Create a user pool to attach a resource server to
|
||||||
|
client = boto3.client("cognito-idp", "us-west-2")
|
||||||
|
name = str(uuid.uuid4())
|
||||||
|
user_pool = client.create_user_pool(PoolName=name)
|
||||||
|
user_pool_id = user_pool["UserPool"]["Id"]
|
||||||
|
create_num = 65
|
||||||
|
|
||||||
|
all_resource_svrs = []
|
||||||
|
for id_num in range(0, create_num, 1):
|
||||||
|
server_id = f"my_server{id_num}"
|
||||||
|
server_name = "new_remote_server{id_num}"
|
||||||
|
scopes = [
|
||||||
|
{
|
||||||
|
"ScopeName": f"app:write{id_num}",
|
||||||
|
"ScopeDescription": f"write scope{id_num}",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ScopeName": f"app:read{id_num}",
|
||||||
|
"ScopeDescription": f"read scope{id_num}",
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
# Create a new resource server
|
||||||
|
new_resource_server = client.create_resource_server(
|
||||||
|
UserPoolId=user_pool_id,
|
||||||
|
Identifier=server_id,
|
||||||
|
Name=server_name,
|
||||||
|
Scopes=scopes,
|
||||||
|
)
|
||||||
|
|
||||||
|
all_resource_svrs.append(new_resource_server)
|
||||||
|
|
||||||
|
max_return = 50
|
||||||
|
servers = client.list_resource_servers(
|
||||||
|
UserPoolId=user_pool_id, MaxResults=max_return
|
||||||
|
)
|
||||||
|
|
||||||
|
expected_keys = ["ResourceServers", "NextToken", "ResponseMetadata"]
|
||||||
|
assert all(key in servers for key in expected_keys)
|
||||||
|
assert servers["ResponseMetadata"].get("HTTPStatusCode")
|
||||||
|
assert servers["ResponseMetadata"]["HTTPStatusCode"] == 200
|
||||||
|
assert servers.get("NextToken", False)
|
||||||
|
assert len(servers["ResourceServers"]) == max_return
|
||||||
|
returned_servers = servers["ResourceServers"]
|
||||||
|
|
||||||
|
for idx in range(0, max_return - 1, 1):
|
||||||
|
for key in returned_servers[idx].keys():
|
||||||
|
assert (
|
||||||
|
returned_servers[idx][key]
|
||||||
|
== all_resource_svrs[idx]["ResourceServer"][key]
|
||||||
|
)
|
||||||
|
|
||||||
|
next_page = client.list_resource_servers(
|
||||||
|
UserPoolId=user_pool_id, MaxResults=max_return, NextToken=servers["NextToken"]
|
||||||
|
)
|
||||||
|
|
||||||
|
expected_keys = ["ResourceServers", "ResponseMetadata"]
|
||||||
|
expected_returns = create_num - max_return
|
||||||
|
assert all(key in next_page for key in expected_keys)
|
||||||
|
assert next_page["ResponseMetadata"].get("HTTPStatusCode")
|
||||||
|
assert next_page["ResponseMetadata"]["HTTPStatusCode"] == 200
|
||||||
|
assert next_page.get("NextToken", False) is False
|
||||||
|
assert len(next_page["ResourceServers"]) == expected_returns
|
||||||
|
returned_servers = next_page["ResourceServers"]
|
||||||
|
|
||||||
|
# Check the second page of results
|
||||||
|
# Each entry in the second page should be the offset of 'max_return + idx' in all_resource_svrs
|
||||||
|
for idx in range(0, expected_returns, 1):
|
||||||
|
for key in returned_servers[idx].keys():
|
||||||
|
all_idx = idx + max_return
|
||||||
|
assert (
|
||||||
|
returned_servers[idx][key]
|
||||||
|
== all_resource_svrs[all_idx]["ResourceServer"][key]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@mock_cognitoidp
|
@mock_cognitoidp
|
||||||
def test_sign_up():
|
def test_sign_up():
|
||||||
conn = boto3.client("cognito-idp", "us-west-2")
|
conn = boto3.client("cognito-idp", "us-west-2")
|
||||||
|
Loading…
Reference in New Issue
Block a user