From 504013ede2ff2e4deab6568500676f531b8d0747 Mon Sep 17 00:00:00 2001 From: Warren Parad Date: Mon, 24 Jun 2024 18:32:53 +0200 Subject: [PATCH 1/3] Remove generated zip from repo. --- python-client-generated.zip | Bin 345110 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 python-client-generated.zip diff --git a/python-client-generated.zip b/python-client-generated.zip deleted file mode 100644 index db38dd3c107f35616396a2213fdb5e27c4ecb478..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 345110 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 z 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

bOe^4Syp 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

4+X@^%>RR@SX0`4% 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
lUJ=f{XM|8;HAH3 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 From 96f258c1dcac69552777b200ab6707ddd82714a5 Mon Sep 17 00:00:00 2001 From: Warren Parad Date: Mon, 24 Jun 2024 18:51:00 +0200 Subject: [PATCH 2/3] Specify pydantic version to use. --- contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contributing.md b/contributing.md index 3011413..c3ca9a3 100644 --- a/contributing.md +++ b/contributing.md @@ -24,7 +24,7 @@ CID=$(podman run -d -p 8888:8080 openapitools/openapi-generator-online) sleep 10 # Execute an HTTP request to generate a Ruby client -curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"openAPIUrl": "https://api.authress.io/", "options": { "useSingleRequestParameter": true, "packageName": "authress", "packageVersion": "99.99.99" } }' 'http://localhost:8888/api/gen/clients/python' +curl -X POST --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"openAPIUrl": "https://api.authress.io/", "options": { "useSingleRequestParameter": true, "packageName": "authress", "packageVersion": "99.99.99" } }' 'http://localhost:8888/api/gen/clients/python-pydantic-v1' # RESPONSE: { "link":"http://localhost:8888/api/gen/download/c2d483.3.4672-40e9-91df-b9ffd18d22b8" } From dd0031c01037b57ee97f391ebff3ae44a9248dbd Mon Sep 17 00:00:00 2001 From: Warren Parad Date: Mon, 24 Jun 2024 19:08:23 +0200 Subject: [PATCH 3/3] Regenerate python library from openapi spec. --- .openapi-generator/FILES | 4 - authress/__init__.py | 2 - authress/models/__init__.py | 13 ++- authress/models/access_record.py | 32 +++--- authress/models/access_record_account.py | 6 +- authress/models/access_record_collection.py | 8 +- authress/models/access_request.py | 16 +-- authress/models/access_request_collection.py | 8 +- authress/models/access_request_response.py | 8 +- authress/models/access_template.py | 10 +- authress/models/account.py | 10 +- authress/models/account_collection.py | 4 +- authress/models/account_links.py | 6 +- authress/models/application_delegation.py | 8 +- authress/models/claim_request.py | 8 +- authress/models/client.py | 33 ++++-- authress/models/client_access_key.py | 39 +++++-- authress/models/client_collection.py | 8 +- authress/models/client_options.py | 10 +- authress/models/client_rate_limit.py | 99 +++++++++++++++++ authress/models/collection_links.py | 6 +- authress/models/connection.py | 80 +++++++++++--- authress/models/connection_collection.py | 6 +- ...ata_object.py => connection_conditions.py} | 49 ++++----- authress/models/connection_data.py | 69 ++++++++++-- ...onnection_default_connection_properties.py | 10 +- .../connection_linking_configuration.py | 90 +++++++++++++++ .../connection_user_data_configuration.py | 90 +++++++++++++++ authress/models/extension.py | 14 +-- authress/models/extension_application.py | 12 +- authress/models/extension_client.py | 33 ++++-- authress/models/extension_collection.py | 6 +- authress/models/group.py | 24 ++-- authress/models/group_collection.py | 8 +- authress/models/identity.py | 27 +++-- authress/models/identity_collection.py | 4 +- authress/models/identity_request.py | 17 +-- authress/models/invite.py | 40 ++++--- authress/models/invite_statement.py | 99 +++++++++++++++++ authress/models/link.py | 10 +- authress/models/linked_group.py | 22 ++-- authress/models/links.py | 6 +- authress/models/o_auth_authorize_response.py | 6 +- authress/models/o_auth_token_request.py | 20 ++-- authress/models/o_auth_token_response.py | 6 +- authress/models/pagination.py | 6 +- authress/models/pagination_next.py | 6 +- authress/models/permission_collection.py | 24 ++-- .../models/permission_collection_account.py | 6 +- authress/models/permission_object.py | 14 +-- authress/models/permissioned_resource.py | 6 +- .../permissioned_resource_collection.py | 6 +- authress/models/resource.py | 6 +- authress/models/resource_permission.py | 4 +- authress/models/resource_users_collection.py | 8 +- authress/models/role.py | 17 +-- authress/models/role_collection.py | 8 +- authress/models/statement.py | 22 +++- authress/models/tenant.py | 45 ++++++-- authress/models/tenant_collection.py | 6 +- authress/models/tenant_connection.py | 11 +- authress/models/tenant_data.py | 6 +- ...ata_object_account.py => tenant_domain.py} | 39 ++++--- authress/models/tenant_user.py | 85 ++++++++++++++ authress/models/token_request.py | 8 +- authress/models/user.py | 12 +- .../models/user_connection_credentials.py | 8 +- authress/models/user_identity.py | 25 +++-- authress/models/user_identity_collection.py | 8 +- authress/models/user_resources_collection.py | 24 ++-- authress/models/user_role.py | 22 ++-- authress/models/user_role_collection.py | 24 ++-- authress/models/user_token.py | 26 +++-- contributing.md | 4 + docs/AccessRecord.md | 28 ++--- docs/AccessRecordAccount.md | 4 +- docs/AccessRecordCollection.md | 8 +- docs/AccessRecordsApi.md | 104 +++++++++--------- docs/AccessRequest.md | 14 +-- docs/AccessRequestCollection.md | 8 +- docs/AccessRequestResponse.md | 4 +- docs/AccessTemplate.md | 6 +- docs/Account.md | 12 +- docs/AccountCollection.md | 4 +- docs/AccountLinks.md | 4 +- docs/AccountsApi.md | 22 ++-- docs/ApplicationDelegation.md | 4 +- docs/ApplicationsApi.md | 12 +- docs/ClaimRequest.md | 6 +- docs/Client.md | 15 +-- docs/ClientAccessKey.md | 13 ++- docs/ClientCollection.md | 8 +- docs/ClientOptions.md | 2 +- docs/ClientRateLimit.md | 30 +++++ docs/CollectionLinks.md | 6 +- docs/Connection.md | 30 +++-- docs/ConnectionCollection.md | 6 +- docs/ConnectionConditions.md | 29 +++++ docs/ConnectionData.md | 12 +- docs/ConnectionDefaultConnectionProperties.md | 4 +- docs/ConnectionLinkingConfiguration.md | 29 +++++ docs/ConnectionUserDataConfiguration.md | 28 +++++ docs/ConnectionsApi.md | 49 +++++---- docs/EXAMPLES.md | 8 +- docs/Extension.md | 14 +-- docs/ExtensionApplication.md | 8 +- docs/ExtensionClient.md | 7 +- docs/ExtensionCollection.md | 6 +- docs/ExtensionsApi.md | 54 +++++---- docs/Group.md | 16 +-- docs/GroupCollection.md | 8 +- docs/GroupsApi.md | 48 ++++---- docs/Identity.md | 7 +- docs/IdentityCollection.md | 4 +- docs/IdentityRequest.md | 7 +- docs/Invite.md | 10 +- docs/InviteStatement.md | 31 ++++++ docs/InvitesApi.md | 32 +++--- docs/Link.md | 6 +- docs/LinkedGroup.md | 4 +- docs/Links.md | 4 +- docs/MetadataObject.md | 31 ------ docs/MetadataObjectAccount.md | 28 ----- docs/OAuthAuthorizeResponse.md | 4 +- docs/OAuthTokenRequest.md | 16 +-- docs/OAuthTokenResponse.md | 4 +- docs/Pagination.md | 4 +- docs/PaginationNext.md | 4 +- docs/PermissionCollection.md | 8 +- docs/PermissionCollectionAccount.md | 4 +- docs/PermissionObject.md | 10 +- docs/PermissionedResource.md | 4 +- docs/PermissionedResourceCollection.md | 8 +- docs/README.md | 1 + docs/Resource.md | 4 +- docs/ResourcePermission.md | 6 +- docs/ResourcePermissionsApi.md | 28 ++--- docs/ResourceUsersCollection.md | 8 +- docs/Role.md | 10 +- docs/RoleCollection.md | 8 +- docs/RolesApi.md | 51 +++++---- docs/ServiceClientsApi.md | 56 +++++----- docs/Statement.md | 10 +- docs/Tenant.md | 13 ++- docs/TenantCollection.md | 6 +- docs/TenantConnection.md | 4 +- docs/TenantData.md | 4 +- docs/TenantDomain.md | 29 +++++ docs/TenantUser.md | 28 +++++ docs/TenantsApi.md | 102 ++++++++++++++--- docs/TokenRequest.md | 6 +- docs/User.md | 4 +- docs/UserConnectionCredentials.md | 4 +- docs/UserIdentity.md | 10 +- docs/UserIdentityCollection.md | 8 +- docs/UserPermissionsApi.md | 46 ++++---- docs/UserResourcesCollection.md | 12 +- docs/UserRole.md | 4 +- docs/UserRoleCollection.md | 6 +- docs/UserToken.md | 12 +- docs/UsersApi.md | 94 ++++++++++++++-- test/test_access_record.py | 48 ++++---- test/test_access_record_account.py | 14 +-- test/test_access_record_collection.py | 22 ++-- test/test_access_records_api.py | 38 +++---- test/test_access_request.py | 32 +++--- test/test_access_request_collection.py | 20 ++-- test/test_access_request_response.py | 14 +-- test/test_access_template.py | 20 ++-- test/test_account.py | 26 ++--- test/test_account_collection.py | 14 +-- test/test_account_links.py | 14 +-- test/test_accounts_api.py | 20 ++-- test/test_application_delegation.py | 14 +-- test/test_applications_api.py | 14 +-- test/test_claim_request.py | 16 ++- test/test_client.py | 30 ++--- test/test_client_access_key.py | 23 ++-- test/test_client_collection.py | 34 ++++-- test/test_client_options.py | 16 ++- ...t_account.py => test_client_rate_limit.py} | 37 ++++--- test/test_collection_links.py | 16 ++- test/test_connection.py | 51 +++++---- test/test_connection_collection.py | 74 ++++++++----- ...bject.py => test_connection_conditions.py} | 39 +++---- test/test_connection_data.py | 24 ++-- ...onnection_default_connection_properties.py | 14 +-- test/test_connection_linking_configuration.py | 53 +++++++++ ...test_connection_user_data_configuration.py | 53 +++++++++ test/test_connections_api.py | 24 ++-- test/test_extension.py | 35 +++--- test/test_extension_application.py | 22 ++-- test/test_extension_client.py | 25 ++--- test/test_extension_collection.py | 34 +++--- test/test_extensions_api.py | 26 ++--- test/test_group.py | 30 ++--- test/test_group_collection.py | 18 ++- test/test_groups_api.py | 24 ++-- test/test_identity.py | 19 ++-- test/test_identity_collection.py | 20 ++-- test/test_identity_request.py | 21 ++-- test/test_invite.py | 44 +++----- test/test_invite_statement.py | 72 ++++++++++++ test/test_invites_api.py | 20 ++-- test/test_link.py | 16 ++- test/test_linked_group.py | 18 ++- test/test_links.py | 14 +-- test/test_o_auth_authorize_response.py | 14 +-- test/test_o_auth_token_request.py | 26 ++--- test/test_o_auth_token_response.py | 14 +-- test/test_pagination.py | 14 +-- test/test_pagination_next.py | 14 +-- test/test_permission_collection.py | 20 ++-- test/test_permission_collection_account.py | 14 +-- test/test_permission_object.py | 20 ++-- test/test_permissioned_resource.py | 14 +-- test/test_permissioned_resource_collection.py | 18 ++- test/test_resource.py | 14 +-- test/test_resource_permission.py | 16 ++- test/test_resource_permissions_api.py | 20 ++-- test/test_resource_users_collection.py | 18 ++- test/test_role.py | 21 ++-- test/test_role_collection.py | 18 ++- test/test_roles_api.py | 24 ++-- test/test_service_clients_api.py | 26 ++--- test/test_statement.py | 24 ++-- test/test_tenant.py | 27 ++--- test/test_tenant_collection.py | 40 ++++--- test/test_tenant_connection.py | 16 ++- test/test_tenant_data.py | 16 ++- test/test_tenant_domain.py | 54 +++++++++ test/test_tenant_user.py | 53 +++++++++ test/test_tenants_api.py | 29 +++-- test/test_token_request.py | 20 ++-- test/test_user.py | 14 +-- test/test_user_connection_credentials.py | 14 +-- test/test_user_identity.py | 20 ++-- test/test_user_identity_collection.py | 22 ++-- test/test_user_permissions_api.py | 20 ++-- test/test_user_resources_collection.py | 24 ++-- test/test_user_role.py | 19 ++-- test/test_user_role_collection.py | 18 ++- test/test_user_token.py | 24 ++-- test/test_users_api.py | 25 +++-- 244 files changed, 3173 insertions(+), 1949 deletions(-) create mode 100644 authress/models/client_rate_limit.py rename authress/models/{metadata_object.py => connection_conditions.py} (52%) create mode 100644 authress/models/connection_linking_configuration.py create mode 100644 authress/models/connection_user_data_configuration.py create mode 100644 authress/models/invite_statement.py rename authress/models/{metadata_object_account.py => tenant_domain.py} (65%) create mode 100644 authress/models/tenant_user.py create mode 100644 docs/ClientRateLimit.md create mode 100644 docs/ConnectionConditions.md create mode 100644 docs/ConnectionLinkingConfiguration.md create mode 100644 docs/ConnectionUserDataConfiguration.md create mode 100644 docs/InviteStatement.md delete mode 100644 docs/MetadataObject.md delete mode 100644 docs/MetadataObjectAccount.md create mode 100644 docs/TenantDomain.md create mode 100644 docs/TenantUser.md rename test/{test_metadata_object_account.py => test_client_rate_limit.py} (64%) rename test/{test_metadata_object.py => test_connection_conditions.py} (60%) create mode 100644 test/test_connection_linking_configuration.py create mode 100644 test/test_connection_user_data_configuration.py create mode 100644 test/test_invite_statement.py create mode 100644 test/test_tenant_domain.py create mode 100644 test/test_tenant_user.py diff --git a/.openapi-generator/FILES b/.openapi-generator/FILES index bfed06a..276ffe8 100644 --- a/.openapi-generator/FILES +++ b/.openapi-generator/FILES @@ -58,8 +58,6 @@ authress/models/invite.py authress/models/link.py authress/models/linked_group.py authress/models/links.py -authress/models/metadata_object.py -authress/models/metadata_object_account.py authress/models/o_auth_authorize_response.py authress/models/o_auth_token_request.py authress/models/o_auth_token_response.py @@ -217,8 +215,6 @@ test/test_invites_api.py test/test_link.py test/test_linked_group.py test/test_links.py -test/test_metadata_object.py -test/test_metadata_object_account.py test/test_o_auth_authorize_response.py test/test_o_auth_token_request.py test/test_o_auth_token_response.py diff --git a/authress/__init__.py b/authress/__init__.py index 802617e..55c7203 100644 --- a/authress/__init__.py +++ b/authress/__init__.py @@ -93,8 +93,6 @@ from authress.models.link import Link from authress.models.linked_group import LinkedGroup from authress.models.links import Links -from authress.models.metadata_object import MetadataObject -from authress.models.metadata_object_account import MetadataObjectAccount from authress.models.o_auth_authorize_response import OAuthAuthorizeResponse from authress.models.o_auth_token_request import OAuthTokenRequest from authress.models.o_auth_token_response import OAuthTokenResponse diff --git a/authress/models/__init__.py b/authress/models/__init__.py index ef5e405..8fe509c 100644 --- a/authress/models/__init__.py +++ b/authress/models/__init__.py @@ -4,14 +4,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 # import models into model package @@ -31,11 +31,15 @@ from authress.models.client_access_key import ClientAccessKey from authress.models.client_collection import ClientCollection from authress.models.client_options import ClientOptions +from authress.models.client_rate_limit import ClientRateLimit from authress.models.collection_links import CollectionLinks from authress.models.connection import Connection from authress.models.connection_collection import ConnectionCollection +from authress.models.connection_conditions import ConnectionConditions from authress.models.connection_data import ConnectionData from authress.models.connection_default_connection_properties import ConnectionDefaultConnectionProperties +from authress.models.connection_linking_configuration import ConnectionLinkingConfiguration +from authress.models.connection_user_data_configuration import ConnectionUserDataConfiguration from authress.models.extension import Extension from authress.models.extension_application import ExtensionApplication from authress.models.extension_client import ExtensionClient @@ -46,11 +50,10 @@ from authress.models.identity_collection import IdentityCollection from authress.models.identity_request import IdentityRequest from authress.models.invite import Invite +from authress.models.invite_statement import InviteStatement from authress.models.link import Link from authress.models.linked_group import LinkedGroup from authress.models.links import Links -from authress.models.metadata_object import MetadataObject -from authress.models.metadata_object_account import MetadataObjectAccount from authress.models.o_auth_authorize_response import OAuthAuthorizeResponse from authress.models.o_auth_token_request import OAuthTokenRequest from authress.models.o_auth_token_response import OAuthTokenResponse @@ -71,6 +74,8 @@ from authress.models.tenant_collection import TenantCollection from authress.models.tenant_connection import TenantConnection from authress.models.tenant_data import TenantData +from authress.models.tenant_domain import TenantDomain +from authress.models.tenant_user import TenantUser from authress.models.token_request import TokenRequest from authress.models.user import User from authress.models.user_connection_credentials import UserConnectionCredentials diff --git a/authress/models/access_record.py b/authress/models/access_record.py index 9368939..4402d2a 100644 --- a/authress/models/access_record.py +++ b/authress/models/access_record.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -32,21 +32,21 @@ class AccessRecord(BaseModel): """ - The access record which links users to roles. + The access record which links users to roles. # noqa: E501 """ - record_id: Optional[constr(strict=True, max_length=100, min_length=1)] = Field(None, alias="recordId", description="Unique identifier for the record, can be specified on record creation.") - name: constr(strict=True, max_length=128, min_length=1) = Field(..., description="A helpful name for this record") - description: Optional[constr(strict=True, max_length=1024, min_length=0)] = Field(None, description="More details about this record") - capacity: Optional[Union[confloat(le=1, ge=0, strict=True), conint(le=1, ge=0, strict=True)]] = Field(None, description="Percentage capacity of record that is filled.") - last_updated: Optional[datetime] = Field(None, alias="lastUpdated", description="The expected last time the record was updated") - status: Optional[StrictStr] = Field(None, description="Current status of the access record.") - account: Optional[AccessRecordAccount] = Field(...) - users: Optional[conlist(User)] = Field(None, description="The list of users this record applies to") - admins: Optional[conlist(User)] = Field(None, description="The list of admin that can edit this record even if they do not have global record edit permissions.") - groups: Optional[conlist(LinkedGroup)] = Field(None, description="The list of groups this record applies to. Users in these groups will be receive access to the resources listed.") - statements: conlist(Statement, min_items=1) = Field(..., description="A list of statements which match roles to resources.") - links: Optional[AccountLinks] = Field(...) - tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") + record_id: Optional[constr(strict=True, max_length=100, min_length=1)] = Field(default=None, alias="recordId", description="Unique identifier for the record, can be specified on record creation.") + name: constr(strict=True, max_length=128, min_length=1) = Field(default=..., description="A helpful name for this record") + description: Optional[constr(strict=True, max_length=1024, min_length=0)] = Field(default=None, description="More details about this record") + capacity: Optional[Union[confloat(le=1, ge=0, strict=True), conint(le=1, ge=0, strict=True)]] = Field(default=None, description="Percentage capacity of record that is filled.") + last_updated: Optional[datetime] = Field(default=None, alias="lastUpdated", description="The expected last time the record was updated") + status: Optional[StrictStr] = Field(default=None, description="Current status of the access record.") + account: Optional[AccessRecordAccount] = None + users: Optional[conlist(User, max_items=1000, min_items=0)] = Field(default=None, description="The list of users this record applies to. The record is finite in size, for patterns where the list of users might grow indefinitely, the recommended solution is to specify each user in their own access record.") + admins: Optional[conlist(User, max_items=100, min_items=0)] = Field(default=None, description="The list of admin that can edit this record even if they do not have global record edit permissions.") + groups: Optional[conlist(LinkedGroup, max_items=100, min_items=0)] = Field(default=None, description="The list of groups this record applies to. Users in these groups will be receive access to the resources listed.") + statements: conlist(Statement, max_items=100, min_items=1) = Field(default=..., description="A list of statements which match roles to resources.") + links: Optional[AccountLinks] = None + tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(default=None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") __properties = ["recordId", "name", "description", "capacity", "lastUpdated", "status", "account", "users", "admins", "groups", "statements", "links", "tags"] @validator('record_id') diff --git a/authress/models/access_record_account.py b/authress/models/access_record_account.py index d66645e..bc05cce 100644 --- a/authress/models/access_record_account.py +++ b/authress/models/access_record_account.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class AccessRecordAccount(BaseModel): """ AccessRecordAccount """ - account_id: StrictStr = Field(..., alias="accountId") + account_id: StrictStr = Field(default=..., alias="accountId") __properties = ["accountId"] class Config: diff --git a/authress/models/access_record_collection.py b/authress/models/access_record_collection.py index ae9d512..15471ab 100644 --- a/authress/models/access_record_collection.py +++ b/authress/models/access_record_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,9 +30,9 @@ class AccessRecordCollection(BaseModel): """ - A collection of access records + A collection of access records # noqa: E501 """ - records: conlist(AccessRecord) = Field(..., description="A list of access records") + records: conlist(AccessRecord) = Field(default=..., description="A list of access records") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["records", "pagination", "links"] diff --git a/authress/models/access_request.py b/authress/models/access_request.py index a93c7ee..70938a3 100644 --- a/authress/models/access_request.py +++ b/authress/models/access_request.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,14 +29,14 @@ class AccessRequest(BaseModel): """ - The access requested by a user. + The access requested by a user. # noqa: E501 """ - request_id: constr(strict=True, max_length=100, min_length=1) = Field(..., alias="requestId", description="Unique identifier for the request.") - last_updated: Optional[datetime] = Field(None, alias="lastUpdated", description="The expected last time the request was updated") - status: Optional[StrictStr] = Field(None, description="Current status of the access request.") + request_id: constr(strict=True, max_length=100, min_length=1) = Field(default=..., alias="requestId", description="Unique identifier for the request.") + last_updated: Optional[datetime] = Field(default=None, alias="lastUpdated", description="The expected last time the request was updated") + status: Optional[StrictStr] = Field(default=None, description="Current status of the access request.") access: AccessTemplate = Field(...) - links: Optional[AccountLinks] = Field(...) - tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") + links: Optional[AccountLinks] = None + tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(default=None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") __properties = ["requestId", "lastUpdated", "status", "access", "links", "tags"] @validator('request_id') diff --git a/authress/models/access_request_collection.py b/authress/models/access_request_collection.py index 663b0ad..e46d7af 100644 --- a/authress/models/access_request_collection.py +++ b/authress/models/access_request_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,9 +30,9 @@ class AccessRequestCollection(BaseModel): """ - A collection of access requests + A collection of access requests # noqa: E501 """ - records: Optional[conlist(AccessRequest)] = Field(None, description="A list of access requests") + records: Optional[conlist(AccessRequest)] = Field(default=None, description="A list of access requests") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["records", "pagination", "links"] diff --git a/authress/models/access_request_response.py b/authress/models/access_request_response.py index 9f058c3..c81e817 100644 --- a/authress/models/access_request_response.py +++ b/authress/models/access_request_response.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,9 +27,9 @@ class AccessRequestResponse(BaseModel): """ - A dynamic body to support request PATCH operations + A dynamic body to support request PATCH operations # noqa: E501 """ - status: StrictStr = Field(..., description="New result, either approve or deny the request") + status: StrictStr = Field(default=..., description="New result, either approve or deny the request") __properties = ["status"] @validator('status') diff --git a/authress/models/access_template.py b/authress/models/access_template.py index 2aa2946..41d7ab0 100644 --- a/authress/models/access_template.py +++ b/authress/models/access_template.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,10 +29,10 @@ class AccessTemplate(BaseModel): """ - A logical grouping of access related elements + A logical grouping of access related elements # noqa: E501 """ - users: conlist(User, min_items=1) = Field(..., description="The list of users the access applies to") - statements: conlist(Statement, min_items=1) = Field(..., description="A list of statements which match roles to resources.") + users: conlist(User, max_items=100, min_items=1) = Field(default=..., description="The list of users access applies to. Access templates are finite in size, for patterns where the list of users might grow indefinitely, the recommended solution is to specify each user in their own access record.") + statements: conlist(Statement, max_items=100, min_items=1) = Field(default=..., description="A list of statements which match roles to resources.") __properties = ["users", "statements"] class Config: diff --git a/authress/models/account.py b/authress/models/account.py index 8b1fcf1..388fa4e 100644 --- a/authress/models/account.py +++ b/authress/models/account.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,11 +30,11 @@ class Account(BaseModel): """ Account """ - account_id: constr(strict=True, max_length=64, min_length=1) = Field(..., alias="accountId") - created_time: datetime = Field(..., alias="createdTime") + account_id: constr(strict=True, max_length=64, min_length=1) = Field(default=..., alias="accountId") + created_time: datetime = Field(default=..., alias="createdTime") name: Optional[constr(strict=True, max_length=32)] = None company: Dict[str, Any] = Field(...) - links: Optional[AccountLinks] = Field(...) + links: Optional[AccountLinks] = None __properties = ["accountId", "createdTime", "name", "company", "links"] class Config: diff --git a/authress/models/account_collection.py b/authress/models/account_collection.py index 2543aa3..1805540 100644 --- a/authress/models/account_collection.py +++ b/authress/models/account_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations diff --git a/authress/models/account_links.py b/authress/models/account_links.py index db4a709..2b498ba 100644 --- a/authress/models/account_links.py +++ b/authress/models/account_links.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,7 +30,7 @@ class AccountLinks(BaseModel): """ AccountLinks """ - var_self: Optional[Link] = Field(..., alias="self") + var_self: Optional[Link] = Field(default=..., alias="self") __properties = ["self"] class Config: diff --git a/authress/models/application_delegation.py b/authress/models/application_delegation.py index 8fb43de..2455bb0 100644 --- a/authress/models/application_delegation.py +++ b/authress/models/application_delegation.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,9 +27,9 @@ class ApplicationDelegation(BaseModel): """ - The delegation response. + The delegation response. # noqa: E501 """ - authentication_url: StrictStr = Field(..., alias="authenticationUrl", description="Redirect the user to this url to automatically log them into a third-party application.") + authentication_url: StrictStr = Field(default=..., alias="authenticationUrl", description="Redirect the user to this url to automatically log them into a third-party application.") __properties = ["authenticationUrl"] class Config: diff --git a/authress/models/claim_request.py b/authress/models/claim_request.py index 5e8bbe4..594d3c2 100644 --- a/authress/models/claim_request.py +++ b/authress/models/claim_request.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,8 +29,8 @@ class ClaimRequest(BaseModel): """ ClaimRequest """ - collection_resource: constr(strict=True, max_length=128, min_length=1) = Field(..., alias="collectionResource", description="The parent resource to add a sub-resource to. The resource must have a resource configuration that add the permission CLAIM for this to work.") - resource_id: constr(strict=True, max_length=128, min_length=1) = Field(..., alias="resourceId", description="The sub-resource the user is requesting Admin ownership over.") + collection_resource: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="collectionResource", description="The parent resource to add a sub-resource to. The resource must have a resource configuration that add the permission CLAIM for this to work.") + resource_id: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="resourceId", description="The sub-resource the user is requesting Admin ownership over.") __properties = ["collectionResource", "resourceId"] class Config: diff --git a/authress/models/client.py b/authress/models/client.py index a143c4f..c82be2f 100644 --- a/authress/models/client.py +++ b/authress/models/client.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -26,18 +26,20 @@ from pydantic import BaseModel, Field, StrictStr, conlist, constr from authress.models.client_access_key import ClientAccessKey from authress.models.client_options import ClientOptions +from authress.models.client_rate_limit import ClientRateLimit class Client(BaseModel): """ - A client configuration. + A client configuration. # noqa: E501 """ - client_id: StrictStr = Field(..., alias="clientId", description="The unique ID of the client.") - created_time: datetime = Field(..., alias="createdTime") - name: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(None, description="The name of the client") + client_id: StrictStr = Field(default=..., alias="clientId", description="The unique ID of the client.") + created_time: datetime = Field(default=..., alias="createdTime") + name: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, description="The name of the client") options: Optional[ClientOptions] = None - verification_keys: Optional[conlist(ClientAccessKey)] = Field(None, alias="verificationKeys", description="A list of the service client access keys.") - tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") - __properties = ["clientId", "createdTime", "name", "options", "verificationKeys", "tags"] + rate_limits: Optional[conlist(ClientRateLimit, max_items=1, min_items=0)] = Field(default=None, alias="rateLimits", description="A list of the service client rate limits. Rate Limits can be used to prevent service clients from creating too many requests to your API. They can also limit the number of requests to Authress management APIs, or contain a maximum quota for a client before it is not longer allowed to make additional requests.") + verification_keys: Optional[conlist(ClientAccessKey)] = Field(default=None, alias="verificationKeys", description="A list of the service client access keys.") + tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(default=None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") + __properties = ["clientId", "createdTime", "name", "options", "rateLimits", "verificationKeys", "tags"] class Config: """Pydantic configuration""" @@ -69,6 +71,13 @@ def to_dict(self): # override the default output from pydantic by calling `to_dict()` of options if self.options: _dict['options'] = self.options.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in rate_limits (list) + _items = [] + if self.rate_limits: + for _item in self.rate_limits: + if _item: + _items.append(_item.to_dict()) + _dict['rateLimits'] = _items # override the default output from pydantic by calling `to_dict()` of each item in verification_keys (list) _items = [] if self.verification_keys: @@ -81,6 +90,11 @@ def to_dict(self): if self.name is None and "name" in self.__fields_set__: _dict['name'] = None + # set to None if rate_limits (nullable) is None + # and __fields_set__ contains the field + if self.rate_limits is None and "rate_limits" in self.__fields_set__: + _dict['rateLimits'] = None + # set to None if tags (nullable) is None # and __fields_set__ contains the field if self.tags is None and "tags" in self.__fields_set__: @@ -102,6 +116,7 @@ def from_dict(cls, obj: dict) -> Client: "created_time": obj.get("createdTime"), "name": obj.get("name"), "options": ClientOptions.from_dict(obj.get("options")) if obj.get("options") is not None else None, + "rate_limits": [ClientRateLimit.from_dict(_item) for _item in obj.get("rateLimits")] if obj.get("rateLimits") is not None else None, "verification_keys": [ClientAccessKey.from_dict(_item) for _item in obj.get("verificationKeys")] if obj.get("verificationKeys") is not None else None, "tags": obj.get("tags") }) diff --git a/authress/models/client_access_key.py b/authress/models/client_access_key.py index 12c3bf8..a078e88 100644 --- a/authress/models/client_access_key.py +++ b/authress/models/client_access_key.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,20 +21,31 @@ from datetime import datetime from typing import Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, StrictStr, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, StrictStr, constr, validator class ClientAccessKey(BaseModel): """ - A client access key configuration. The configuration contains information about the key. On first creation the configuration also contains the raw `clientSecret` and `accessKey` for use with OAuth and the Authress SDKs. + A client access key configuration. The configuration contains information about the key. On first creation the configuration also contains the raw `clientSecret` and `accessKey` for use with OAuth and the Authress SDKs. # noqa: E501 """ - key_id: Optional[StrictStr] = Field(None, alias="keyId", description="The unique ID of the client.") - client_id: StrictStr = Field(..., alias="clientId", description="The unique ID of the client.") - generation_date: Optional[datetime] = Field(None, alias="generationDate") - client_secret: Optional[StrictStr] = Field(None, alias="clientSecret", description="The unencoded OAuth client secret used with the OAuth endpoints to request a JWT using the `client_credentials` grant type. Pass the clientId and the clientSecret to the documented /tokens endpoint.") - access_key: Optional[StrictStr] = Field(None, alias="accessKey", description="An encoded access key which contains identifying information for client access token creation. For direct use with the Authress SDKs. This private access key must be saved on first creation as it is discarded afterwards. Authress only saves the corresponding public key to verify the private access key.") - __properties = ["keyId", "clientId", "generationDate", "clientSecret", "accessKey"] + key_id: Optional[StrictStr] = Field(default=None, alias="keyId", description="The unique ID of the client.") + client_id: StrictStr = Field(default=..., alias="clientId", description="The unique ID of the client.") + public_key: Optional[constr(strict=True, max_length=256, min_length=0)] = Field(default=None, alias="publicKey", description="Specify a public key on access key creation to bring your own private key. When left blank, Authress will automatically generate a private and public key pair and then return the private key as part of the request. This property holds the public key.") + generation_date: Optional[datetime] = Field(default=None, alias="generationDate") + client_secret: Optional[StrictStr] = Field(default=None, alias="clientSecret", description="The unencoded OAuth client secret used with the OAuth endpoints to request a JWT using the `client_credentials` grant type. Pass the clientId and the clientSecret to the documented /tokens endpoint.") + access_key: Optional[StrictStr] = Field(default=None, alias="accessKey", description="An encoded access key which contains identifying information for client access token creation. For direct use with the Authress SDKs. This private access key must be saved on first creation as it is discarded afterwards. Authress only saves the corresponding public key to verify the private access key.") + __properties = ["keyId", "clientId", "publicKey", "generationDate", "clientSecret", "accessKey"] + + @validator('public_key') + def public_key_validate_regular_expression(cls, value): + """Validates the regular expression""" + if value is None: + return value + + if not re.match(r"^[a-zA-Z0-9-]*$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-]*$/") + return value class Config: """Pydantic configuration""" @@ -65,6 +76,11 @@ def to_dict(self): "access_key", }, exclude_none=True) + # set to None if public_key (nullable) is None + # and __fields_set__ contains the field + if self.public_key is None and "public_key" in self.__fields_set__: + _dict['publicKey'] = None + return _dict @classmethod @@ -79,6 +95,7 @@ def from_dict(cls, obj: dict) -> ClientAccessKey: _obj = ClientAccessKey.parse_obj({ "key_id": obj.get("keyId"), "client_id": obj.get("clientId"), + "public_key": obj.get("publicKey"), "generation_date": obj.get("generationDate"), "client_secret": obj.get("clientSecret"), "access_key": obj.get("accessKey") diff --git a/authress/models/client_collection.py b/authress/models/client_collection.py index 0a9cfa3..2d5b9c5 100644 --- a/authress/models/client_collection.py +++ b/authress/models/client_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,9 +30,9 @@ class ClientCollection(BaseModel): """ - The collection of a list of clients + The collection of a list of clients # noqa: E501 """ - clients: conlist(Client) = Field(..., description="A list of clients") + clients: conlist(Client) = Field(default=..., description="A list of clients") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["clients", "pagination", "links"] diff --git a/authress/models/client_options.py b/authress/models/client_options.py index 7c314a7..7d3a996 100644 --- a/authress/models/client_options.py +++ b/authress/models/client_options.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,10 +27,10 @@ class ClientOptions(BaseModel): """ - A set of client specific options + A set of client specific options # noqa: E501 """ - grant_user_permissions_access: Optional[StrictBool] = Field(False, alias="grantUserPermissionsAccess", description="Grant the client access to verify authorization on behalf of any user.") - grant_token_generation: Optional[StrictBool] = Field(False, alias="grantTokenGeneration", description="Grant the client access to generate oauth tokens on behalf of the Authress account. **Security Warning**: This means that this client can impersonate any user, and should only be used when connecting an existing custom Authorization Server to Authress, when that server does not support a standard OAuth connection.") + grant_user_permissions_access: Optional[StrictBool] = Field(default=False, alias="grantUserPermissionsAccess", description="Grant the client access to verify authorization on behalf of any user.") + grant_token_generation: Optional[StrictBool] = Field(default=False, alias="grantTokenGeneration", description="Grant the client access to generate oauth tokens on behalf of the Authress account. **Security Warning**: This means that this client can impersonate any user, and should only be used when connecting an existing custom Authorization Server to Authress, when that server does not support a standard OAuth connection.") __properties = ["grantUserPermissionsAccess", "grantTokenGeneration"] class Config: diff --git a/authress/models/client_rate_limit.py b/authress/models/client_rate_limit.py new file mode 100644 index 0000000..7a02028 --- /dev/null +++ b/authress/models/client_rate_limit.py @@ -0,0 +1,99 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Optional +try: + from pydantic.v1 import BaseModel, Field, StrictStr, conint, validator +except ImportError: + from pydantic import BaseModel, Field, StrictStr, conint, validator + +class ClientRateLimit(BaseModel): + """ + A service client rate limit. Rate Limits can be used to prevent service clients from creating too many requests to your API. They can also limit the number of requests to Authress management APIs, or contain a maximum quota for a client before it is not longer allowed to make additional requests. # noqa: E501 + """ + duration: StrictStr = Field(default=..., description="The sliding window timeslice duration for which this quota applies. This value must conform to the ISO8601 format, see the enum for allow values.") + quota: Optional[conint(strict=True, le=1000000, ge=100)] = Field(default=..., description="The maximum number of requests allowed during the duration.") + __properties = ["duration", "quota"] + + @validator('duration') + def duration_validate_enum(cls, value): + """Validates the enum""" + if value not in ('PT0S', 'P1M', 'P1D', 'PT1H', 'PT5M'): + raise ValueError("must be one of enum values ('PT0S', 'P1M', 'P1D', 'PT1H', 'PT5M')") + return value + + @validator('quota') + def quota_validate_enum(cls, value): + """Validates the enum""" + if value is None: + return value + + if value not in (100, 1000, 100000, 1000000): + raise ValueError("must be one of enum values (100, 1000, 100000, 1000000)") + return value + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> ClientRateLimit: + """Create an instance of ClientRateLimit from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + }, + exclude_none=True) + # set to None if quota (nullable) is None + # and __fields_set__ contains the field + if self.quota is None and "quota" in self.__fields_set__: + _dict['quota'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> ClientRateLimit: + """Create an instance of ClientRateLimit from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return ClientRateLimit.parse_obj(obj) + + _obj = ClientRateLimit.parse_obj({ + "duration": obj.get("duration"), + "quota": obj.get("quota") + }) + return _obj + + diff --git a/authress/models/collection_links.py b/authress/models/collection_links.py index 433eeb9..a3c3413 100644 --- a/authress/models/collection_links.py +++ b/authress/models/collection_links.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,7 +30,7 @@ class CollectionLinks(BaseModel): """ CollectionLinks """ - var_self: Optional[Link] = Field(..., alias="self") + var_self: Optional[Link] = Field(default=..., alias="self") next: Optional[Link] = None __properties = ["self", "next"] diff --git a/authress/models/connection.py b/authress/models/connection.py index 9ebe150..22b95b3 100644 --- a/authress/models/connection.py +++ b/authress/models/connection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,29 +21,38 @@ from datetime import datetime from typing import Dict, Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr, constr, validator + from pydantic.v1 import BaseModel, Field, StrictBool, StrictStr, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr, constr, validator + from pydantic import BaseModel, Field, StrictBool, StrictStr, constr, validator +from authress.models.connection_conditions import ConnectionConditions from authress.models.connection_data import ConnectionData from authress.models.connection_default_connection_properties import ConnectionDefaultConnectionProperties +from authress.models.connection_linking_configuration import ConnectionLinkingConfiguration +from authress.models.connection_user_data_configuration import ConnectionUserDataConfiguration class Connection(BaseModel): """ Connection """ type: Optional[StrictStr] = 'OAUTH2' - connection_id: Optional[constr(strict=True, max_length=64, min_length=1)] = Field(None, alias="connectionId") - authentication_url: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(None, alias="authenticationUrl") - token_url: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(None, alias="tokenUrl") - issuer_url: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(None, alias="issuerUrl") - provider_certificate: Optional[constr(strict=True, max_length=4096, min_length=1)] = Field(None, alias="providerCertificate") - client_id: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(None, alias="clientId") - client_secret: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(None, alias="clientSecret") + connection_id: Optional[constr(strict=True, max_length=64, min_length=0)] = Field(default=None, alias="connectionId") + authentication_url: Optional[constr(strict=True, max_length=256, min_length=1)] = Field(default=None, alias="authenticationUrl", description="Authorization URL of the provider (where the user logs in). For OAuth this is the authorization URL. For SAML, specify the **SSO URL** in this property.") + token_url: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, alias="tokenUrl", description="The token exchange url (where we validate the token).") + issuer_url: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, alias="issuerUrl", description="The unique identifier tied to the provider's domain used for TLS verification. In OAuth, this is the JWT **iss** property. For SAML, specify the **Entity ID** in this property.") + provider_certificate: Optional[constr(strict=True, max_length=4096, min_length=0)] = Field(default=None, alias="providerCertificate", description="The Provider's SAML public certificate which can be used to verify the signature in signed SAML assertions from the provider.") + client_id: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, alias="clientId", description="Provider's client ID used to verify the token") + client_secret_id: Optional[constr(strict=True, max_length=32, min_length=0)] = Field(default=None, alias="clientSecretId", description="Provider's client secret identifier used to identify the client secret within your account. Some provider require this property.") + client_secret: Optional[constr(strict=True, max_length=2048, min_length=0)] = Field(default=None, alias="clientSecret", description="Provider's client secret used to verify the token") + user_data_configuration: Optional[ConnectionUserDataConfiguration] = Field(default=None, alias="userDataConfiguration") data: Optional[ConnectionData] = None - default_connection_properties: Optional[ConnectionDefaultConnectionProperties] = Field(None, alias="defaultConnectionProperties") - created_time: Optional[datetime] = Field(None, alias="createdTime") - tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") - __properties = ["type", "connectionId", "authenticationUrl", "tokenUrl", "issuerUrl", "providerCertificate", "clientId", "clientSecret", "data", "defaultConnectionProperties", "createdTime", "tags"] + default_connection_properties: Optional[ConnectionDefaultConnectionProperties] = Field(default=None, alias="defaultConnectionProperties") + conditions: Optional[ConnectionConditions] = None + linking_configuration: Optional[ConnectionLinkingConfiguration] = Field(default=None, alias="linkingConfiguration") + created_time: Optional[datetime] = Field(default=None, alias="createdTime") + last_updated: Optional[datetime] = Field(default=None, alias="lastUpdated") + is_active_connection: Optional[StrictBool] = Field(default=None, alias="isActiveConnection") + tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(default=None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") + __properties = ["type", "connectionId", "authenticationUrl", "tokenUrl", "issuerUrl", "providerCertificate", "clientId", "clientSecretId", "clientSecret", "userDataConfiguration", "data", "defaultConnectionProperties", "conditions", "linkingConfiguration", "createdTime", "lastUpdated", "isActiveConnection", "tags"] @validator('type') def type_validate_enum(cls, value): @@ -51,8 +60,8 @@ def type_validate_enum(cls, value): if value is None: return value - if value not in ('OAUTH2', 'SAML2', 'WebAuthN'): - raise ValueError("must be one of enum values ('OAUTH2', 'SAML2', 'WebAuthN')") + if value not in ('OAUTH2', 'SAML2', 'WebAuthN', 'PASSWORD', 'OPENID-LEGACY'): + raise ValueError("must be one of enum values ('OAUTH2', 'SAML2', 'WebAuthN', 'PASSWORD', 'OPENID-LEGACY')") return value @validator('connection_id') @@ -88,14 +97,25 @@ def to_dict(self): _dict = self.dict(by_alias=True, exclude={ "created_time", + "last_updated", + "is_active_connection", }, exclude_none=True) + # override the default output from pydantic by calling `to_dict()` of user_data_configuration + if self.user_data_configuration: + _dict['userDataConfiguration'] = self.user_data_configuration.to_dict() # override the default output from pydantic by calling `to_dict()` of data if self.data: _dict['data'] = self.data.to_dict() # override the default output from pydantic by calling `to_dict()` of default_connection_properties if self.default_connection_properties: _dict['defaultConnectionProperties'] = self.default_connection_properties.to_dict() + # override the default output from pydantic by calling `to_dict()` of conditions + if self.conditions: + _dict['conditions'] = self.conditions.to_dict() + # override the default output from pydantic by calling `to_dict()` of linking_configuration + if self.linking_configuration: + _dict['linkingConfiguration'] = self.linking_configuration.to_dict() # set to None if connection_id (nullable) is None # and __fields_set__ contains the field if self.connection_id is None and "connection_id" in self.__fields_set__: @@ -121,11 +141,21 @@ def to_dict(self): if self.client_id is None and "client_id" in self.__fields_set__: _dict['clientId'] = None + # set to None if client_secret_id (nullable) is None + # and __fields_set__ contains the field + if self.client_secret_id is None and "client_secret_id" in self.__fields_set__: + _dict['clientSecretId'] = None + # set to None if client_secret (nullable) is None # and __fields_set__ contains the field if self.client_secret is None and "client_secret" in self.__fields_set__: _dict['clientSecret'] = None + # set to None if user_data_configuration (nullable) is None + # and __fields_set__ contains the field + if self.user_data_configuration is None and "user_data_configuration" in self.__fields_set__: + _dict['userDataConfiguration'] = None + # set to None if data (nullable) is None # and __fields_set__ contains the field if self.data is None and "data" in self.__fields_set__: @@ -136,6 +166,16 @@ def to_dict(self): if self.default_connection_properties is None and "default_connection_properties" in self.__fields_set__: _dict['defaultConnectionProperties'] = None + # set to None if conditions (nullable) is None + # and __fields_set__ contains the field + if self.conditions is None and "conditions" in self.__fields_set__: + _dict['conditions'] = None + + # set to None if linking_configuration (nullable) is None + # and __fields_set__ contains the field + if self.linking_configuration is None and "linking_configuration" in self.__fields_set__: + _dict['linkingConfiguration'] = None + # set to None if tags (nullable) is None # and __fields_set__ contains the field if self.tags is None and "tags" in self.__fields_set__: @@ -160,10 +200,16 @@ def from_dict(cls, obj: dict) -> Connection: "issuer_url": obj.get("issuerUrl"), "provider_certificate": obj.get("providerCertificate"), "client_id": obj.get("clientId"), + "client_secret_id": obj.get("clientSecretId"), "client_secret": obj.get("clientSecret"), + "user_data_configuration": ConnectionUserDataConfiguration.from_dict(obj.get("userDataConfiguration")) if obj.get("userDataConfiguration") is not None else None, "data": ConnectionData.from_dict(obj.get("data")) if obj.get("data") is not None else None, "default_connection_properties": ConnectionDefaultConnectionProperties.from_dict(obj.get("defaultConnectionProperties")) if obj.get("defaultConnectionProperties") is not None else None, + "conditions": ConnectionConditions.from_dict(obj.get("conditions")) if obj.get("conditions") is not None else None, + "linking_configuration": ConnectionLinkingConfiguration.from_dict(obj.get("linkingConfiguration")) if obj.get("linkingConfiguration") is not None else None, "created_time": obj.get("createdTime"), + "last_updated": obj.get("lastUpdated"), + "is_active_connection": obj.get("isActiveConnection"), "tags": obj.get("tags") }) return _obj diff --git a/authress/models/connection_collection.py b/authress/models/connection_collection.py index 8cf598b..8e67a3d 100644 --- a/authress/models/connection_collection.py +++ b/authress/models/connection_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class ConnectionCollection(BaseModel): """ - A collection of connections. + A collection of connections. # noqa: E501 """ connections: conlist(Connection) = Field(...) pagination: Optional[Pagination] = None diff --git a/authress/models/metadata_object.py b/authress/models/connection_conditions.py similarity index 52% rename from authress/models/metadata_object.py rename to authress/models/connection_conditions.py index 7e04870..876cbec 100644 --- a/authress/models/metadata_object.py +++ b/authress/models/connection_conditions.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -19,21 +19,18 @@ import json -from typing import Any, Dict, Optional +from typing import Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, StrictBool except ImportError: - from pydantic import BaseModel, Field, StrictStr -from authress.models.metadata_object_account import MetadataObjectAccount + from pydantic import BaseModel, Field, StrictBool -class MetadataObject(BaseModel): +class ConnectionConditions(BaseModel): """ - Metadata and additional properties relevant. + Conditions are custom restrictions on connections that prevent the connection from being used when it should not be, or limits its usability for increased security. # noqa: E501 """ - account: Optional[MetadataObjectAccount] = None - user_id: StrictStr = Field(..., alias="userId") - metadata: Optional[Dict[str, Any]] = Field(..., description="A JSON object limited to 10KB. The owner identified by the sub will always have access to read and update this data. Service clients may have access if the related property on the client is set. Access is restricted to authorized users.") - __properties = ["account", "userId", "metadata"] + require_business_account: Optional[StrictBool] = Field(default=False, alias="requireBusinessAccount", description="Require the user logging in with this connect to be using a business account. When possible Authress will block user login and request that they select a different account. Enabling this may prevent some users from being able to sign up with this identity connection.") + __properties = ["requireBusinessAccount"] class Config: """Pydantic configuration""" @@ -49,8 +46,8 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> MetadataObject: - """Create an instance of MetadataObject from a JSON string""" + def from_json(cls, json_str: str) -> ConnectionConditions: + """Create an instance of ConnectionConditions from a JSON string""" return cls.from_dict(json.loads(json_str)) def to_dict(self): @@ -59,32 +56,24 @@ def to_dict(self): exclude={ }, exclude_none=True) - # override the default output from pydantic by calling `to_dict()` of account - if self.account: - _dict['account'] = self.account.to_dict() - # override the default output from pydantic by calling `to_dict()` of user_id - if self.user_id: - _dict['userId'] = self.user_id.to_dict() - # set to None if metadata (nullable) is None + # set to None if require_business_account (nullable) is None # and __fields_set__ contains the field - if self.metadata is None and "metadata" in self.__fields_set__: - _dict['metadata'] = None + if self.require_business_account is None and "require_business_account" in self.__fields_set__: + _dict['requireBusinessAccount'] = None return _dict @classmethod - def from_dict(cls, obj: dict) -> MetadataObject: - """Create an instance of MetadataObject from a dict""" + def from_dict(cls, obj: dict) -> ConnectionConditions: + """Create an instance of ConnectionConditions from a dict""" if obj is None: return None if not isinstance(obj, dict): - return MetadataObject.parse_obj(obj) + return ConnectionConditions.parse_obj(obj) - _obj = MetadataObject.parse_obj({ - "account": MetadataObjectAccount.from_dict(obj.get("account")) if obj.get("account") is not None else None, - "user_id": obj.get("userId"), - "metadata": obj.get("metadata") + _obj = ConnectionConditions.parse_obj({ + "require_business_account": obj.get("requireBusinessAccount") if obj.get("requireBusinessAccount") is not None else False }) return _obj diff --git a/authress/models/connection_data.py b/authress/models/connection_data.py index 0456e91..5d6de95 100644 --- a/authress/models/connection_data.py +++ b/authress/models/connection_data.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,18 +21,32 @@ from typing import Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr, constr, validator + from pydantic.v1 import BaseModel, Field, StrictBool, StrictStr, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr, constr, validator + from pydantic import BaseModel, Field, StrictBool, StrictStr, constr, validator class ConnectionData(BaseModel): """ ConnectionData """ - tenant_id: Optional[constr(strict=True, max_length=64, min_length=0)] = Field(None, alias="tenantId") - name: Optional[constr(strict=True, max_length=64, min_length=1)] = None - supported_content_type: Optional[StrictStr] = Field('application/json', alias="supportedContentType") - __properties = ["tenantId", "name", "supportedContentType"] + tenant_id: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, alias="tenantId") + developer_account_id: Optional[constr(strict=True, max_length=32, min_length=0)] = Field(default=None, alias="developerAccountId", description="The Developer Account ID associated with the credentials. This is necessary for some providers, such as Apple Login.") + name: Optional[constr(strict=True, max_length=64, min_length=0)] = Field(default=None, description="The name of this connection when displayed in the Authress management portal") + supported_content_type: Optional[StrictStr] = Field(default='application/json', alias="supportedContentType", description="URL encode OAuth token parameters - Some authentication APIs don't support JSON, in these cases enable the url encoded form data parameters.") + oidc_user_endpoint_url: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, alias="oidcUserEndpointUrl", description="By default, the **sub** claim of the JWT is used to identify the user from this provider. However, not all providers are OpenID compliant. Here you can provide an optional user data endpoint to fetch additional user profile information and an expression to identify a new user ID from available properties.") + user_id_expression: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default='{sub}', alias="userIdExpression", description="By default, the **sub** claim of the JWT is used to identify the user from this provider. However, not all providers are OpenID compliant. Here you can provide an optional user expression to identify a new user ID from available properties found from the oidcUserEndpointUrl. (The default is **{sub}**, any claims may be used.)") + trust_identity_user_id: Optional[StrictBool] = Field(default=False, alias="trustIdentityUserId", description="Authress generates unique user IDs for every user, however if you trust your identity provider to handle unique ID generate across **ALL customers**, then it is safe to reuse the user ID from the provider.") + __properties = ["tenantId", "developerAccountId", "name", "supportedContentType", "oidcUserEndpointUrl", "userIdExpression", "trustIdentityUserId"] + + @validator('tenant_id') + def tenant_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if value is None: + return value + + if not re.match(r"^[a-zA-Z0-9-_.:]*$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-_.:]*$/") + return value @validator('supported_content_type') def supported_content_type_validate_enum(cls, value): @@ -68,14 +82,41 @@ def to_dict(self): exclude={ }, exclude_none=True) - # override the default output from pydantic by calling `to_dict()` of tenant_id - if self.tenant_id: - _dict['tenantId'] = self.tenant_id.to_dict() + # set to None if tenant_id (nullable) is None + # and __fields_set__ contains the field + if self.tenant_id is None and "tenant_id" in self.__fields_set__: + _dict['tenantId'] = None + + # set to None if developer_account_id (nullable) is None + # and __fields_set__ contains the field + if self.developer_account_id is None and "developer_account_id" in self.__fields_set__: + _dict['developerAccountId'] = None + # set to None if name (nullable) is None # and __fields_set__ contains the field if self.name is None and "name" in self.__fields_set__: _dict['name'] = None + # set to None if supported_content_type (nullable) is None + # and __fields_set__ contains the field + if self.supported_content_type is None and "supported_content_type" in self.__fields_set__: + _dict['supportedContentType'] = None + + # set to None if oidc_user_endpoint_url (nullable) is None + # and __fields_set__ contains the field + if self.oidc_user_endpoint_url is None and "oidc_user_endpoint_url" in self.__fields_set__: + _dict['oidcUserEndpointUrl'] = None + + # set to None if user_id_expression (nullable) is None + # and __fields_set__ contains the field + if self.user_id_expression is None and "user_id_expression" in self.__fields_set__: + _dict['userIdExpression'] = None + + # set to None if trust_identity_user_id (nullable) is None + # and __fields_set__ contains the field + if self.trust_identity_user_id is None and "trust_identity_user_id" in self.__fields_set__: + _dict['trustIdentityUserId'] = None + return _dict @classmethod @@ -89,8 +130,12 @@ def from_dict(cls, obj: dict) -> ConnectionData: _obj = ConnectionData.parse_obj({ "tenant_id": obj.get("tenantId"), + "developer_account_id": obj.get("developerAccountId"), "name": obj.get("name"), - "supported_content_type": obj.get("supportedContentType") if obj.get("supportedContentType") is not None else 'application/json' + "supported_content_type": obj.get("supportedContentType") if obj.get("supportedContentType") is not None else 'application/json', + "oidc_user_endpoint_url": obj.get("oidcUserEndpointUrl"), + "user_id_expression": obj.get("userIdExpression") if obj.get("userIdExpression") is not None else '{sub}', + "trust_identity_user_id": obj.get("trustIdentityUserId") if obj.get("trustIdentityUserId") is not None else False }) return _obj diff --git a/authress/models/connection_default_connection_properties.py b/authress/models/connection_default_connection_properties.py index 73800b7..4f762c7 100644 --- a/authress/models/connection_default_connection_properties.py +++ b/authress/models/connection_default_connection_properties.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,15 +21,15 @@ from typing import Any, Dict, Optional try: - from pydantic.v1 import BaseModel, constr + from pydantic.v1 import BaseModel, Field, constr except ImportError: - from pydantic import BaseModel, constr + from pydantic import BaseModel, Field, constr class ConnectionDefaultConnectionProperties(BaseModel): """ ConnectionDefaultConnectionProperties """ - scope: Optional[constr(strict=True, max_length=128)] = 'profile email openid' + scope: Optional[constr(strict=True, max_length=384)] = Field(default='profile email openid', description="Default OAuth scopes to use for every request (leave blank to remove scopes).") additional_properties: Dict[str, Any] = {} __properties = ["scope"] diff --git a/authress/models/connection_linking_configuration.py b/authress/models/connection_linking_configuration.py new file mode 100644 index 0000000..16c7970 --- /dev/null +++ b/authress/models/connection_linking_configuration.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Optional +try: + from pydantic.v1 import BaseModel, Field, StrictStr, validator +except ImportError: + from pydantic import BaseModel, Field, StrictStr, validator + +class ConnectionLinkingConfiguration(BaseModel): + """ + Linking configuration enables users to connect identities from different connections together, so that they can log in with either connection. # noqa: E501 + """ + type: Optional[StrictStr] = Field(default=None, description="Specify the type of linking supported by this connection. The default configuration is DISABLED, meaning that users cannot link their identity from one connection to another connection. Both connections must allow for linking for a link to be successful. By default linking is disabled because it comes with security implications, users can potentially use linking through malicious connections to steal identities from other users.
  • EXPLICIT - Users can use the linking API to link accounts.
  • AUTOMATIC - When a user signs up with a new account, if the verified email address matches an existing account, the two accounts will be automatically linked.
  • Set to null or leave unspecified to disable identity linking.
") + __properties = ["type"] + + @validator('type') + def type_validate_enum(cls, value): + """Validates the enum""" + if value is None: + return value + + if value not in ('null', 'EXPLICIT', 'AUTOMATIC'): + raise ValueError("must be one of enum values ('null', 'EXPLICIT', 'AUTOMATIC')") + return value + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> ConnectionLinkingConfiguration: + """Create an instance of ConnectionLinkingConfiguration from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + }, + exclude_none=True) + # set to None if type (nullable) is None + # and __fields_set__ contains the field + if self.type is None and "type" in self.__fields_set__: + _dict['type'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> ConnectionLinkingConfiguration: + """Create an instance of ConnectionLinkingConfiguration from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return ConnectionLinkingConfiguration.parse_obj(obj) + + _obj = ConnectionLinkingConfiguration.parse_obj({ + "type": obj.get("type") + }) + return _obj + + diff --git a/authress/models/connection_user_data_configuration.py b/authress/models/connection_user_data_configuration.py new file mode 100644 index 0000000..42c9dc8 --- /dev/null +++ b/authress/models/connection_user_data_configuration.py @@ -0,0 +1,90 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Optional +try: + from pydantic.v1 import BaseModel, Field, StrictStr, validator +except ImportError: + from pydantic import BaseModel, Field, StrictStr, validator + +class ConnectionUserDataConfiguration(BaseModel): + """ + ConnectionUserDataConfiguration + """ + location: Optional[StrictStr] = Field(default=None, description="User data residency - The data residency to store the user specific data in. To ensure high performance and reliability, set to **null**, or to store the user's data only in one specific region, set the region here. Specifying the region reduces reliability, durability, and performance at the benefit of controlling the locality. ") + __properties = ["location"] + + @validator('location') + def location_validate_enum(cls, value): + """Validates the enum""" + if value is None: + return value + + if value not in ('ZAF', 'HKG', 'IND', 'JPN', 'KOR', 'SGP', 'AUS', 'IDN', 'CAN', 'DEU', 'CHE', 'SWE', 'ITA', 'IRL', 'GBR', 'FRA', 'ISR', 'BHR', 'ARE', 'BRA', 'USA'): + raise ValueError("must be one of enum values ('ZAF', 'HKG', 'IND', 'JPN', 'KOR', 'SGP', 'AUS', 'IDN', 'CAN', 'DEU', 'CHE', 'SWE', 'ITA', 'IRL', 'GBR', 'FRA', 'ISR', 'BHR', 'ARE', 'BRA', 'USA')") + return value + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> ConnectionUserDataConfiguration: + """Create an instance of ConnectionUserDataConfiguration from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + }, + exclude_none=True) + # set to None if location (nullable) is None + # and __fields_set__ contains the field + if self.location is None and "location" in self.__fields_set__: + _dict['location'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> ConnectionUserDataConfiguration: + """Create an instance of ConnectionUserDataConfiguration from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return ConnectionUserDataConfiguration.parse_obj(obj) + + _obj = ConnectionUserDataConfiguration.parse_obj({ + "location": obj.get("location") + }) + return _obj + + diff --git a/authress/models/extension.py b/authress/models/extension.py index 26ca023..ebc5e44 100644 --- a/authress/models/extension.py +++ b/authress/models/extension.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -31,12 +31,12 @@ class Extension(BaseModel): """ Extension """ - extension_id: constr(strict=True, max_length=64, min_length=1) = Field(..., alias="extensionId") - name: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(None, description="The name of the extension. This name is visible in the Authress management portal") - created_time: datetime = Field(..., alias="createdTime") + extension_id: constr(strict=True, max_length=64, min_length=1) = Field(default=..., alias="extensionId") + name: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, description="The name of the extension. This name is visible in the Authress management portal") + created_time: datetime = Field(default=..., alias="createdTime") application: Optional[ExtensionApplication] = None - client: ExtensionClient = Field(...) - tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") + client: Optional[ExtensionClient] = None + tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(default=None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") __properties = ["extensionId", "name", "createdTime", "application", "client", "tags"] class Config: diff --git a/authress/models/extension_application.py b/authress/models/extension_application.py index a8cca6e..9de0f57 100644 --- a/authress/models/extension_application.py +++ b/authress/models/extension_application.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -28,11 +28,11 @@ class ExtensionApplication(BaseModel): """ - The extension's application configuration. The application contains the necessary information for users to log in to the extension. + The extension's application configuration. The application contains the necessary information for users to log in to the extension. # noqa: E501 """ - application_id: StrictStr = Field(..., alias="applicationId", description="The unique ID of the application.") - redirect_urls: Optional[conlist(constr(strict=True, max_length=1024))] = Field(None, alias="redirectUrls") - links: Links = Field(...) + application_id: StrictStr = Field(default=..., alias="applicationId", description="The unique ID of the application.") + redirect_urls: Optional[conlist(constr(strict=True, max_length=1024), max_items=100, min_items=0)] = Field(default=None, alias="redirectUrls") + links: Optional[Links] = None __properties = ["applicationId", "redirectUrls", "links"] class Config: diff --git a/authress/models/extension_client.py b/authress/models/extension_client.py index 00d9b2e..9f534b2 100644 --- a/authress/models/extension_client.py +++ b/authress/models/extension_client.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -19,20 +19,22 @@ import json - +from typing import List, Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, StrictStr, conlist except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, StrictStr, conlist +from authress.models.client_rate_limit import ClientRateLimit from authress.models.links import Links class ExtensionClient(BaseModel): """ - The extension's client configuration. + The extension's client configuration. # noqa: E501 """ - client_id: StrictStr = Field(..., alias="clientId", description="The unique ID of the client.") - links: Links = Field(...) - __properties = ["clientId", "links"] + client_id: StrictStr = Field(default=..., alias="clientId", description="The unique ID of the client.") + rate_limits: Optional[conlist(ClientRateLimit, max_items=1, min_items=0)] = Field(default=None, alias="rateLimits", description="A list of the service client rate limits. Rate Limits can be used to prevent service clients from creating too many requests to your API. They can also limit the number of requests to Authress management APIs, or contain a maximum quota for a client before it is not longer allowed to make additional requests.") + links: Optional[Links] = None + __properties = ["clientId", "rateLimits", "links"] class Config: """Pydantic configuration""" @@ -59,9 +61,21 @@ def to_dict(self): "client_id", }, exclude_none=True) + # override the default output from pydantic by calling `to_dict()` of each item in rate_limits (list) + _items = [] + if self.rate_limits: + for _item in self.rate_limits: + if _item: + _items.append(_item.to_dict()) + _dict['rateLimits'] = _items # override the default output from pydantic by calling `to_dict()` of links if self.links: _dict['links'] = self.links.to_dict() + # set to None if rate_limits (nullable) is None + # and __fields_set__ contains the field + if self.rate_limits is None and "rate_limits" in self.__fields_set__: + _dict['rateLimits'] = None + return _dict @classmethod @@ -75,6 +89,7 @@ def from_dict(cls, obj: dict) -> ExtensionClient: _obj = ExtensionClient.parse_obj({ "client_id": obj.get("clientId"), + "rate_limits": [ClientRateLimit.from_dict(_item) for _item in obj.get("rateLimits")] if obj.get("rateLimits") is not None else None, "links": Links.from_dict(obj.get("links")) if obj.get("links") is not None else None }) return _obj diff --git a/authress/models/extension_collection.py b/authress/models/extension_collection.py index b973083..d04e4ea 100644 --- a/authress/models/extension_collection.py +++ b/authress/models/extension_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class ExtensionCollection(BaseModel): """ - A collection of platform extensions. + A collection of platform extensions. # noqa: E501 """ extensions: conlist(Extension) = Field(...) pagination: Optional[Pagination] = None diff --git a/authress/models/group.py b/authress/models/group.py index 9bcb7e6..7e2c100 100644 --- a/authress/models/group.py +++ b/authress/models/group.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,15 +29,15 @@ class Group(BaseModel): """ - A group of users, which can be added to access records. + A group of users, which can be added to access records. # noqa: E501 """ - group_id: Optional[constr(strict=True, max_length=64, min_length=1)] = Field(None, alias="groupId", description="Unique identifier for the groupId, can be specified on record creation. Must begin with grp_.") - name: constr(strict=True, max_length=128, min_length=1) = Field(..., description="A helpful name for this record") - last_updated: Optional[datetime] = Field(None, alias="lastUpdated", description="The expected last time the group was updated") - users: conlist(User) = Field(..., description="The list of users in this group") - admins: conlist(User) = Field(..., description="The list of admins that can edit this record even if they do not have global record edit permissions.") - links: Optional[AccountLinks] = Field(...) - tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") + group_id: Optional[constr(strict=True, max_length=64, min_length=1)] = Field(default=None, alias="groupId", description="Unique identifier for the groupId, can be specified on record creation. Must begin with grp_.") + name: constr(strict=True, max_length=128, min_length=1) = Field(default=..., description="A helpful name for this record") + last_updated: Optional[datetime] = Field(default=None, alias="lastUpdated", description="The expected last time the group was updated") + users: conlist(User, max_items=100, min_items=0) = Field(default=..., description="The list of users in this group. A group can have a maximum of 100 users.") + admins: conlist(User, max_items=100, min_items=0) = Field(default=..., description="The list of admins that can edit this record even if they do not have global record edit permissions.") + links: Optional[AccountLinks] = None + tags: Optional[Dict[str, constr(strict=True, max_length=128)]] = Field(default=None, description="The tags associated with this resource, this property is an map. { key1: value1, key2: value2 }") __properties = ["groupId", "name", "lastUpdated", "users", "admins", "links", "tags"] @validator('group_id') @@ -46,8 +46,8 @@ def group_id_validate_regular_expression(cls, value): if value is None: return value - if not re.match(r"^grp_[a-zA-Z0-9-_]+$", value): - raise ValueError(r"must validate the regular expression /^grp_[a-zA-Z0-9-_]+$/") + if not re.match(r"^[a-zA-Z0-9-_]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-_]+$/") return value class Config: diff --git a/authress/models/group_collection.py b/authress/models/group_collection.py index c1f1b34..b5ab53c 100644 --- a/authress/models/group_collection.py +++ b/authress/models/group_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,9 +30,9 @@ class GroupCollection(BaseModel): """ - A collection of groups + A collection of groups # noqa: E501 """ - groups: conlist(Group) = Field(..., description="A list of groups") + groups: conlist(Group) = Field(default=..., description="A list of groups") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["groups", "pagination", "links"] diff --git a/authress/models/identity.py b/authress/models/identity.py index 4ff7e8c..b13c62b 100644 --- a/authress/models/identity.py +++ b/authress/models/identity.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -19,19 +19,20 @@ import json - +from typing import Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, StrictStr, constr except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, StrictStr, constr class Identity(BaseModel): """ - The identifying information which uniquely links a JWT OIDC token to an identity provider + The identifying information which uniquely links a JWT OIDC token to an identity provider # noqa: E501 """ - issuer: StrictStr = Field(..., description="The issuer of the JWT token. This can be any OIDC compliant provider.") - audience: StrictStr = Field(..., description="The audience of the JWT token. This can be either an audience for your entire app, or one particular audience for it. If there is more than one audience, multiple identities can be created.") - __properties = ["issuer", "audience"] + issuer: StrictStr = Field(default=..., description="The issuer of the JWT token. This can be any OIDC compliant provider.") + audience: StrictStr = Field(default=..., description="The audience of the JWT token. This can be either an audience for your entire app, or one particular audience for it. If there is more than one audience, multiple identities can be created.") + user_id_expression: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default='{sub}', alias="userIdExpression", description="By default, the **sub** claim of the JWT is used to identify the user from this provider. To use an alternate claim or a compound userId resolution, specify an expression. The resolved userId must be the same one that is later used in Authress access records.") + __properties = ["issuer", "audience", "userIdExpression"] class Config: """Pydantic configuration""" @@ -57,6 +58,11 @@ def to_dict(self): exclude={ }, exclude_none=True) + # set to None if user_id_expression (nullable) is None + # and __fields_set__ contains the field + if self.user_id_expression is None and "user_id_expression" in self.__fields_set__: + _dict['userIdExpression'] = None + return _dict @classmethod @@ -70,7 +76,8 @@ def from_dict(cls, obj: dict) -> Identity: _obj = Identity.parse_obj({ "issuer": obj.get("issuer"), - "audience": obj.get("audience") + "audience": obj.get("audience"), + "user_id_expression": obj.get("userIdExpression") if obj.get("userIdExpression") is not None else '{sub}' }) return _obj diff --git a/authress/models/identity_collection.py b/authress/models/identity_collection.py index 26740b7..b39ca7c 100644 --- a/authress/models/identity_collection.py +++ b/authress/models/identity_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations diff --git a/authress/models/identity_request.py b/authress/models/identity_request.py index ff9c8a5..cfc19e5 100644 --- a/authress/models/identity_request.py +++ b/authress/models/identity_request.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,17 +21,18 @@ from typing import Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, StrictStr, constr except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, StrictStr, constr class IdentityRequest(BaseModel): """ - Request to link an identity provider's audience and your app's audience with Authress. + Request to link an identity provider's audience and your app's audience with Authress. # noqa: E501 """ - jwt: Optional[StrictStr] = Field(None, description="A valid JWT OIDC compliant token which will still pass authentication requests to the identity provider. Must contain a unique audience and issuer.") - issuer: Optional[StrictStr] = Field(None, description="The issuer of the OAuth OIDC provider's JWTs. This value should match the `iss` claim in the provided tokens exactly.") - preferred_audience: Optional[StrictStr] = Field('*', alias="preferredAudience", description="If the `jwt` token contains more than one valid audience, then the single audience that should associated with Authress. If more than one audience is preferred, repeat this call with each one.") + jwt: Optional[StrictStr] = Field(default=None, description="A valid JWT OIDC compliant token which will still pass authentication requests to the identity provider. Must contain a unique audience and issuer.") + issuer: Optional[StrictStr] = Field(default=None, description="The issuer of the OAuth OIDC provider's JWTs. This value should match the `iss` claim in the provided tokens exactly.") + preferred_audience: Optional[StrictStr] = Field(default='*', alias="preferredAudience", description="If the `jwt` token contains more than one valid audience, then the single audience that should associated with Authress. If more than one audience is preferred, repeat this call with each one.") + user_id_expression: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default='{sub}', alias="userIdExpression", description="By default, the **sub** claim of the JWT is used to identify the user from this provider. To use an alternate claim or a compound userId resolution, specify an expression. The resolved userId must be the same one that is later used in Authress access records.") __properties = [] class Config: diff --git a/authress/models/invite.py b/authress/models/invite.py index aa15241..4ca70e7 100644 --- a/authress/models/invite.py +++ b/authress/models/invite.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,22 +21,32 @@ from typing import List, Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr, conlist, constr + from pydantic.v1 import BaseModel, Field, StrictStr, conlist, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr, conlist, constr + from pydantic import BaseModel, Field, StrictStr, conlist, constr, validator from authress.models.account_links import AccountLinks -from authress.models.statement import Statement +from authress.models.invite_statement import InviteStatement class Invite(BaseModel): """ - The user invite used to invite users to your application or to Authress as an admin. + The user invite used to invite users to your application or to Authress as an admin. # noqa: E501 """ - invite_id: StrictStr = Field(..., alias="inviteId", description="The unique identifier for the invite. Use this ID to accept the invite. This parameter is ignored during invite creation.") - tenant_id: Optional[constr(strict=True, max_length=64, min_length=0)] = Field(None, alias="tenantId") - statements: conlist(Statement) = Field(..., description="A list of statements which match roles to resources. The invited user will all statements apply to them when the invite is accepted.") - links: Optional[AccountLinks] = Field(...) + invite_id: StrictStr = Field(default=..., alias="inviteId", description="The unique identifier for the invite. Use this ID to accept the invite. This parameter is ignored during invite creation.") + tenant_id: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, alias="tenantId") + statements: conlist(InviteStatement, max_items=100, min_items=0) = Field(default=..., description="A list of statements which match roles to resources. The invited user will all statements apply to them when the invite is accepted.") + links: Optional[AccountLinks] = None __properties = ["inviteId", "tenantId", "statements", "links"] + @validator('tenant_id') + def tenant_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if value is None: + return value + + if not re.match(r"^[a-zA-Z0-9-_.:]*$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-_.:]*$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True @@ -62,9 +72,6 @@ def to_dict(self): "invite_id", }, exclude_none=True) - # override the default output from pydantic by calling `to_dict()` of tenant_id - if self.tenant_id: - _dict['tenantId'] = self.tenant_id.to_dict() # override the default output from pydantic by calling `to_dict()` of each item in statements (list) _items = [] if self.statements: @@ -75,6 +82,11 @@ def to_dict(self): # override the default output from pydantic by calling `to_dict()` of links if self.links: _dict['links'] = self.links.to_dict() + # set to None if tenant_id (nullable) is None + # and __fields_set__ contains the field + if self.tenant_id is None and "tenant_id" in self.__fields_set__: + _dict['tenantId'] = None + return _dict @classmethod @@ -89,7 +101,7 @@ def from_dict(cls, obj: dict) -> Invite: _obj = Invite.parse_obj({ "invite_id": obj.get("inviteId"), "tenant_id": obj.get("tenantId"), - "statements": [Statement.from_dict(_item) for _item in obj.get("statements")] if obj.get("statements") is not None else None, + "statements": [InviteStatement.from_dict(_item) for _item in obj.get("statements")] if obj.get("statements") is not None else None, "links": AccountLinks.from_dict(obj.get("links")) if obj.get("links") is not None else None }) return _obj diff --git a/authress/models/invite_statement.py b/authress/models/invite_statement.py new file mode 100644 index 0000000..a41be70 --- /dev/null +++ b/authress/models/invite_statement.py @@ -0,0 +1,99 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import List, Optional +try: + from pydantic.v1 import BaseModel, Field, StrictStr, conlist, constr, validator +except ImportError: + from pydantic import BaseModel, Field, StrictStr, conlist, constr, validator +from authress.models.resource import Resource + +class InviteStatement(BaseModel): + """ + InviteStatement + """ + roles: conlist(constr(strict=True, max_length=64, min_length=1), max_items=100, min_items=1) = Field(...) + resources: conlist(Resource, max_items=100, min_items=1) = Field(...) + users: Optional[conlist(StrictStr, max_items=0)] = None + groups: Optional[conlist(StrictStr, max_items=0)] = None + __properties = ["roles", "resources", "users", "groups"] + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> InviteStatement: + """Create an instance of InviteStatement from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + }, + exclude_none=True) + # override the default output from pydantic by calling `to_dict()` of each item in resources (list) + _items = [] + if self.resources: + for _item in self.resources: + if _item: + _items.append(_item.to_dict()) + _dict['resources'] = _items + # set to None if users (nullable) is None + # and __fields_set__ contains the field + if self.users is None and "users" in self.__fields_set__: + _dict['users'] = None + + # set to None if groups (nullable) is None + # and __fields_set__ contains the field + if self.groups is None and "groups" in self.__fields_set__: + _dict['groups'] = None + + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> InviteStatement: + """Create an instance of InviteStatement from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return InviteStatement.parse_obj(obj) + + _obj = InviteStatement.parse_obj({ + "roles": obj.get("roles"), + "resources": [Resource.from_dict(_item) for _item in obj.get("resources")] if obj.get("resources") is not None else None, + "users": obj.get("users"), + "groups": obj.get("groups") + }) + return _obj + + diff --git a/authress/models/link.py b/authress/models/link.py index 5af7e16..54f0e53 100644 --- a/authress/models/link.py +++ b/authress/models/link.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,10 +27,10 @@ class Link(BaseModel): """ - A url linking object that complies to application/links+json RFC. Either is an IANA approved link relation or has a custom rel specified. + A url linking object that complies to application/links+json RFC. Either is an IANA approved link relation or has a custom rel specified. # noqa: E501 """ - href: StrictStr = Field(..., description="The absolute url pointing to the reference resource.") - rel: Optional[StrictStr] = Field(None, description="Optional property indicating the type of link if it is not a default IANA approved global link relation.") + href: StrictStr = Field(default=..., description="The absolute url pointing to the reference resource.") + rel: Optional[StrictStr] = Field(default=None, description="Optional property indicating the type of link if it is not a default IANA approved global link relation.") __properties = ["href", "rel"] class Config: diff --git a/authress/models/linked_group.py b/authress/models/linked_group.py index 9aa6f0c..f446b7f 100644 --- a/authress/models/linked_group.py +++ b/authress/models/linked_group.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,17 +21,24 @@ try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, constr, validator class LinkedGroup(BaseModel): """ - The referenced group + The referenced group # noqa: E501 """ - group_id: StrictStr = Field(..., alias="groupId") + group_id: constr(strict=True, max_length=64, min_length=1) = Field(default=..., alias="groupId", description="Unique identifier for the groupId, can be specified on record creation. Must begin with grp_.") __properties = ["groupId"] + @validator('group_id') + def group_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9-_]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-_]+$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True @@ -56,9 +63,6 @@ def to_dict(self): exclude={ }, exclude_none=True) - # override the default output from pydantic by calling `to_dict()` of group_id - if self.group_id: - _dict['groupId'] = self.group_id.to_dict() return _dict @classmethod diff --git a/authress/models/links.py b/authress/models/links.py index 857c4f5..d633f57 100644 --- a/authress/models/links.py +++ b/authress/models/links.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,7 +30,7 @@ class Links(BaseModel): """ Links """ - var_self: Optional[Link] = Field(..., alias="self") + var_self: Optional[Link] = Field(default=..., alias="self") __properties = ["self"] class Config: diff --git a/authress/models/o_auth_authorize_response.py b/authress/models/o_auth_authorize_response.py index f647ba8..af41d11 100644 --- a/authress/models/o_auth_authorize_response.py +++ b/authress/models/o_auth_authorize_response.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class OAuthAuthorizeResponse(BaseModel): """ OAuthAuthorizeResponse """ - code: StrictStr = Field(..., description="The authorization code to be used with the /tokens endpoint to retrieve an access_token.") + code: StrictStr = Field(default=..., description="The authorization code to be used with the /tokens endpoint to retrieve an access_token.") __properties = ["code"] class Config: diff --git a/authress/models/o_auth_token_request.py b/authress/models/o_auth_token_request.py index 2302423..bd86ac7 100644 --- a/authress/models/o_auth_token_request.py +++ b/authress/models/o_auth_token_request.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,15 +27,15 @@ class OAuthTokenRequest(BaseModel): """ - The OAuth 2.1 token request that follows [RFC 6749](https://www.rfc-editor.org/rfc/rfc6749). The properties in the request must be snake_case to follow the standard. + The OAuth 2.1 token request that follows [RFC 6749](https://www.rfc-editor.org/rfc/rfc6749). The properties in the request must be snake_case to follow the standard. # noqa: E501 """ - client_id: StrictStr = Field(..., description="The client identifier to constrain the token to.") - client_secret: Optional[StrictStr] = Field(None, description="The secret associated with the client that authorizes the generation of token it's behalf. (Either the `client_secret` or the `code_verifier` is required)") - code_verifier: Optional[StrictStr] = Field(None, description="The code verifier is the the value used in the generation of the OAuth authorization request `code_challenge` property. (Either the `client_secret` or the `code_verifier` is required)") - grant_type: Optional[StrictStr] = Field(None, description="A suggestion to the token generation which type of credentials are being provided.") - username: Optional[StrictStr] = Field(None, description="When using the user password grant_type, specify the username. Authress recommends this should always be an email address.") - password: Optional[StrictStr] = Field(None, description="When using the user password grant_type, specify the user's password.") - type: Optional[StrictStr] = Field(None, description="Enables additional configuration of the grant_type. In the case of user password grant_type, set this to **signup**, to enable the creation of users. Set this to **update**, force update the password associated with the user.") + client_id: StrictStr = Field(default=..., description="The client identifier to constrain the token to.") + client_secret: Optional[StrictStr] = Field(default=None, description="The secret associated with the client that authorizes the generation of token it's behalf. (Either the `client_secret` or the `code_verifier` is required)") + code_verifier: Optional[StrictStr] = Field(default=None, description="The code verifier is the the value used in the generation of the OAuth authorization request `code_challenge` property. (Either the `client_secret` or the `code_verifier` is required)") + grant_type: Optional[StrictStr] = Field(default=None, description="A suggestion to the token generation which type of credentials are being provided.") + username: Optional[StrictStr] = Field(default=None, description="When using the user password grant_type, specify the username. Authress recommends this should always be an email address.") + password: Optional[StrictStr] = Field(default=None, description="When using the user password grant_type, specify the user's password.") + type: Optional[StrictStr] = Field(default=None, description="Enables additional configuration of the grant_type. In the case of user password grant_type, set this to **signup**, to enable the creation of users. Set this to **update**, force update the password associated with the user.") __properties = ["client_id", "client_secret", "code_verifier", "grant_type", "username", "password", "type"] @validator('grant_type') diff --git a/authress/models/o_auth_token_response.py b/authress/models/o_auth_token_response.py index 6f5f979..89d54c3 100644 --- a/authress/models/o_auth_token_response.py +++ b/authress/models/o_auth_token_response.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class OAuthTokenResponse(BaseModel): """ OAuthTokenResponse """ - access_token: StrictStr = Field(..., description="An expiring access token that can be used to access either Authress or any platform service.") + access_token: StrictStr = Field(default=..., description="An expiring access token that can be used to access either Authress or any platform service.") __properties = ["access_token"] class Config: diff --git a/authress/models/pagination.py b/authress/models/pagination.py index c9f7dc7..f95c330 100644 --- a/authress/models/pagination.py +++ b/authress/models/pagination.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -28,7 +28,7 @@ class Pagination(BaseModel): """ - Details containing how to pagination through the collection. Consists of an optional *next* property that may contain a cursor. Pagination is mutable and the list can change between requests. + Details containing how to pagination through the collection. Consists of an optional *next* property that may contain a cursor. Pagination is mutable and the list can change between requests. # noqa: E501 """ next: Optional[PaginationNext] = None __properties = ["next"] diff --git a/authress/models/pagination_next.py b/authress/models/pagination_next.py index 9a38664..0f0c82d 100644 --- a/authress/models/pagination_next.py +++ b/authress/models/pagination_next.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,7 +27,7 @@ class PaginationNext(BaseModel): """ - A reference to the next page in the collection, pass the cursor as a query parameter in the subsequent request to get the next page. + A reference to the next page in the collection, pass the cursor as a query parameter in the subsequent request to get the next page. # noqa: E501 """ cursor: StrictStr = Field(...) __properties = ["cursor"] diff --git a/authress/models/permission_collection.py b/authress/models/permission_collection.py index e84fcbb..b490418 100644 --- a/authress/models/permission_collection.py +++ b/authress/models/permission_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,21 +21,28 @@ from typing import List, Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr, conlist + from pydantic.v1 import BaseModel, Field, conlist, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr, conlist + from pydantic import BaseModel, Field, conlist, constr, validator from authress.models.permission_collection_account import PermissionCollectionAccount from authress.models.permission_object import PermissionObject class PermissionCollection(BaseModel): """ - A collect of permissions that the user has to a resource. + A collect of permissions that the user has to a resource. # noqa: E501 """ account: Optional[PermissionCollectionAccount] = None - user_id: StrictStr = Field(..., alias="userId") - permissions: conlist(PermissionObject) = Field(..., description="A list of the permissions") + user_id: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="userId") + permissions: conlist(PermissionObject) = Field(default=..., description="A list of the permissions") __properties = ["account", "userId", "permissions"] + @validator('user_id') + def user_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9+._|\/~:@\s-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9+._|\/~:@\s-]+$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True @@ -63,9 +70,6 @@ def to_dict(self): # override the default output from pydantic by calling `to_dict()` of account if self.account: _dict['account'] = self.account.to_dict() - # override the default output from pydantic by calling `to_dict()` of user_id - if self.user_id: - _dict['userId'] = self.user_id.to_dict() # override the default output from pydantic by calling `to_dict()` of each item in permissions (list) _items = [] if self.permissions: diff --git a/authress/models/permission_collection_account.py b/authress/models/permission_collection_account.py index d2680c7..60ca2cb 100644 --- a/authress/models/permission_collection_account.py +++ b/authress/models/permission_collection_account.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class PermissionCollectionAccount(BaseModel): """ PermissionCollectionAccount """ - account_id: Optional[StrictStr] = Field(None, alias="accountId") + account_id: Optional[StrictStr] = Field(default=None, alias="accountId") __properties = ["accountId"] class Config: diff --git a/authress/models/permission_object.py b/authress/models/permission_object.py index 0f1fc61..6372cea 100644 --- a/authress/models/permission_object.py +++ b/authress/models/permission_object.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,12 +27,12 @@ class PermissionObject(BaseModel): """ - The collective action and associate grants on a permission + The collective action and associate grants on a permission # noqa: E501 """ - action: constr(strict=True, max_length=64, min_length=1) = Field(..., description="The action the permission grants, can be scoped using `:` and parent actions imply sub-resource permissions, action:* or action implies action:sub-action. This property is case-insensitive, it will always be cast to lowercase before comparing actions to user permissions.") - allow: StrictBool = Field(..., description="Does this permission grant the user the ability to execute the action?") - grant: StrictBool = Field(..., description="Allows the user to give the permission to others without being able to execute the action.") - delegate: StrictBool = Field(..., description="Allows delegating or granting the permission to others without being able to execute the action.") + action: constr(strict=True, max_length=64, min_length=1) = Field(default=..., description="The action the permission grants, can be scoped using `:` and parent actions imply sub-resource permissions, action:* or action implies action:sub-action. This property is case-insensitive, it will always be cast to lowercase before comparing actions to user permissions.") + allow: StrictBool = Field(default=..., description="Does this permission grant the user the ability to execute the action?") + grant: StrictBool = Field(default=..., description="Allows the user to give the permission to others without being able to execute the action.") + delegate: StrictBool = Field(default=..., description="Allows delegating or granting the permission to others without being able to execute the action.") __properties = ["action", "allow", "grant", "delegate"] @validator('action') diff --git a/authress/models/permissioned_resource.py b/authress/models/permissioned_resource.py index 3303a88..d045fe3 100644 --- a/authress/models/permissioned_resource.py +++ b/authress/models/permissioned_resource.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,7 +30,7 @@ class PermissionedResource(BaseModel): """ PermissionedResource """ - permissions: conlist(ResourcePermission, min_items=1) = Field(...) + permissions: conlist(ResourcePermission, max_items=100, min_items=1) = Field(...) __properties = ["permissions"] class Config: diff --git a/authress/models/permissioned_resource_collection.py b/authress/models/permissioned_resource_collection.py index 238823b..b14c7cb 100644 --- a/authress/models/permissioned_resource_collection.py +++ b/authress/models/permissioned_resource_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,7 +30,7 @@ class PermissionedResourceCollection(BaseModel): """ - A collection of resource permissions that have been defined. + A collection of resource permissions that have been defined. # noqa: E501 """ resources: conlist(PermissionedResource) = Field(...) pagination: Optional[Pagination] = None diff --git a/authress/models/resource.py b/authress/models/resource.py index 5031016..9a327a7 100644 --- a/authress/models/resource.py +++ b/authress/models/resource.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class Resource(BaseModel): """ Resource """ - resource_uri: constr(strict=True, max_length=512, min_length=1) = Field(..., alias="resourceUri", description="A resource path which can be top level, fully qualified, or end with a *. Parent resources imply permissions to sub-resources.") + resource_uri: constr(strict=True, max_length=512, min_length=1) = Field(default=..., alias="resourceUri", description="A resource path which can be top level, fully qualified, or end with a *. Parent resources imply permissions to sub-resources.") __properties = ["resourceUri"] @validator('resource_uri') diff --git a/authress/models/resource_permission.py b/authress/models/resource_permission.py index 6668e08..0d24b63 100644 --- a/authress/models/resource_permission.py +++ b/authress/models/resource_permission.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations diff --git a/authress/models/resource_users_collection.py b/authress/models/resource_users_collection.py index 35bc215..2c3074a 100644 --- a/authress/models/resource_users_collection.py +++ b/authress/models/resource_users_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,9 +30,9 @@ class ResourceUsersCollection(BaseModel): """ - A collection of users with explicit permission to a resource. + A collection of users with explicit permission to a resource. # noqa: E501 """ - users: conlist(UserRoleCollection) = Field(..., description="A list of users") + users: conlist(UserRoleCollection) = Field(default=..., description="A list of users") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["users", "pagination", "links"] diff --git a/authress/models/role.py b/authress/models/role.py index d530a48..c9b052a 100644 --- a/authress/models/role.py +++ b/authress/models/role.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -28,17 +28,20 @@ class Role(BaseModel): """ - The role which contains a list of permissions. + The role which contains a list of permissions. # noqa: E501 """ - role_id: constr(strict=True, max_length=64, min_length=1) = Field(..., alias="roleId", description="Unique identifier for the role, can be specified on creation, and used by records to map to permissions.") - name: constr(strict=True, max_length=128, min_length=1) = Field(..., description="A helpful name for this role") - description: Optional[constr(strict=True, max_length=1024, min_length=0)] = Field(None, description="A description for when to the user as well as additional information.") - permissions: conlist(PermissionObject) = Field(..., description="A list of the permissions") + role_id: Optional[constr(strict=True, max_length=64, min_length=1)] = Field(default=None, alias="roleId", description="Unique identifier for the role, can be specified on creation, and used by records to map to permissions.") + name: constr(strict=True, max_length=128, min_length=1) = Field(default=..., description="A helpful name for this role") + description: Optional[constr(strict=True, max_length=1024, min_length=0)] = Field(default=None, description="A description for when to the user as well as additional information.") + permissions: conlist(PermissionObject, max_items=100, min_items=0) = Field(default=..., description="A list of the permissions") __properties = ["roleId", "name", "description", "permissions"] @validator('role_id') def role_id_validate_regular_expression(cls, value): """Validates the regular expression""" + if value is None: + return value + if not re.match(r"^[a-zA-Z0-9-._:@]+$", value): raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-._:@]+$/") return value diff --git a/authress/models/role_collection.py b/authress/models/role_collection.py index 2787eb6..b362b19 100644 --- a/authress/models/role_collection.py +++ b/authress/models/role_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,9 +30,9 @@ class RoleCollection(BaseModel): """ - A collection of roles + A collection of roles # noqa: E501 """ - roles: conlist(Role) = Field(..., description="A list of roles") + roles: conlist(Role) = Field(default=..., description="A list of roles") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["roles", "pagination", "links"] diff --git a/authress/models/statement.py b/authress/models/statement.py index c9932b1..69b04c1 100644 --- a/authress/models/statement.py +++ b/authress/models/statement.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -32,10 +32,10 @@ class Statement(BaseModel): """ Statement """ - roles: conlist(constr(strict=True, max_length=64, min_length=1), min_items=1) = Field(...) - resources: conlist(Resource, min_items=1) = Field(...) - users: Optional[conlist(User)] = Field(None, description="The list of users this statement applies to. Users and groups can be set at either the statement level or the record level, but not both.") - groups: Optional[conlist(LinkedGroup)] = Field(None, description="The list of groups this statement applies to. Users in these groups will be receive access to the resources listed. Users and groups can be set at either the statement level or the record level, but not both.") + roles: conlist(constr(strict=True, max_length=64, min_length=1), max_items=100, min_items=1) = Field(...) + resources: conlist(Resource, max_items=100, min_items=1) = Field(...) + users: Optional[conlist(User, max_items=100, min_items=0)] = Field(default=None, description="The list of users this statement applies to. Users and groups can be set at either the statement level or the record level, but not both.") + groups: Optional[conlist(LinkedGroup, max_items=10, min_items=0)] = Field(default=None, description="The list of groups this statement applies to. Users in these groups will be receive access to the resources listed. Users and groups can be set at either the statement level or the record level, but not both.") __properties = ["roles", "resources", "users", "groups"] class Config: @@ -83,6 +83,16 @@ def to_dict(self): if _item: _items.append(_item.to_dict()) _dict['groups'] = _items + # set to None if users (nullable) is None + # and __fields_set__ contains the field + if self.users is None and "users" in self.__fields_set__: + _dict['users'] = None + + # set to None if groups (nullable) is None + # and __fields_set__ contains the field + if self.groups is None and "groups" in self.__fields_set__: + _dict['groups'] = None + return _dict @classmethod diff --git a/authress/models/tenant.py b/authress/models/tenant.py index 0e2b8ab..2cd0208 100644 --- a/authress/models/tenant.py +++ b/authress/models/tenant.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -19,30 +19,35 @@ import json from datetime import datetime -from typing import Optional +from typing import List, Optional try: - from pydantic.v1 import BaseModel, Field, constr, validator + from pydantic.v1 import BaseModel, Field, conlist, constr, validator except ImportError: - from pydantic import BaseModel, Field, constr, validator + from pydantic import BaseModel, Field, conlist, constr, validator from authress.models.tenant_connection import TenantConnection from authress.models.tenant_data import TenantData +from authress.models.tenant_domain import TenantDomain class Tenant(BaseModel): """ Tenant """ - tenant_id: constr(strict=True, max_length=128, min_length=1) = Field(..., alias="tenantId") - tenant_lookup_identifier: Optional[constr(strict=True, max_length=64, min_length=1)] = Field(None, alias="tenantLookupIdentifier") + tenant_id: Optional[constr(strict=True, max_length=128, min_length=0)] = Field(default=None, alias="tenantId") + tenant_lookup_identifier: Optional[constr(strict=True, max_length=64, min_length=0)] = Field(default=None, alias="tenantLookupIdentifier") data: Optional[TenantData] = None + domains: Optional[conlist(TenantDomain, max_items=10, min_items=0)] = Field(default=None, description="The associated user email domains that are mapped to this tenant. When a user starts the authentication process, if they are using SSO, Authress will use their specified email address to identify which Authress Tenant to log the user in with.") connection: Optional[TenantConnection] = None - created_time: Optional[datetime] = Field(None, alias="createdTime") - __properties = ["tenantId", "tenantLookupIdentifier", "data", "connection", "createdTime"] + created_time: Optional[datetime] = Field(default=None, alias="createdTime") + __properties = ["tenantId", "tenantLookupIdentifier", "data", "domains", "connection", "createdTime"] @validator('tenant_id') def tenant_id_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^[a-zA-Z0-9-_.:]+$", value): - raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-_.:]+$/") + if value is None: + return value + + if not re.match(r"^[a-zA-Z0-9-_.:]*$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-_.:]*$/") return value @validator('tenant_lookup_identifier') @@ -83,14 +88,31 @@ def to_dict(self): # override the default output from pydantic by calling `to_dict()` of data if self.data: _dict['data'] = self.data.to_dict() + # override the default output from pydantic by calling `to_dict()` of each item in domains (list) + _items = [] + if self.domains: + for _item in self.domains: + if _item: + _items.append(_item.to_dict()) + _dict['domains'] = _items # override the default output from pydantic by calling `to_dict()` of connection if self.connection: _dict['connection'] = self.connection.to_dict() + # set to None if tenant_id (nullable) is None + # and __fields_set__ contains the field + if self.tenant_id is None and "tenant_id" in self.__fields_set__: + _dict['tenantId'] = None + # set to None if tenant_lookup_identifier (nullable) is None # and __fields_set__ contains the field if self.tenant_lookup_identifier is None and "tenant_lookup_identifier" in self.__fields_set__: _dict['tenantLookupIdentifier'] = None + # set to None if domains (nullable) is None + # and __fields_set__ contains the field + if self.domains is None and "domains" in self.__fields_set__: + _dict['domains'] = None + # set to None if connection (nullable) is None # and __fields_set__ contains the field if self.connection is None and "connection" in self.__fields_set__: @@ -111,6 +133,7 @@ def from_dict(cls, obj: dict) -> Tenant: "tenant_id": obj.get("tenantId"), "tenant_lookup_identifier": obj.get("tenantLookupIdentifier"), "data": TenantData.from_dict(obj.get("data")) if obj.get("data") is not None else None, + "domains": [TenantDomain.from_dict(_item) for _item in obj.get("domains")] if obj.get("domains") is not None else None, "connection": TenantConnection.from_dict(obj.get("connection")) if obj.get("connection") is not None else None, "created_time": obj.get("createdTime") }) diff --git a/authress/models/tenant_collection.py b/authress/models/tenant_collection.py index 29e7c07..98cb76d 100644 --- a/authress/models/tenant_collection.py +++ b/authress/models/tenant_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class TenantCollection(BaseModel): """ - A collection of tenants. + A collection of tenants. # noqa: E501 """ tenants: conlist(Tenant) = Field(...) pagination: Optional[Pagination] = None diff --git a/authress/models/tenant_connection.py b/authress/models/tenant_connection.py index fb58d80..0651be4 100644 --- a/authress/models/tenant_connection.py +++ b/authress/models/tenant_connection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class TenantConnection(BaseModel): """ TenantConnection """ - connection_id: Optional[constr(strict=True, max_length=64, min_length=1)] = Field(None, alias="connectionId") + connection_id: Optional[constr(strict=True, max_length=64, min_length=0)] = Field(default=None, alias="connectionId") __properties = ["connectionId"] @validator('connection_id') @@ -66,6 +66,11 @@ def to_dict(self): exclude={ }, exclude_none=True) + # set to None if connection_id (nullable) is None + # and __fields_set__ contains the field + if self.connection_id is None and "connection_id" in self.__fields_set__: + _dict['connectionId'] = None + return _dict @classmethod diff --git a/authress/models/tenant_data.py b/authress/models/tenant_data.py index ce16a87..28655aa 100644 --- a/authress/models/tenant_data.py +++ b/authress/models/tenant_data.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -29,7 +29,7 @@ class TenantData(BaseModel): """ TenantData """ - name: Optional[constr(strict=True, max_length=64, min_length=1)] = None + name: Optional[constr(strict=True, max_length=64, min_length=0)] = None __properties = ["name"] class Config: diff --git a/authress/models/metadata_object_account.py b/authress/models/tenant_domain.py similarity index 65% rename from authress/models/metadata_object_account.py rename to authress/models/tenant_domain.py index 2a81142..ba585ea 100644 --- a/authress/models/metadata_object_account.py +++ b/authress/models/tenant_domain.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -19,18 +19,25 @@ import json -from typing import Optional + try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, constr, validator -class MetadataObjectAccount(BaseModel): +class TenantDomain(BaseModel): """ - MetadataObjectAccount + The tenant linked domain configuration. # noqa: E501 """ - account_id: Optional[StrictStr] = Field(None, alias="accountId") - __properties = ["accountId"] + domain: constr(strict=True, max_length=128, min_length=1) = Field(default=..., description="The tenant linked domain.") + __properties = ["domain"] + + @validator('domain') + def domain_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-z0-9.-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-z0-9.-]+$/") + return value class Config: """Pydantic configuration""" @@ -46,8 +53,8 @@ def to_json(self) -> str: return json.dumps(self.to_dict()) @classmethod - def from_json(cls, json_str: str) -> MetadataObjectAccount: - """Create an instance of MetadataObjectAccount from a JSON string""" + def from_json(cls, json_str: str) -> TenantDomain: + """Create an instance of TenantDomain from a JSON string""" return cls.from_dict(json.loads(json_str)) def to_dict(self): @@ -59,16 +66,16 @@ def to_dict(self): return _dict @classmethod - def from_dict(cls, obj: dict) -> MetadataObjectAccount: - """Create an instance of MetadataObjectAccount from a dict""" + def from_dict(cls, obj: dict) -> TenantDomain: + """Create an instance of TenantDomain from a dict""" if obj is None: return None if not isinstance(obj, dict): - return MetadataObjectAccount.parse_obj(obj) + return TenantDomain.parse_obj(obj) - _obj = MetadataObjectAccount.parse_obj({ - "account_id": obj.get("accountId") + _obj = TenantDomain.parse_obj({ + "domain": obj.get("domain") }) return _obj diff --git a/authress/models/tenant_user.py b/authress/models/tenant_user.py new file mode 100644 index 0000000..a2747fa --- /dev/null +++ b/authress/models/tenant_user.py @@ -0,0 +1,85 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +from __future__ import annotations +import pprint +import re # noqa: F401 +import json + + +from typing import Optional +try: + from pydantic.v1 import BaseModel, Field, constr, validator +except ImportError: + from pydantic import BaseModel, Field, constr, validator + +class TenantUser(BaseModel): + """ + TenantUser + """ + user_id: Optional[constr(strict=True, max_length=128, min_length=1)] = Field(default=None, alias="userId") + __properties = ["userId"] + + @validator('user_id') + def user_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if value is None: + return value + + if not re.match(r"^[a-zA-Z0-9+._|\/~:@\s-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9+._|\/~:@\s-]+$/") + return value + + class Config: + """Pydantic configuration""" + allow_population_by_field_name = True + validate_assignment = True + + def to_str(self) -> str: + """Returns the string representation of the model using alias""" + return pprint.pformat(self.dict(by_alias=True)) + + def to_json(self) -> str: + """Returns the JSON representation of the model using alias""" + return json.dumps(self.to_dict()) + + @classmethod + def from_json(cls, json_str: str) -> TenantUser: + """Create an instance of TenantUser from a JSON string""" + return cls.from_dict(json.loads(json_str)) + + def to_dict(self): + """Returns the dictionary representation of the model using alias""" + _dict = self.dict(by_alias=True, + exclude={ + }, + exclude_none=True) + return _dict + + @classmethod + def from_dict(cls, obj: dict) -> TenantUser: + """Create an instance of TenantUser from a dict""" + if obj is None: + return None + + if not isinstance(obj, dict): + return TenantUser.parse_obj(obj) + + _obj = TenantUser.parse_obj({ + "user_id": obj.get("userId") + }) + return _obj + + diff --git a/authress/models/token_request.py b/authress/models/token_request.py index e8f950d..1080946 100644 --- a/authress/models/token_request.py +++ b/authress/models/token_request.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,8 +30,8 @@ class TokenRequest(BaseModel): """ TokenRequest """ - statements: conlist(Statement, min_items=1) = Field(..., description="A list of statements which match roles to resources. The token will have all statements apply to it.") - expires: datetime = Field(..., description="The ISO8601 datetime when the token will expire. Default is 24 hours from now.") + statements: conlist(Statement, min_items=1) = Field(default=..., description="A list of statements which match roles to resources. The token will have all statements apply to it.") + expires: datetime = Field(default=..., description="The ISO8601 datetime when the token will expire. Default is 24 hours from now.") __properties = ["statements", "expires"] class Config: diff --git a/authress/models/user.py b/authress/models/user.py index 82ba128..73b5aea 100644 --- a/authress/models/user.py +++ b/authress/models/user.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,16 +27,16 @@ class User(BaseModel): """ - A user object that identifies a user. + A user object that identifies a user. # noqa: E501 """ - user_id: constr(strict=True, max_length=64, min_length=1) = Field(..., alias="userId") + user_id: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="userId") __properties = ["userId"] @validator('user_id') def user_id_validate_regular_expression(cls, value): """Validates the regular expression""" - if not re.match(r"^[a-zA-Z0-9-._|\/~:@]+$", value): - raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-._|\/~:@]+$/") + if not re.match(r"^[a-zA-Z0-9+._|\/~:@\s-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9+._|\/~:@\s-]+$/") return value class Config: diff --git a/authress/models/user_connection_credentials.py b/authress/models/user_connection_credentials.py index efb0456..1ca28ba 100644 --- a/authress/models/user_connection_credentials.py +++ b/authress/models/user_connection_credentials.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -27,9 +27,9 @@ class UserConnectionCredentials(BaseModel): """ - The user credentials for this connection which can be used to access the connection provider APIs. + The user credentials for this connection which can be used to access the connection provider APIs. # noqa: E501 """ - access_token: StrictStr = Field(..., alias="accessToken", description="The access token.") + access_token: StrictStr = Field(default=..., alias="accessToken", description="The access token.") __properties = ["accessToken"] class Config: diff --git a/authress/models/user_identity.py b/authress/models/user_identity.py index e375116..8954d54 100644 --- a/authress/models/user_identity.py +++ b/authress/models/user_identity.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,20 +21,27 @@ from typing import Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, StrictStr, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, StrictStr, constr, validator class UserIdentity(BaseModel): """ - The composite user identity stored in Authress sourced by the customer SSO/SAML/OAuth IdP. + The composite user identity stored in Authress sourced by the customer SSO/SAML/OAuth IdP. # noqa: E501 """ - user_id: StrictStr = Field(..., alias="userId", description="The user identifier.") - name: Optional[StrictStr] = Field(None, description="The user's formatted display name.") - picture: Optional[StrictStr] = Field(None, description="A url that resolves to a picture that can be rendered.") - email: Optional[StrictStr] = Field(None, description="The user's verified email address sourced from their SSO IdP.") + user_id: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="userId") + name: Optional[StrictStr] = Field(default=None, description="The user's formatted display name.") + picture: Optional[StrictStr] = Field(default=None, description="A url that resolves to a picture that can be rendered.") + email: Optional[StrictStr] = Field(default=None, description="The user's verified email address sourced from their SSO IdP.") __properties = ["userId", "name", "picture", "email"] + @validator('user_id') + def user_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9+._|\/~:@\s-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9+._|\/~:@\s-]+$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True diff --git a/authress/models/user_identity_collection.py b/authress/models/user_identity_collection.py index 47cfb71..eb71f31 100644 --- a/authress/models/user_identity_collection.py +++ b/authress/models/user_identity_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -30,9 +30,9 @@ class UserIdentityCollection(BaseModel): """ - A collection of user identities + A collection of user identities # noqa: E501 """ - users: conlist(UserIdentity) = Field(..., description="A list of users") + users: conlist(UserIdentity) = Field(default=..., description="A list of users") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["users", "pagination", "links"] diff --git a/authress/models/user_resources_collection.py b/authress/models/user_resources_collection.py index 66d5bb2..fd41562 100644 --- a/authress/models/user_resources_collection.py +++ b/authress/models/user_resources_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,9 +21,9 @@ from typing import List, Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr, conlist + from pydantic.v1 import BaseModel, Field, conlist, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr, conlist + from pydantic import BaseModel, Field, conlist, constr, validator from authress.models.collection_links import CollectionLinks from authress.models.pagination import Pagination from authress.models.permission_collection_account import PermissionCollectionAccount @@ -31,15 +31,22 @@ class UserResourcesCollection(BaseModel): """ - A collect of permissions that the user has to a resource. + A collect of permissions that the user has to a resource. # noqa: E501 """ account: Optional[PermissionCollectionAccount] = None - user_id: StrictStr = Field(..., alias="userId") - resources: Optional[conlist(Resource)] = Field(None, description="A list of the resources the user has some permission to.") + user_id: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="userId") + resources: Optional[conlist(Resource)] = Field(default=None, description="A list of the resources the user has some permission to.") pagination: Optional[Pagination] = None links: CollectionLinks = Field(...) __properties = ["account", "userId", "resources", "pagination", "links"] + @validator('user_id') + def user_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9+._|\/~:@\s-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9+._|\/~:@\s-]+$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True @@ -67,9 +74,6 @@ def to_dict(self): # override the default output from pydantic by calling `to_dict()` of account if self.account: _dict['account'] = self.account.to_dict() - # override the default output from pydantic by calling `to_dict()` of user_id - if self.user_id: - _dict['userId'] = self.user_id.to_dict() # override the default output from pydantic by calling `to_dict()` of each item in resources (list) _items = [] if self.resources: diff --git a/authress/models/user_role.py b/authress/models/user_role.py index bbef7a4..ddcc5c7 100644 --- a/authress/models/user_role.py +++ b/authress/models/user_role.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,17 +21,24 @@ try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, constr, validator class UserRole(BaseModel): """ - A role with associated role data. + A role with associated role data. # noqa: E501 """ - role_id: StrictStr = Field(..., alias="roleId") + role_id: constr(strict=True, max_length=64, min_length=1) = Field(default=..., alias="roleId", description="Unique identifier for the role, can be specified on creation, and used by records to map to permissions.") __properties = ["roleId"] + @validator('role_id') + def role_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9-._:@]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9-._:@]+$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True @@ -56,9 +63,6 @@ def to_dict(self): exclude={ }, exclude_none=True) - # override the default output from pydantic by calling `to_dict()` of role_id - if self.role_id: - _dict['roleId'] = self.role_id.to_dict() return _dict @classmethod diff --git a/authress/models/user_role_collection.py b/authress/models/user_role_collection.py index 7c156e9..bf639b9 100644 --- a/authress/models/user_role_collection.py +++ b/authress/models/user_role_collection.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,19 +21,26 @@ from typing import List try: - from pydantic.v1 import BaseModel, Field, StrictStr, conlist + from pydantic.v1 import BaseModel, Field, conlist, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr, conlist + from pydantic import BaseModel, Field, conlist, constr, validator from authress.models.user_role import UserRole class UserRoleCollection(BaseModel): """ - A collect of roles that the user has to a resource. + A collect of roles that the user has to a resource. # noqa: E501 """ - user_id: StrictStr = Field(..., alias="userId") - roles: conlist(UserRole) = Field(..., description="A list of the roles") + user_id: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="userId") + roles: conlist(UserRole) = Field(default=..., description="A list of the roles") __properties = ["userId", "roles"] + @validator('user_id') + def user_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9+._|\/~:@\s-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9+._|\/~:@\s-]+$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True @@ -58,9 +65,6 @@ def to_dict(self): exclude={ }, exclude_none=True) - # override the default output from pydantic by calling `to_dict()` of user_id - if self.user_id: - _dict['userId'] = self.user_id.to_dict() # override the default output from pydantic by calling `to_dict()` of each item in roles (list) _items = [] if self.roles: diff --git a/authress/models/user_token.py b/authress/models/user_token.py index 6ab2d84..85ca81d 100644 --- a/authress/models/user_token.py +++ b/authress/models/user_token.py @@ -3,14 +3,14 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 from __future__ import annotations @@ -21,23 +21,30 @@ from typing import Optional try: - from pydantic.v1 import BaseModel, Field, StrictStr + from pydantic.v1 import BaseModel, Field, StrictStr, constr, validator except ImportError: - from pydantic import BaseModel, Field, StrictStr + from pydantic import BaseModel, Field, StrictStr, constr, validator from authress.models.account_links import AccountLinks from authress.models.permission_collection_account import PermissionCollectionAccount class UserToken(BaseModel): """ - A JWT token with represents the user. + A JWT token with represents the user. # noqa: E501 """ account: Optional[PermissionCollectionAccount] = None - user_id: StrictStr = Field(..., alias="userId") - token_id: StrictStr = Field(..., alias="tokenId", description="The unique identifier for the token") - token: StrictStr = Field(..., description="The access token") + user_id: constr(strict=True, max_length=128, min_length=1) = Field(default=..., alias="userId") + token_id: StrictStr = Field(default=..., alias="tokenId", description="The unique identifier for the token") + token: StrictStr = Field(default=..., description="The access token") links: Optional[AccountLinks] = None __properties = ["account", "userId", "tokenId", "token", "links"] + @validator('user_id') + def user_id_validate_regular_expression(cls, value): + """Validates the regular expression""" + if not re.match(r"^[a-zA-Z0-9+._|\/~:@\s-]+$", value): + raise ValueError(r"must validate the regular expression /^[a-zA-Z0-9+._|\/~:@\s-]+$/") + return value + class Config: """Pydantic configuration""" allow_population_by_field_name = True @@ -65,9 +72,6 @@ def to_dict(self): # override the default output from pydantic by calling `to_dict()` of account if self.account: _dict['account'] = self.account.to_dict() - # override the default output from pydantic by calling `to_dict()` of user_id - if self.user_id: - _dict['userId'] = self.user_id.to_dict() # override the default output from pydantic by calling `to_dict()` of links if self.links: _dict['links'] = self.links.to_dict() diff --git a/contributing.md b/contributing.md index c3ca9a3..821cb82 100644 --- a/contributing.md +++ b/contributing.md @@ -42,6 +42,10 @@ unzip SHA podman stop $CID && podman rm $CID ``` +### Repeated actions +* Move `models`, `tests`, `docs` to the appropriate locations. +* Ensure multiple versions of pydantic work + ### Common review items * [ ] Inputs to Constructor are (string: authress_api_url, string: service_client_access_key) * [ ] authress_api_url should sanitize https:// prefix and remove trailing `/`s diff --git a/docs/AccessRecord.md b/docs/AccessRecord.md index c925425..4dbb97d 100644 --- a/docs/AccessRecord.md +++ b/docs/AccessRecord.md @@ -5,19 +5,19 @@ The access record which links users to roles. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**record_id** | **str** | Unique identifier for the record, can be specified on record creation. | [optional] -**name** | **str** | A helpful name for this record | -**description** | **str** | More details about this record | [optional] -**capacity** | **float** | Percentage capacity of record that is filled. | [optional] [readonly] -**last_updated** | **datetime** | The expected last time the record was updated | [optional] [readonly] -**status** | **str** | Current status of the access record. | [optional] [readonly] -**account** | [**AccessRecordAccount**](AccessRecordAccount.md) | | -**users** | [**List[User]**](User.md) | The list of users this record applies to | [optional] -**admins** | [**List[User]**](User.md) | The list of admin that can edit this record even if they do not have global record edit permissions. | [optional] -**groups** | [**List[LinkedGroup]**](LinkedGroup.md) | The list of groups this record applies to. Users in these groups will be receive access to the resources listed. | [optional] -**statements** | [**List[Statement]**](Statement.md) | A list of statements which match roles to resources. | -**links** | [**AccountLinks**](AccountLinks.md) | | -**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] +**record_id** | **str** | Unique identifier for the record, can be specified on record creation. | [optional] +**name** | **str** | A helpful name for this record | +**description** | **str** | More details about this record | [optional] +**capacity** | **float** | Percentage capacity of record that is filled. | [optional] [readonly] +**last_updated** | **datetime** | The expected last time the record was updated | [optional] [readonly] +**status** | **str** | Current status of the access record. | [optional] [readonly] +**account** | [**AccessRecordAccount**](AccessRecordAccount.md) | | [optional] +**users** | [**List[User]**](User.md) | The list of users this record applies to. The record is finite in size, for patterns where the list of users might grow indefinitely, the recommended solution is to specify each user in their own access record. | [optional] +**admins** | [**List[User]**](User.md) | The list of admin that can edit this record even if they do not have global record edit permissions. | [optional] +**groups** | [**List[LinkedGroup]**](LinkedGroup.md) | The list of groups this record applies to. Users in these groups will be receive access to the resources listed. | [optional] +**statements** | [**List[Statement]**](Statement.md) | A list of statements which match roles to resources. | +**links** | [**AccountLinks**](AccountLinks.md) | | [optional] +**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] ## Example @@ -34,7 +34,7 @@ print AccessRecord.to_json() # convert the object into a dict access_record_dict = access_record_instance.to_dict() # create an instance of AccessRecord from a dict -access_record_form_dict = access_record.from_dict(access_record_dict) +access_record_from_dict = AccessRecord.from_dict(access_record_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccessRecordAccount.md b/docs/AccessRecordAccount.md index b9c07f6..3385424 100644 --- a/docs/AccessRecordAccount.md +++ b/docs/AccessRecordAccount.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**account_id** | **str** | | +**account_id** | **str** | | ## Example @@ -21,7 +21,7 @@ print AccessRecordAccount.to_json() # convert the object into a dict access_record_account_dict = access_record_account_instance.to_dict() # create an instance of AccessRecordAccount from a dict -access_record_account_form_dict = access_record_account.from_dict(access_record_account_dict) +access_record_account_from_dict = AccessRecordAccount.from_dict(access_record_account_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccessRecordCollection.md b/docs/AccessRecordCollection.md index e1098ae..a277bab 100644 --- a/docs/AccessRecordCollection.md +++ b/docs/AccessRecordCollection.md @@ -5,9 +5,9 @@ A collection of access records ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**records** | [**List[AccessRecord]**](AccessRecord.md) | A list of access records | -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**records** | [**List[AccessRecord]**](AccessRecord.md) | A list of access records | +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print AccessRecordCollection.to_json() # convert the object into a dict access_record_collection_dict = access_record_collection_instance.to_dict() # create an instance of AccessRecordCollection from a dict -access_record_collection_form_dict = access_record_collection.from_dict(access_record_collection_dict) +access_record_collection_from_dict = AccessRecordCollection.from_dict(access_record_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccessRecordsApi.md b/docs/AccessRecordsApi.md index d63bc82..f73c54e 100644 --- a/docs/AccessRecordsApi.md +++ b/docs/AccessRecordsApi.md @@ -1,11 +1,13 @@ # authress.AccessRecordsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_claim**](AccessRecordsApi.md#create_claim) | **POST** /v1/claims | Create resource Claim [**create_record**](AccessRecordsApi.md#create_record) | **POST** /v1/records | Create access record [**create_request**](AccessRecordsApi.md#create_request) | **POST** /v1/requests | Create access request -[**delete_record**](AccessRecordsApi.md#delete_record) | **DELETE** /v1/records/{recordId} | Deletes access record -[**delete_request**](AccessRecordsApi.md#delete_request) | **DELETE** /v1/requests/{requestId} | Deletes access request +[**delete_record**](AccessRecordsApi.md#delete_record) | **DELETE** /v1/records/{recordId} | Delete access record +[**delete_request**](AccessRecordsApi.md#delete_request) | **DELETE** /v1/requests/{requestId} | Delete access request [**get_record**](AccessRecordsApi.md#get_record) | **GET** /v1/records/{recordId} | Retrieve access record [**get_records**](AccessRecordsApi.md#get_records) | **GET** /v1/records | List access records [**get_request**](AccessRecordsApi.md#get_request) | **GET** /v1/requests/{requestId} | Retrieve access request @@ -34,7 +36,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -56,7 +58,7 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **claim_request** | [**ClaimRequest**](ClaimRequest.md)| | + **claim_request** | [**ClaimRequest**](ClaimRequest.md)| | ### Return type @@ -76,7 +78,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Resource claimed. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the resource collection to claim a sub-resource. | - | +**403** | Forbidden. The user doesn't have permission to the resource collection to claim a sub-resource. | - | **409** | AlreadyClaimed. The resource has already been claimed by another user or another user already has access to this resource. So admin access will not be given. The reason for this is to prevent preemptive stealing of admin access to these records. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -101,7 +103,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -124,7 +126,7 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **access_record** | [**AccessRecord**](AccessRecord.md)| | + **access_record** | [**AccessRecord**](AccessRecord.md)| | ### Return type @@ -142,10 +144,10 @@ Name | Type | Description | Notes ### HTTP response details | Status code | Description | Response headers | |-------------|-------------|------------------| -**201** | Success. Access record created | - | +**201** | Success. Access record created | - | **202** | Success. Access record created and permissions will be propagated asynchronously. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to create records. | - | +**403** | Forbidden. The user doesn't have permission to create records. | - | **409** | AccessRecordAlreadyExists. There already exists an access record with this recordId. | - | **413** | The size of the record is larger than allowed. Recommended action is to create another record and retry the updates. | - | @@ -171,7 +173,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -194,7 +196,7 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **access_request** | [**AccessRequest**](AccessRequest.md)| | + **access_request** | [**AccessRequest**](AccessRequest.md)| | ### Return type @@ -214,7 +216,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Access request created | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to create access requests. | - | +**403** | Forbidden. The user doesn't have permission to create access requests. | - | **422** | Unprocessable Entity. Some of the data in the request is invalid. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -222,7 +224,7 @@ Name | Type | Description | Notes # **delete_record** > delete_record(record_id) -Deletes access record +Delete access record Remove an access record, removing associated permissions from all users in record. If a user has a permission from another record, that permission will not be removed. (Note: This disables the record by changing the status to DELETED but not completely remove the record for tracking purposes. @@ -238,7 +240,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -259,7 +261,7 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **record_id** | **str**| The identifier of the access record. | + **record_id** | **str**| The identifier of the access record. | ### Return type @@ -279,15 +281,15 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. The access record has been deleted | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete the access record. | - | -**404** | Not found. The user doesn't have any permissions to the resource or the access record no longer exists. | - | +**403** | Forbidden. The user doesn't have permission to delete the access record. | - | +**404** | Not found. The user doesn't have any permissions to the resource or the access record no longer exists. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **delete_request** > delete_request(request_id) -Deletes access request +Delete access request Remove an access request. @@ -303,7 +305,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -324,7 +326,7 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **request_id** | **str**| The identifier of the access request. | + **request_id** | **str**| The identifier of the access request. | ### Return type @@ -344,8 +346,8 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. The access request has been deleted | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete the access request. | - | -**404** | Not found. The user doesn't have any permissions to the access request or it no longer exists. | - | +**403** | Forbidden. The user doesn't have permission to delete the access request. | - | +**404** | Not found. The user doesn't have any permissions to the access request or it no longer exists. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -369,7 +371,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -392,7 +394,7 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **record_id** | **str**| The identifier of the access record. | + **record_id** | **str**| The identifier of the access record. | ### Return type @@ -412,8 +414,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the access record, but they have other permissions to the same account. | - | -**404** | Not found. The user doesn't have any permissions to the access record or this access record does not exist. | - | +**403** | Forbidden. The user doesn't have permission to the access record, but they have other permissions to the same account. | - | +**404** | Not found. The user doesn't have any permissions to the access record or this access record does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -422,7 +424,7 @@ Name | Type | Description | Notes List access records -Returns a paginated records list for the account. Only records the user has access to are returned. This query resource is meant for administrative actions only, therefore has a lower rate limit tier than user permissions related resources. Additionally, the results from a query to Access Records may be delayed up to 5 minutes. +Returns a paginated records list for the account. Only records the user has access to are returned. The results sort order is not stable, on subsequent requests different results may be returned. This query resource is meant for administrative actions only, therefore has a lower rate limit tier than user permissions related resources. Additionally, the results from a query to Access Records may be delayed up to 5 minutes. ### Example @@ -437,7 +439,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -464,9 +466,9 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **limit** | **int**| Max number of results to return | [optional] [default to 20] - **cursor** | **str**| Continuation cursor for paging | [optional] - **filter** | **str**| Filter to search records by. This is a case insensitive search through every text field. | [optional] - **status** | **str**| Filter records by their current status. | [optional] + **cursor** | **str**| Continuation cursor for paging | [optional] + **filter** | **str**| Filter to search records by. This is a case insensitive search through every text field. | [optional] + **status** | **str**| Filter records by their current status. | [optional] ### Return type @@ -486,7 +488,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to fetch account records, but has other account permissions. | - | +**403** | Forbidden. The user doesn't have permission to fetch account records, but has other account permissions. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -510,7 +512,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -533,7 +535,7 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **request_id** | **str**| The identifier of the access request. | + **request_id** | **str**| The identifier of the access request. | ### Return type @@ -553,8 +555,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the access request, but they have other permissions to the same account. | - | -**404** | Not found. The user doesn't have any permissions to the access request or this access request does not exist. | - | +**403** | Forbidden. The user doesn't have permission to the access request, but they have other permissions to the same account. | - | +**404** | Not found. The user doesn't have any permissions to the access request or this access request does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -578,7 +580,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -604,8 +606,8 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **limit** | **int**| Max number of results to return | [optional] [default to 20] - **cursor** | **str**| Continuation cursor for paging | [optional] - **status** | **str**| Filter requests by their current status. | [optional] + **cursor** | **str**| Continuation cursor for paging | [optional] + **status** | **str**| Filter requests by their current status. | [optional] ### Return type @@ -625,7 +627,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to fetch access requests, but has other account permissions. | - | +**403** | Forbidden. The user doesn't have permission to fetch access requests, but has other account permissions. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -650,7 +652,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -674,8 +676,8 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **request_id** | **str**| The identifier of the access request. | - **access_request_response** | [**AccessRequestResponse**](AccessRequestResponse.md)| | + **request_id** | **str**| The identifier of the access request. | + **access_request_response** | [**AccessRequestResponse**](AccessRequestResponse.md)| | ### Return type @@ -695,8 +697,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. Access record updated. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update the access request. | - | -**404** | Not found. The user doesn't have any permissions to the access request. | - | +**403** | Forbidden. The user doesn't have permission to update the access request. | - | +**404** | Not found. The user doesn't have any permissions to the access request. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -720,7 +722,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -743,9 +745,9 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **record_id** | **str**| The identifier of the access record. | - **access_record** | [**AccessRecord**](AccessRecord.md)| | - **expected_last_modified_time** | **str**| The expected last time the record was modified. | [optional] + **record_id** | **str**| The identifier of the access record. | + **access_record** | [**AccessRecord**](AccessRecord.md)| | + **expected_last_modified_time** | **str**| The expected last time the record was modified. | [optional] ### Return type @@ -765,8 +767,8 @@ void (empty response body) |-------------|-------------|------------------| **202** | Success. Access record update request was accepted. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update the access record. | - | -**404** | Not found. The user doesn't have any permissions to the access record. | - | +**403** | Forbidden. The user doesn't have permission to update the access record. | - | +**404** | Not found. The user doesn't have any permissions to the access record. | - | **412** | Precondition failed. Usually the result of a concurrent update to the access record. Get the latest version and retry again. | - | **413** | The size of the record is larger than allowed. Recommended action is to create another record and retry the updates. | - | diff --git a/docs/AccessRequest.md b/docs/AccessRequest.md index 29f7bc4..65cb2fe 100644 --- a/docs/AccessRequest.md +++ b/docs/AccessRequest.md @@ -5,12 +5,12 @@ The access requested by a user. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**request_id** | **str** | Unique identifier for the request. | [readonly] -**last_updated** | **datetime** | The expected last time the request was updated | [optional] [readonly] -**status** | **str** | Current status of the access request. | [optional] [readonly] -**access** | [**AccessTemplate**](AccessTemplate.md) | | -**links** | [**AccountLinks**](AccountLinks.md) | | -**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] +**request_id** | **str** | Unique identifier for the request. | [readonly] +**last_updated** | **datetime** | The expected last time the request was updated | [optional] [readonly] +**status** | **str** | Current status of the access request. | [optional] [readonly] +**access** | [**AccessTemplate**](AccessTemplate.md) | | +**links** | [**AccountLinks**](AccountLinks.md) | | [optional] +**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] ## Example @@ -27,7 +27,7 @@ print AccessRequest.to_json() # convert the object into a dict access_request_dict = access_request_instance.to_dict() # create an instance of AccessRequest from a dict -access_request_form_dict = access_request.from_dict(access_request_dict) +access_request_from_dict = AccessRequest.from_dict(access_request_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccessRequestCollection.md b/docs/AccessRequestCollection.md index 325100d..3c07a54 100644 --- a/docs/AccessRequestCollection.md +++ b/docs/AccessRequestCollection.md @@ -5,9 +5,9 @@ A collection of access requests ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**records** | [**List[AccessRequest]**](AccessRequest.md) | A list of access requests | [optional] -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**records** | [**List[AccessRequest]**](AccessRequest.md) | A list of access requests | [optional] +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print AccessRequestCollection.to_json() # convert the object into a dict access_request_collection_dict = access_request_collection_instance.to_dict() # create an instance of AccessRequestCollection from a dict -access_request_collection_form_dict = access_request_collection.from_dict(access_request_collection_dict) +access_request_collection_from_dict = AccessRequestCollection.from_dict(access_request_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccessRequestResponse.md b/docs/AccessRequestResponse.md index 71856b4..e6f1ba0 100644 --- a/docs/AccessRequestResponse.md +++ b/docs/AccessRequestResponse.md @@ -5,7 +5,7 @@ A dynamic body to support request PATCH operations ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**status** | **str** | New result, either approve or deny the request | +**status** | **str** | New result, either approve or deny the request | ## Example @@ -22,7 +22,7 @@ print AccessRequestResponse.to_json() # convert the object into a dict access_request_response_dict = access_request_response_instance.to_dict() # create an instance of AccessRequestResponse from a dict -access_request_response_form_dict = access_request_response.from_dict(access_request_response_dict) +access_request_response_from_dict = AccessRequestResponse.from_dict(access_request_response_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccessTemplate.md b/docs/AccessTemplate.md index 9776028..186a59b 100644 --- a/docs/AccessTemplate.md +++ b/docs/AccessTemplate.md @@ -5,8 +5,8 @@ A logical grouping of access related elements ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**users** | [**List[User]**](User.md) | The list of users the access applies to | -**statements** | [**List[Statement]**](Statement.md) | A list of statements which match roles to resources. | +**users** | [**List[User]**](User.md) | The list of users access applies to. Access templates are finite in size, for patterns where the list of users might grow indefinitely, the recommended solution is to specify each user in their own access record. | +**statements** | [**List[Statement]**](Statement.md) | A list of statements which match roles to resources. | ## Example @@ -23,7 +23,7 @@ print AccessTemplate.to_json() # convert the object into a dict access_template_dict = access_template_instance.to_dict() # create an instance of AccessTemplate from a dict -access_template_form_dict = access_template.from_dict(access_template_dict) +access_template_from_dict = AccessTemplate.from_dict(access_template_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Account.md b/docs/Account.md index d46afe5..4d73b4a 100644 --- a/docs/Account.md +++ b/docs/Account.md @@ -4,11 +4,11 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**account_id** | **str** | | -**created_time** | **datetime** | | [readonly] -**name** | **str** | | [optional] -**company** | **object** | | -**links** | [**AccountLinks**](AccountLinks.md) | | +**account_id** | **str** | | +**created_time** | **datetime** | | [readonly] +**name** | **str** | | [optional] +**company** | **object** | | +**links** | [**AccountLinks**](AccountLinks.md) | | [optional] ## Example @@ -25,7 +25,7 @@ print Account.to_json() # convert the object into a dict account_dict = account_instance.to_dict() # create an instance of Account from a dict -account_form_dict = account.from_dict(account_dict) +account_from_dict = Account.from_dict(account_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccountCollection.md b/docs/AccountCollection.md index 0b9f2fb..72f04da 100644 --- a/docs/AccountCollection.md +++ b/docs/AccountCollection.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**accounts** | [**Account**](Account.md) | | +**accounts** | [**Account**](Account.md) | | ## Example @@ -21,7 +21,7 @@ print AccountCollection.to_json() # convert the object into a dict account_collection_dict = account_collection_instance.to_dict() # create an instance of AccountCollection from a dict -account_collection_form_dict = account_collection.from_dict(account_collection_dict) +account_collection_from_dict = AccountCollection.from_dict(account_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccountLinks.md b/docs/AccountLinks.md index 5056fc1..560e5d1 100644 --- a/docs/AccountLinks.md +++ b/docs/AccountLinks.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**var_self** | [**Link**](Link.md) | | +**var_self** | [**Link**](Link.md) | | ## Example @@ -21,7 +21,7 @@ print AccountLinks.to_json() # convert the object into a dict account_links_dict = account_links_instance.to_dict() # create an instance of AccountLinks from a dict -account_links_form_dict = account_links.from_dict(account_links_dict) +account_links_from_dict = AccountLinks.from_dict(account_links_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/AccountsApi.md b/docs/AccountsApi.md index 8cfd3fc..7b2c4ee 100644 --- a/docs/AccountsApi.md +++ b/docs/AccountsApi.md @@ -1,4 +1,6 @@ # authress.AccountsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**delegate_authentication**](AccountsApi.md#delegate_authentication) | **POST** /v1/identities | Link external provider @@ -27,7 +29,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -48,7 +50,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **identity_request** | [**IdentityRequest**](IdentityRequest.md)| | + **identity_request** | [**IdentityRequest**](IdentityRequest.md)| | ### Return type @@ -68,7 +70,7 @@ void (empty response body) |-------------|-------------|------------------| **201** | Success. New identity linked. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update identities for the account. | - | +**403** | Forbidden. The user doesn't have permission to update identities for the account. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -92,7 +94,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -114,7 +116,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **account_id** | **str**| The unique identifier for the account | + **account_id** | **str**| The unique identifier for the account | ### Return type @@ -134,7 +136,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. The account | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**404** | Not found. The user doesn't have any permissions to this account or it does not exist. | - | +**404** | Not found. The user doesn't have any permissions to this account or it does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -158,7 +160,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -196,7 +198,7 @@ This endpoint does not need any parameter. |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Not found. The user doesn't have permission to list identities for this account. | - | +**403** | Not found. The user doesn't have permission to list identities for this account. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -220,7 +222,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -243,7 +245,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **earliest_cache_time** | **datetime**| Ensure the accounts list is not cached before this time. | [optional] + **earliest_cache_time** | **datetime**| Ensure the accounts list is not cached before this time. | [optional] ### Return type diff --git a/docs/ApplicationDelegation.md b/docs/ApplicationDelegation.md index e6d6edd..01c7c56 100644 --- a/docs/ApplicationDelegation.md +++ b/docs/ApplicationDelegation.md @@ -5,7 +5,7 @@ The delegation response. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**authentication_url** | **str** | Redirect the user to this url to automatically log them into a third-party application. | +**authentication_url** | **str** | Redirect the user to this url to automatically log them into a third-party application. | ## Example @@ -22,7 +22,7 @@ print ApplicationDelegation.to_json() # convert the object into a dict application_delegation_dict = application_delegation_instance.to_dict() # create an instance of ApplicationDelegation from a dict -application_delegation_form_dict = application_delegation.from_dict(application_delegation_dict) +application_delegation_from_dict = ApplicationDelegation.from_dict(application_delegation_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ApplicationsApi.md b/docs/ApplicationsApi.md index 5964c14..8f4ca11 100644 --- a/docs/ApplicationsApi.md +++ b/docs/ApplicationsApi.md @@ -1,4 +1,6 @@ # authress.ApplicationsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**delegate_user_login**](ApplicationsApi.md#delegate_user_login) | **POST** /v1/applications/{applicationId}/users/{userId}/delegation | Log user into third-party application @@ -9,7 +11,7 @@ Method | HTTP request | Description Log user into third-party application -Redirect the user to an external application to login them in. Authress uses OpenID and SAML configuration to securely pass the user's login session in your platform to an external platform. The user will then be logged into that platform. +Redirect the user to an external application to login them in. Use this endpoint when you want to enable a user in your platform, identified by an Authress User ID, to log into a third party external application you do not control. The user will then be logged into that platform. Authress uses OpenID and SAML configuration to securely pass the user's login session in your platform to an external platform.

For first party applications, use the Authress Login SDK. First party applications are those that your team, org, and company own, operate, and run (even if they are open source solutions). Third party applications are those that are operated by another company on a separate eTLD and you have no control over. ### Example @@ -24,7 +26,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -48,8 +50,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **application_id** | **str**| The application to have the user log into. | - **user_id** | [**str**](.md)| The user. | + **application_id** | **str**| The third party application, the users wants to login using their Authress User Identity. Application IDs begin with app_. | + **user_id** | **str**| The Authress user identifier. | ### Return type @@ -69,7 +71,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to log a user into this application. | - | +**403** | Forbidden. The user doesn't have permission to log a user into this application. | - | **404** | Not found. The application or user does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/ClaimRequest.md b/docs/ClaimRequest.md index 61d6a06..c006824 100644 --- a/docs/ClaimRequest.md +++ b/docs/ClaimRequest.md @@ -4,8 +4,8 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**collection_resource** | **str** | The parent resource to add a sub-resource to. The resource must have a resource configuration that add the permission CLAIM for this to work. | -**resource_id** | **str** | The sub-resource the user is requesting Admin ownership over. | +**collection_resource** | **str** | The parent resource to add a sub-resource to. The resource must have a resource configuration that add the permission CLAIM for this to work. | +**resource_id** | **str** | The sub-resource the user is requesting Admin ownership over. | ## Example @@ -22,7 +22,7 @@ print ClaimRequest.to_json() # convert the object into a dict claim_request_dict = claim_request_instance.to_dict() # create an instance of ClaimRequest from a dict -claim_request_form_dict = claim_request.from_dict(claim_request_dict) +claim_request_from_dict = ClaimRequest.from_dict(claim_request_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Client.md b/docs/Client.md index d9a8c5b..65476b3 100644 --- a/docs/Client.md +++ b/docs/Client.md @@ -5,12 +5,13 @@ A client configuration. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**client_id** | **str** | The unique ID of the client. | [readonly] -**created_time** | **datetime** | | [readonly] -**name** | **str** | The name of the client | [optional] -**options** | [**ClientOptions**](ClientOptions.md) | | [optional] -**verification_keys** | [**List[ClientAccessKey]**](ClientAccessKey.md) | A list of the service client access keys. | [optional] [readonly] -**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] +**client_id** | **str** | The unique ID of the client. | [readonly] +**created_time** | **datetime** | | [readonly] +**name** | **str** | The name of the client | [optional] +**options** | [**ClientOptions**](ClientOptions.md) | | [optional] +**rate_limits** | [**List[ClientRateLimit]**](ClientRateLimit.md) | A list of the service client rate limits. Rate Limits can be used to prevent service clients from creating too many requests to your API. They can also limit the number of requests to Authress management APIs, or contain a maximum quota for a client before it is not longer allowed to make additional requests. | [optional] +**verification_keys** | [**List[ClientAccessKey]**](ClientAccessKey.md) | A list of the service client access keys. | [optional] [readonly] +**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] ## Example @@ -27,7 +28,7 @@ print Client.to_json() # convert the object into a dict client_dict = client_instance.to_dict() # create an instance of Client from a dict -client_form_dict = client.from_dict(client_dict) +client_from_dict = Client.from_dict(client_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ClientAccessKey.md b/docs/ClientAccessKey.md index e47b788..1fbd89b 100644 --- a/docs/ClientAccessKey.md +++ b/docs/ClientAccessKey.md @@ -5,11 +5,12 @@ A client access key configuration. The configuration contains information about ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**key_id** | **str** | The unique ID of the client. | [optional] [readonly] -**client_id** | **str** | The unique ID of the client. | [readonly] -**generation_date** | **datetime** | | [optional] [readonly] -**client_secret** | **str** | The unencoded OAuth client secret used with the OAuth endpoints to request a JWT using the `client_credentials` grant type. Pass the clientId and the clientSecret to the documented /tokens endpoint. | [optional] [readonly] -**access_key** | **str** | An encoded access key which contains identifying information for client access token creation. For direct use with the Authress SDKs. This private access key must be saved on first creation as it is discarded afterwards. Authress only saves the corresponding public key to verify the private access key. | [optional] [readonly] +**key_id** | **str** | The unique ID of the client. | [optional] [readonly] +**client_id** | **str** | The unique ID of the client. | [readonly] +**public_key** | **str** | Specify a public key on access key creation to bring your own private key. When left blank, Authress will automatically generate a private and public key pair and then return the private key as part of the request. This property holds the public key. | [optional] +**generation_date** | **datetime** | | [optional] [readonly] +**client_secret** | **str** | The unencoded OAuth client secret used with the OAuth endpoints to request a JWT using the `client_credentials` grant type. Pass the clientId and the clientSecret to the documented /tokens endpoint. | [optional] [readonly] +**access_key** | **str** | An encoded access key which contains identifying information for client access token creation. For direct use with the Authress SDKs. This private access key must be saved on first creation as it is discarded afterwards. Authress only saves the corresponding public key to verify the private access key. | [optional] [readonly] ## Example @@ -26,7 +27,7 @@ print ClientAccessKey.to_json() # convert the object into a dict client_access_key_dict = client_access_key_instance.to_dict() # create an instance of ClientAccessKey from a dict -client_access_key_form_dict = client_access_key.from_dict(client_access_key_dict) +client_access_key_from_dict = ClientAccessKey.from_dict(client_access_key_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ClientCollection.md b/docs/ClientCollection.md index 9181ef9..ca9dbbd 100644 --- a/docs/ClientCollection.md +++ b/docs/ClientCollection.md @@ -5,9 +5,9 @@ The collection of a list of clients ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**clients** | [**List[Client]**](Client.md) | A list of clients | -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**clients** | [**List[Client]**](Client.md) | A list of clients | +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print ClientCollection.to_json() # convert the object into a dict client_collection_dict = client_collection_instance.to_dict() # create an instance of ClientCollection from a dict -client_collection_form_dict = client_collection.from_dict(client_collection_dict) +client_collection_from_dict = ClientCollection.from_dict(client_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ClientOptions.md b/docs/ClientOptions.md index d92aabf..ef294c4 100644 --- a/docs/ClientOptions.md +++ b/docs/ClientOptions.md @@ -23,7 +23,7 @@ print ClientOptions.to_json() # convert the object into a dict client_options_dict = client_options_instance.to_dict() # create an instance of ClientOptions from a dict -client_options_form_dict = client_options.from_dict(client_options_dict) +client_options_from_dict = ClientOptions.from_dict(client_options_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ClientRateLimit.md b/docs/ClientRateLimit.md new file mode 100644 index 0000000..9284e47 --- /dev/null +++ b/docs/ClientRateLimit.md @@ -0,0 +1,30 @@ +# ClientRateLimit + +A service client rate limit. Rate Limits can be used to prevent service clients from creating too many requests to your API. They can also limit the number of requests to Authress management APIs, or contain a maximum quota for a client before it is not longer allowed to make additional requests. + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**duration** | **str** | The sliding window timeslice duration for which this quota applies. This value must conform to the ISO8601 format, see the enum for allow values. | +**quota** | **int** | The maximum number of requests allowed during the duration. | + +## Example + +```python +from authress.models.client_rate_limit import ClientRateLimit + +# TODO update the JSON string below +json = "{}" +# create an instance of ClientRateLimit from a JSON string +client_rate_limit_instance = ClientRateLimit.from_json(json) +# print the JSON string representation of the object +print ClientRateLimit.to_json() + +# convert the object into a dict +client_rate_limit_dict = client_rate_limit_instance.to_dict() +# create an instance of ClientRateLimit from a dict +client_rate_limit_from_dict = ClientRateLimit.from_dict(client_rate_limit_dict) +``` +[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) + + diff --git a/docs/CollectionLinks.md b/docs/CollectionLinks.md index 77fb5cd..06063df 100644 --- a/docs/CollectionLinks.md +++ b/docs/CollectionLinks.md @@ -4,8 +4,8 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**var_self** | [**Link**](Link.md) | | -**next** | [**Link**](Link.md) | | [optional] +**var_self** | [**Link**](Link.md) | | +**next** | [**Link**](Link.md) | | [optional] ## Example @@ -22,7 +22,7 @@ print CollectionLinks.to_json() # convert the object into a dict collection_links_dict = collection_links_instance.to_dict() # create an instance of CollectionLinks from a dict -collection_links_form_dict = collection_links.from_dict(collection_links_dict) +collection_links_from_dict = CollectionLinks.from_dict(collection_links_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Connection.md b/docs/Connection.md index 33919ba..4062338 100644 --- a/docs/Connection.md +++ b/docs/Connection.md @@ -5,17 +5,23 @@ Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- **type** | **str** | | [optional] [default to 'OAUTH2'] -**connection_id** | **str** | | [optional] -**authentication_url** | **str** | | [optional] -**token_url** | **str** | | [optional] -**issuer_url** | **str** | | [optional] -**provider_certificate** | **str** | | [optional] -**client_id** | **str** | | [optional] -**client_secret** | **str** | | [optional] -**data** | [**ConnectionData**](ConnectionData.md) | | [optional] -**default_connection_properties** | [**ConnectionDefaultConnectionProperties**](ConnectionDefaultConnectionProperties.md) | | [optional] -**created_time** | **datetime** | | [optional] [readonly] -**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] +**connection_id** | **str** | | [optional] +**authentication_url** | **str** | Authorization URL of the provider (where the user logs in). For OAuth this is the authorization URL. For SAML, specify the **SSO URL** in this property. | [optional] +**token_url** | **str** | The token exchange url (where we validate the token). | [optional] +**issuer_url** | **str** | The unique identifier tied to the provider's domain used for TLS verification. In OAuth, this is the JWT **iss** property. For SAML, specify the **Entity ID** in this property. | [optional] +**provider_certificate** | **str** | The Provider's SAML public certificate which can be used to verify the signature in signed SAML assertions from the provider. | [optional] +**client_id** | **str** | Provider's client ID used to verify the token | [optional] +**client_secret_id** | **str** | Provider's client secret identifier used to identify the client secret within your account. Some provider require this property. | [optional] +**client_secret** | **str** | Provider's client secret used to verify the token | [optional] +**user_data_configuration** | [**ConnectionUserDataConfiguration**](ConnectionUserDataConfiguration.md) | | [optional] +**data** | [**ConnectionData**](ConnectionData.md) | | [optional] +**default_connection_properties** | [**ConnectionDefaultConnectionProperties**](ConnectionDefaultConnectionProperties.md) | | [optional] +**conditions** | [**ConnectionConditions**](ConnectionConditions.md) | | [optional] +**linking_configuration** | [**ConnectionLinkingConfiguration**](ConnectionLinkingConfiguration.md) | | [optional] +**created_time** | **datetime** | | [optional] [readonly] +**last_updated** | **datetime** | | [optional] [readonly] +**is_active_connection** | **bool** | | [optional] [readonly] +**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] ## Example @@ -32,7 +38,7 @@ print Connection.to_json() # convert the object into a dict connection_dict = connection_instance.to_dict() # create an instance of Connection from a dict -connection_form_dict = connection.from_dict(connection_dict) +connection_from_dict = Connection.from_dict(connection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ConnectionCollection.md b/docs/ConnectionCollection.md index 1e17a56..832cab0 100644 --- a/docs/ConnectionCollection.md +++ b/docs/ConnectionCollection.md @@ -5,8 +5,8 @@ A collection of connections. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**connections** | [**List[Connection]**](Connection.md) | | -**pagination** | [**Pagination**](Pagination.md) | | [optional] +**connections** | [**List[Connection]**](Connection.md) | | +**pagination** | [**Pagination**](Pagination.md) | | [optional] ## Example @@ -23,7 +23,7 @@ print ConnectionCollection.to_json() # convert the object into a dict connection_collection_dict = connection_collection_instance.to_dict() # create an instance of ConnectionCollection from a dict -connection_collection_form_dict = connection_collection.from_dict(connection_collection_dict) +connection_collection_from_dict = ConnectionCollection.from_dict(connection_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ConnectionConditions.md b/docs/ConnectionConditions.md new file mode 100644 index 0000000..2d60d23 --- /dev/null +++ b/docs/ConnectionConditions.md @@ -0,0 +1,29 @@ +# ConnectionConditions + +Conditions are custom restrictions on connections that prevent the connection from being used when it should not be, or limits its usability for increased security. + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**require_business_account** | **bool** | Require the user logging in with this connect to be using a business account. When possible Authress will block user login and request that they select a different account. Enabling this may prevent some users from being able to sign up with this identity connection. | [optional] [default to False] + +## Example + +```python +from authress.models.connection_conditions import ConnectionConditions + +# TODO update the JSON string below +json = "{}" +# create an instance of ConnectionConditions from a JSON string +connection_conditions_instance = ConnectionConditions.from_json(json) +# print the JSON string representation of the object +print ConnectionConditions.to_json() + +# convert the object into a dict +connection_conditions_dict = connection_conditions_instance.to_dict() +# create an instance of ConnectionConditions from a dict +connection_conditions_from_dict = ConnectionConditions.from_dict(connection_conditions_dict) +``` +[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) + + diff --git a/docs/ConnectionData.md b/docs/ConnectionData.md index 965dd44..01e759d 100644 --- a/docs/ConnectionData.md +++ b/docs/ConnectionData.md @@ -4,9 +4,13 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**tenant_id** | **str** | | [optional] -**name** | **str** | | [optional] -**supported_content_type** | **str** | | [optional] [default to 'application/json'] +**tenant_id** | **str** | | [optional] +**developer_account_id** | **str** | The Developer Account ID associated with the credentials. This is necessary for some providers, such as Apple Login. | [optional] +**name** | **str** | The name of this connection when displayed in the Authress management portal | [optional] +**supported_content_type** | **str** | URL encode OAuth token parameters - Some authentication APIs don't support JSON, in these cases enable the url encoded form data parameters. | [optional] [default to 'application/json'] +**oidc_user_endpoint_url** | **str** | By default, the **sub** claim of the JWT is used to identify the user from this provider. However, not all providers are OpenID compliant. Here you can provide an optional user data endpoint to fetch additional user profile information and an expression to identify a new user ID from available properties. | [optional] +**user_id_expression** | **str** | By default, the **sub** claim of the JWT is used to identify the user from this provider. However, not all providers are OpenID compliant. Here you can provide an optional user expression to identify a new user ID from available properties found from the oidcUserEndpointUrl. (The default is **{sub}**, any claims may be used.) | [optional] [default to '{sub}'] +**trust_identity_user_id** | **bool** | Authress generates unique user IDs for every user, however if you trust your identity provider to handle unique ID generate across **ALL customers**, then it is safe to reuse the user ID from the provider. | [optional] [default to False] ## Example @@ -23,7 +27,7 @@ print ConnectionData.to_json() # convert the object into a dict connection_data_dict = connection_data_instance.to_dict() # create an instance of ConnectionData from a dict -connection_data_form_dict = connection_data.from_dict(connection_data_dict) +connection_data_from_dict = ConnectionData.from_dict(connection_data_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ConnectionDefaultConnectionProperties.md b/docs/ConnectionDefaultConnectionProperties.md index 6aba7f6..94ccc02 100644 --- a/docs/ConnectionDefaultConnectionProperties.md +++ b/docs/ConnectionDefaultConnectionProperties.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**scope** | **str** | | [optional] [default to 'profile email openid'] +**scope** | **str** | Default OAuth scopes to use for every request (leave blank to remove scopes). | [optional] [default to 'profile email openid'] ## Example @@ -21,7 +21,7 @@ print ConnectionDefaultConnectionProperties.to_json() # convert the object into a dict connection_default_connection_properties_dict = connection_default_connection_properties_instance.to_dict() # create an instance of ConnectionDefaultConnectionProperties from a dict -connection_default_connection_properties_form_dict = connection_default_connection_properties.from_dict(connection_default_connection_properties_dict) +connection_default_connection_properties_from_dict = ConnectionDefaultConnectionProperties.from_dict(connection_default_connection_properties_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ConnectionLinkingConfiguration.md b/docs/ConnectionLinkingConfiguration.md new file mode 100644 index 0000000..4de0df0 --- /dev/null +++ b/docs/ConnectionLinkingConfiguration.md @@ -0,0 +1,29 @@ +# ConnectionLinkingConfiguration + +Linking configuration enables users to connect identities from different connections together, so that they can log in with either connection. + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**type** | **str** | Specify the type of linking supported by this connection. The default configuration is DISABLED, meaning that users cannot link their identity from one connection to another connection. Both connections must allow for linking for a link to be successful. By default linking is disabled because it comes with security implications, users can potentially use linking through malicious connections to steal identities from other users.<br><ul><li>EXPLICIT - Users can use the linking API to link accounts.</li><li>AUTOMATIC - When a user signs up with a new account, if the verified email address matches an existing account, the two accounts will be automatically linked.</li><li>Set to <code>null</code> or leave unspecified to disable identity linking.</li></ul> | [optional] + +## Example + +```python +from authress.models.connection_linking_configuration import ConnectionLinkingConfiguration + +# TODO update the JSON string below +json = "{}" +# create an instance of ConnectionLinkingConfiguration from a JSON string +connection_linking_configuration_instance = ConnectionLinkingConfiguration.from_json(json) +# print the JSON string representation of the object +print ConnectionLinkingConfiguration.to_json() + +# convert the object into a dict +connection_linking_configuration_dict = connection_linking_configuration_instance.to_dict() +# create an instance of ConnectionLinkingConfiguration from a dict +connection_linking_configuration_from_dict = ConnectionLinkingConfiguration.from_dict(connection_linking_configuration_dict) +``` +[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) + + diff --git a/docs/ConnectionUserDataConfiguration.md b/docs/ConnectionUserDataConfiguration.md new file mode 100644 index 0000000..3742a1d --- /dev/null +++ b/docs/ConnectionUserDataConfiguration.md @@ -0,0 +1,28 @@ +# ConnectionUserDataConfiguration + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**location** | **str** | User data residency - The data residency to store the user specific data in. To ensure high performance and reliability, set to **null**, or to store the user's data only in one specific region, set the region here. Specifying the region reduces reliability, durability, and performance at the benefit of controlling the locality. | [optional] + +## Example + +```python +from authress.models.connection_user_data_configuration import ConnectionUserDataConfiguration + +# TODO update the JSON string below +json = "{}" +# create an instance of ConnectionUserDataConfiguration from a JSON string +connection_user_data_configuration_instance = ConnectionUserDataConfiguration.from_json(json) +# print the JSON string representation of the object +print ConnectionUserDataConfiguration.to_json() + +# convert the object into a dict +connection_user_data_configuration_dict = connection_user_data_configuration_instance.to_dict() +# create an instance of ConnectionUserDataConfiguration from a dict +connection_user_data_configuration_from_dict = ConnectionUserDataConfiguration.from_dict(connection_user_data_configuration_dict) +``` +[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) + + diff --git a/docs/ConnectionsApi.md b/docs/ConnectionsApi.md index 6db78b9..d28cacf 100644 --- a/docs/ConnectionsApi.md +++ b/docs/ConnectionsApi.md @@ -1,4 +1,6 @@ # authress.ConnectionsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_connection**](ConnectionsApi.md#create_connection) | **POST** /v1/connections | Create SSO connection @@ -29,7 +31,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -52,7 +54,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **connection** | [**Connection**](Connection.md)| | + **connection** | [**Connection**](Connection.md)| | ### Return type @@ -72,7 +74,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Connection created | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to create connection. | - | +**403** | Forbidden. The user doesn't have permission to create connection. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -95,7 +97,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -116,7 +118,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **connection_id** | **str**| The connection identifier. | + **connection_id** | **str**| The connection identifier. | ### Return type @@ -136,7 +138,7 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. Connection deleted | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete connection. | - | +**403** | Forbidden. The user doesn't have permission to delete connection. | - | **404** | Not found. The connection does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -161,7 +163,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -184,7 +186,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **connection_id** | **str**| The connection identifier. | + **connection_id** | **str**| The connection identifier. | ### Return type @@ -204,7 +206,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to get connection. | - | +**403** | Forbidden. The user doesn't have permission to get connection. | - | **404** | Not found. The connection does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -230,7 +232,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -254,8 +256,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **connection_id** | **str**| The connection identifier. | - **user_id** | **str**| The connection user. | + **connection_id** | **str**| The connection identifier. | + **user_id** | **str**| The Authress user ID. (Passing in the user ID generated by the third party will not return any credentials.) | ### Return type @@ -275,13 +277,13 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to get user connection credentials. | - | +**403** | Forbidden. The user doesn't have permission to get user connection credentials. | - | **404** | Not found. The connection or user does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **get_connections** -> ConnectionCollection get_connections() +> ConnectionCollection get_connections(limit=limit, cursor=cursor, filter=filter) List SSO connections @@ -300,7 +302,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -318,7 +320,12 @@ except Exception as e: ### Parameters -This endpoint does not need any parameter. + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **limit** | **int**| Max number of results to return | [optional] [default to 100] + **cursor** | **str**| Continuation cursor for paging | [optional] + **filter** | **str**| Filter to search connections by. This is a case insensitive search through every text field. | [optional] ### Return type @@ -338,7 +345,7 @@ This endpoint does not need any parameter. |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to fetch account connections, but has other account permissions. | - | +**403** | Forbidden. The user doesn't have permission to fetch account connections, but has other account permissions. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -362,7 +369,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -386,8 +393,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **connection_id** | **str**| The connection identifier. | - **connection** | [**Connection**](Connection.md)| | + **connection_id** | **str**| The connection identifier. | + **connection** | [**Connection**](Connection.md)| | ### Return type @@ -407,7 +414,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. Connection updated | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update connection. | - | +**403** | Forbidden. The user doesn't have permission to update connection. | - | **404** | Not found. The connection does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/EXAMPLES.md b/docs/EXAMPLES.md index 30b47c0..3519bb3 100644 --- a/docs/EXAMPLES.md +++ b/docs/EXAMPLES.md @@ -6,7 +6,7 @@ from authress import AuthressClient # create an instance of the API class during service initialization # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -42,7 +42,7 @@ from authress import AuthressClient # create an instance of the API class during service initialization # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # Create a service client in the Authress management portal and past the access token here service_client_access_key = 'eyJrZXlJ....' @@ -101,7 +101,7 @@ from authress.models import * # Your service's service client access token service_client_access_key = 'eyJrZXlJ....' # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" authress_client = AuthressClient(authress_api_url=authress_api_url, service_client_access_key=service_client_access_key) # User to create access token for @@ -132,7 +132,7 @@ from authress import AuthressClient authorization_token = request.headers.get("authorization") # Authress custom domain or if there isn't one yet, use the authress account specific url -host = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +host = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # Instantiate the client authress_client = AuthressClient(host) diff --git a/docs/Extension.md b/docs/Extension.md index daac635..0b430b6 100644 --- a/docs/Extension.md +++ b/docs/Extension.md @@ -4,12 +4,12 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**extension_id** | **str** | | [readonly] -**name** | **str** | The name of the extension. This name is visible in the Authress management portal | [optional] -**created_time** | **datetime** | | [readonly] -**application** | [**ExtensionApplication**](ExtensionApplication.md) | | [optional] -**client** | [**ExtensionClient**](ExtensionClient.md) | | -**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] +**extension_id** | **str** | | [readonly] +**name** | **str** | The name of the extension. This name is visible in the Authress management portal | [optional] +**created_time** | **datetime** | | [readonly] +**application** | [**ExtensionApplication**](ExtensionApplication.md) | | [optional] +**client** | [**ExtensionClient**](ExtensionClient.md) | | [optional] +**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] ## Example @@ -26,7 +26,7 @@ print Extension.to_json() # convert the object into a dict extension_dict = extension_instance.to_dict() # create an instance of Extension from a dict -extension_form_dict = extension.from_dict(extension_dict) +extension_from_dict = Extension.from_dict(extension_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ExtensionApplication.md b/docs/ExtensionApplication.md index 73e80a2..fa285fd 100644 --- a/docs/ExtensionApplication.md +++ b/docs/ExtensionApplication.md @@ -5,9 +5,9 @@ The extension's application configuration. The application contains the necessar ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**application_id** | **str** | The unique ID of the application. | [readonly] -**redirect_urls** | **List[str]** | | [optional] -**links** | [**Links**](Links.md) | | +**application_id** | **str** | The unique ID of the application. | [readonly] +**redirect_urls** | **List[str]** | | [optional] +**links** | [**Links**](Links.md) | | [optional] ## Example @@ -24,7 +24,7 @@ print ExtensionApplication.to_json() # convert the object into a dict extension_application_dict = extension_application_instance.to_dict() # create an instance of ExtensionApplication from a dict -extension_application_form_dict = extension_application.from_dict(extension_application_dict) +extension_application_from_dict = ExtensionApplication.from_dict(extension_application_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ExtensionClient.md b/docs/ExtensionClient.md index 9b359fd..ed9a049 100644 --- a/docs/ExtensionClient.md +++ b/docs/ExtensionClient.md @@ -5,8 +5,9 @@ The extension's client configuration. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**client_id** | **str** | The unique ID of the client. | [readonly] -**links** | [**Links**](Links.md) | | +**client_id** | **str** | The unique ID of the client. | [readonly] +**rate_limits** | [**List[ClientRateLimit]**](ClientRateLimit.md) | A list of the service client rate limits. Rate Limits can be used to prevent service clients from creating too many requests to your API. They can also limit the number of requests to Authress management APIs, or contain a maximum quota for a client before it is not longer allowed to make additional requests. | [optional] +**links** | [**Links**](Links.md) | | [optional] ## Example @@ -23,7 +24,7 @@ print ExtensionClient.to_json() # convert the object into a dict extension_client_dict = extension_client_instance.to_dict() # create an instance of ExtensionClient from a dict -extension_client_form_dict = extension_client.from_dict(extension_client_dict) +extension_client_from_dict = ExtensionClient.from_dict(extension_client_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ExtensionCollection.md b/docs/ExtensionCollection.md index 22d7716..7cd33d5 100644 --- a/docs/ExtensionCollection.md +++ b/docs/ExtensionCollection.md @@ -5,8 +5,8 @@ A collection of platform extensions. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**extensions** | [**List[Extension]**](Extension.md) | | -**pagination** | [**Pagination**](Pagination.md) | | [optional] +**extensions** | [**List[Extension]**](Extension.md) | | +**pagination** | [**Pagination**](Pagination.md) | | [optional] ## Example @@ -23,7 +23,7 @@ print ExtensionCollection.to_json() # convert the object into a dict extension_collection_dict = extension_collection_instance.to_dict() # create an instance of ExtensionCollection from a dict -extension_collection_form_dict = extension_collection.from_dict(extension_collection_dict) +extension_collection_from_dict = ExtensionCollection.from_dict(extension_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ExtensionsApi.md b/docs/ExtensionsApi.md index 347e839..92d9d1c 100644 --- a/docs/ExtensionsApi.md +++ b/docs/ExtensionsApi.md @@ -1,4 +1,6 @@ # authress.ExtensionsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_extension**](ExtensionsApi.md#create_extension) | **POST** /v1/extensions | Create extension @@ -30,7 +32,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -53,7 +55,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **extension** | [**Extension**](Extension.md)| | + **extension** | [**Extension**](Extension.md)| | ### Return type @@ -73,7 +75,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Extension created | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to create extension. | - | +**403** | Forbidden. The user doesn't have permission to create extension. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -96,7 +98,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -117,7 +119,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **extension_id** | **str**| The extension identifier. | + **extension_id** | **str**| The extension identifier. | ### Return type @@ -137,7 +139,7 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. Extension deleted. Completed disabling and deleting an extension is done asynchronously. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete extension. | - | +**403** | Forbidden. The user doesn't have permission to delete extension. | - | **404** | Not found. The extension does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -162,7 +164,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -185,7 +187,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **extension_id** | **str**| The extension identifier. | + **extension_id** | **str**| The extension identifier. | ### Return type @@ -205,13 +207,13 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to get extension. | - | +**403** | Forbidden. The user doesn't have permission to get extension. | - | **404** | Not found. The extension does not extension. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **get_extensions** -> ExtensionCollection get_extensions() +> ExtensionCollection get_extensions(limit=limit, cursor=cursor) List extensions @@ -230,7 +232,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -249,7 +251,11 @@ except Exception as e: ### Parameters -This endpoint does not need any parameter. + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **limit** | **int**| Max number of results to return | [optional] [default to 20] + **cursor** | **str**| Continuation cursor for paging | [optional] ### Return type @@ -269,7 +275,7 @@ This endpoint does not need any parameter. |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to fetch account extensions, but has other account permissions. | - | +**403** | Forbidden. The user doesn't have permission to fetch account extensions, but has other account permissions. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -292,7 +298,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -318,10 +324,10 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **client_id** | **str**| The client identifier to constrain the token to. | - **code_challenge** | **str**| The PKCE Code challenge generated by the extension UI to secure the code exchange from [RFC 7636](https://datatracker.ietf.org/doc/html/rfc7636). | - **redirect_uri** | **str**| The location to redirect the user back to after login. This redirect_uri must be a URL that matches one of the preconfigured urls in the Authress Application. | - **code_challenge_method** | **str**| The method used to generate the code_challenge from the code_verifier. `code_challenge_method(code_verifier) = code_challenge` | [optional] [default to 'S256'] + **client_id** | **str**| The client identifier to constrain the token to. | + **code_challenge** | **str**| The PKCE Code challenge generated by the extension UI to secure the code exchange from [RFC 7636](https://datatracker.ietf.org/doc/html/rfc7636). | + **redirect_uri** | **str**| The location to redirect the user back to after login. This redirect_uri must be a URL that matches one of the preconfigured urls in the Authress Application. | + **code_challenge_method** | **str**| The method used to generate the code_challenge from the code_verifier. `code_challenge_method(code_verifier) = code_challenge` | [optional] [default to 'S256'] ### Return type @@ -365,7 +371,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -388,7 +394,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **o_auth_token_request** | [**OAuthTokenRequest**](OAuthTokenRequest.md)| The contents of an OAuth token request. | + **o_auth_token_request** | [**OAuthTokenRequest**](OAuthTokenRequest.md)| The contents of an OAuth token request. | ### Return type @@ -432,7 +438,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -456,8 +462,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **extension_id** | **str**| The extension identifier. | - **extension** | [**Extension**](Extension.md)| | + **extension_id** | **str**| The extension identifier. | + **extension** | [**Extension**](Extension.md)| | ### Return type @@ -477,7 +483,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. The extension has been successfully updated | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update extension. | - | +**403** | Forbidden. The user doesn't have permission to update extension. | - | **404** | Not found. The extension does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/Group.md b/docs/Group.md index 7fd54ce..d36e9f6 100644 --- a/docs/Group.md +++ b/docs/Group.md @@ -5,13 +5,13 @@ A group of users, which can be added to access records. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**group_id** | **str** | Unique identifier for the groupId, can be specified on record creation. Must begin with grp_. | [optional] -**name** | **str** | A helpful name for this record | -**last_updated** | **datetime** | The expected last time the group was updated | [optional] [readonly] -**users** | [**List[User]**](User.md) | The list of users in this group | -**admins** | [**List[User]**](User.md) | The list of admins that can edit this record even if they do not have global record edit permissions. | -**links** | [**AccountLinks**](AccountLinks.md) | | -**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] +**group_id** | **str** | Unique identifier for the groupId, can be specified on record creation. Must begin with grp_. | [optional] +**name** | **str** | A helpful name for this record | +**last_updated** | **datetime** | The expected last time the group was updated | [optional] [readonly] +**users** | [**List[User]**](User.md) | The list of users in this group. A group can have a maximum of 100 users. | +**admins** | [**List[User]**](User.md) | The list of admins that can edit this record even if they do not have global record edit permissions. | +**links** | [**AccountLinks**](AccountLinks.md) | | [optional] +**tags** | **Dict[str, str]** | The tags associated with this resource, this property is an map. { key1: value1, key2: value2 } | [optional] ## Example @@ -28,7 +28,7 @@ print Group.to_json() # convert the object into a dict group_dict = group_instance.to_dict() # create an instance of Group from a dict -group_form_dict = group.from_dict(group_dict) +group_from_dict = Group.from_dict(group_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/GroupCollection.md b/docs/GroupCollection.md index 932abf2..9bed7ba 100644 --- a/docs/GroupCollection.md +++ b/docs/GroupCollection.md @@ -5,9 +5,9 @@ A collection of groups ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**groups** | [**List[Group]**](Group.md) | A list of groups | -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**groups** | [**List[Group]**](Group.md) | A list of groups | +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print GroupCollection.to_json() # convert the object into a dict group_collection_dict = group_collection_instance.to_dict() # create an instance of GroupCollection from a dict -group_collection_form_dict = group_collection.from_dict(group_collection_dict) +group_collection_from_dict = GroupCollection.from_dict(group_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/GroupsApi.md b/docs/GroupsApi.md index 5ad6839..6a852fc 100644 --- a/docs/GroupsApi.md +++ b/docs/GroupsApi.md @@ -1,8 +1,10 @@ # authress.GroupsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_group**](GroupsApi.md#create_group) | **POST** /v1/groups | Create group -[**delete_group**](GroupsApi.md#delete_group) | **DELETE** /v1/groups/{groupId} | Deletes group +[**delete_group**](GroupsApi.md#delete_group) | **DELETE** /v1/groups/{groupId} | Delete group [**get_group**](GroupsApi.md#get_group) | **GET** /v1/groups/{groupId} | Retrieve group [**get_groups**](GroupsApi.md#get_groups) | **GET** /v1/groups | List groups [**update_group**](GroupsApi.md#update_group) | **PUT** /v1/groups/{groupId} | Update a group @@ -13,7 +15,7 @@ Method | HTTP request | Description Create group -Specify users to be included in a new group. (Groups have a maximum size of ~100KB) +Specify users to be included in a new group. (Groups have a maximum size of 100 users) ### Example @@ -28,7 +30,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -51,7 +53,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **group** | [**Group**](Group.md)| | + **group** | [**Group**](Group.md)| | ### Return type @@ -71,14 +73,14 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Group created | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to create groups. | - | +**403** | Forbidden. The user doesn't have permission to create groups. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **delete_group** > delete_group(group_id) -Deletes group +Delete group Remove a group, users will lose any role that was assigned through membership of this group. This action cannot be undone. @@ -95,7 +97,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -116,7 +118,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **group_id** | **str**| The identifier of the group. | + **group_id** | **str**| The identifier of the group. | ### Return type @@ -136,8 +138,8 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. The group has been deleted | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete the group. | - | -**404** | Not found. The user doesn't have any permissions to the resource or the group no longer exists. | - | +**403** | Forbidden. The user doesn't have permission to delete the group. | - | +**404** | Not found. The user doesn't have any permissions to the resource or the group no longer exists. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -162,7 +164,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -185,7 +187,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **group_id** | **str**| The identifier of the group. | + **group_id** | **str**| The identifier of the group. | ### Return type @@ -205,8 +207,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the group, but they have other permissions to the same account. | - | -**404** | Not found. The user doesn't have any permissions to the group or this group does not exist. | - | +**403** | Forbidden. The user doesn't have permission to the group, but they have other permissions to the same account. | - | +**404** | Not found. The user doesn't have any permissions to the group or this group does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -215,7 +217,7 @@ Name | Type | Description | Notes List groups -Returns a paginated groups list for the account. Only groups the user has access to are returned. This query resource is meant for administrative actions only, therefore has a lower rate limit tier than user permissions related resources. +Returns a paginated groups list for the account. Only groups the user has access to are returned. The results sort order is not stable, on subsequent requests different results may be returned. This query resource is meant for administrative actions only, therefore has a lower rate limit tier than user permissions related resources. Additionally, the results from a query to Groups may be delayed up to 5 minutes. ### Example @@ -230,7 +232,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -256,8 +258,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **limit** | **int**| Max number of results to return | [optional] [default to 20] - **cursor** | **str**| Continuation cursor for paging | [optional] - **filter** | **str**| Filter to search groups by. This is a case insensitive search through every text field. | [optional] + **cursor** | **str**| Continuation cursor for paging | [optional] + **filter** | **str**| Filter to search groups by. This is a case insensitive search through every text field. | [optional] ### Return type @@ -277,12 +279,12 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to fetch groups, but has other account permissions | - | +**403** | Forbidden. The user doesn't have permission to fetch groups, but has other account permissions | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **update_group** -> Group update_group(group_id, group, expected_last_modified_time=expected_last_modified_time) +> Group update_group(group_id, group, if_unmodified_since=if_unmodified_since) Update a group @@ -302,7 +304,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -349,8 +351,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. Group updated. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update the group. | - | -**404** | Not found. The user doesn't have any permissions to the group. | - | +**403** | Forbidden. The user doesn't have permission to update the group. | - | +**404** | Not found. The user doesn't have any permissions to the group. | - | **412** | Precondition failed. Usually the result of a concurrent update to the group. Get the latest version and retry again. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/Identity.md b/docs/Identity.md index 3cecc33..68383a8 100644 --- a/docs/Identity.md +++ b/docs/Identity.md @@ -5,8 +5,9 @@ The identifying information which uniquely links a JWT OIDC token to an identity ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**issuer** | **str** | The issuer of the JWT token. This can be any OIDC compliant provider. | -**audience** | **str** | The audience of the JWT token. This can be either an audience for your entire app, or one particular audience for it. If there is more than one audience, multiple identities can be created. | +**issuer** | **str** | The issuer of the JWT token. This can be any OIDC compliant provider. | +**audience** | **str** | The audience of the JWT token. This can be either an audience for your entire app, or one particular audience for it. If there is more than one audience, multiple identities can be created. | +**user_id_expression** | **str** | By default, the **sub** claim of the JWT is used to identify the user from this provider. To use an alternate claim or a compound userId resolution, specify an expression. The resolved userId must be the same one that is later used in Authress access records. | [optional] [default to '{sub}'] ## Example @@ -23,7 +24,7 @@ print Identity.to_json() # convert the object into a dict identity_dict = identity_instance.to_dict() # create an instance of Identity from a dict -identity_form_dict = identity.from_dict(identity_dict) +identity_from_dict = Identity.from_dict(identity_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/IdentityCollection.md b/docs/IdentityCollection.md index 42aad4c..3085b5c 100644 --- a/docs/IdentityCollection.md +++ b/docs/IdentityCollection.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**identities** | [**List[Identity]**](Identity.md) | | +**identities** | [**List[Identity]**](Identity.md) | | ## Example @@ -21,7 +21,7 @@ print IdentityCollection.to_json() # convert the object into a dict identity_collection_dict = identity_collection_instance.to_dict() # create an instance of IdentityCollection from a dict -identity_collection_form_dict = identity_collection.from_dict(identity_collection_dict) +identity_collection_from_dict = IdentityCollection.from_dict(identity_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/IdentityRequest.md b/docs/IdentityRequest.md index 3f3dde5..f1d991e 100644 --- a/docs/IdentityRequest.md +++ b/docs/IdentityRequest.md @@ -5,9 +5,10 @@ Request to link an identity provider's audience and your app's audience with Aut ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**jwt** | **str** | A valid JWT OIDC compliant token which will still pass authentication requests to the identity provider. Must contain a unique audience and issuer. | [optional] -**issuer** | **str** | The issuer of the OAuth OIDC provider's JWTs. This value should match the `iss` claim in the provided tokens exactly. | [optional] +**jwt** | **str** | A valid JWT OIDC compliant token which will still pass authentication requests to the identity provider. Must contain a unique audience and issuer. | [optional] +**issuer** | **str** | The issuer of the OAuth OIDC provider's JWTs. This value should match the `iss` claim in the provided tokens exactly. | [optional] **preferred_audience** | **str** | If the `jwt` token contains more than one valid audience, then the single audience that should associated with Authress. If more than one audience is preferred, repeat this call with each one. | [optional] [default to '*'] +**user_id_expression** | **str** | By default, the **sub** claim of the JWT is used to identify the user from this provider. To use an alternate claim or a compound userId resolution, specify an expression. The resolved userId must be the same one that is later used in Authress access records. | [optional] [default to '{sub}'] ## Example @@ -24,7 +25,7 @@ print IdentityRequest.to_json() # convert the object into a dict identity_request_dict = identity_request_instance.to_dict() # create an instance of IdentityRequest from a dict -identity_request_form_dict = identity_request.from_dict(identity_request_dict) +identity_request_from_dict = IdentityRequest.from_dict(identity_request_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Invite.md b/docs/Invite.md index 867c8ae..fe27937 100644 --- a/docs/Invite.md +++ b/docs/Invite.md @@ -5,10 +5,10 @@ The user invite used to invite users to your application or to Authress as an ad ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**invite_id** | **str** | The unique identifier for the invite. Use this ID to accept the invite. This parameter is ignored during invite creation. | [readonly] -**tenant_id** | **str** | | [optional] -**statements** | [**List[Statement]**](Statement.md) | A list of statements which match roles to resources. The invited user will all statements apply to them when the invite is accepted. | -**links** | [**AccountLinks**](AccountLinks.md) | | +**invite_id** | **str** | The unique identifier for the invite. Use this ID to accept the invite. This parameter is ignored during invite creation. | [readonly] +**tenant_id** | **str** | | [optional] +**statements** | [**List[InviteStatement]**](InviteStatement.md) | A list of statements which match roles to resources. The invited user will all statements apply to them when the invite is accepted. | +**links** | [**AccountLinks**](AccountLinks.md) | | [optional] ## Example @@ -25,7 +25,7 @@ print Invite.to_json() # convert the object into a dict invite_dict = invite_instance.to_dict() # create an instance of Invite from a dict -invite_form_dict = invite.from_dict(invite_dict) +invite_from_dict = Invite.from_dict(invite_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/InviteStatement.md b/docs/InviteStatement.md new file mode 100644 index 0000000..4f5bc0f --- /dev/null +++ b/docs/InviteStatement.md @@ -0,0 +1,31 @@ +# InviteStatement + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**roles** | **List[str]** | | +**resources** | [**List[Resource]**](Resource.md) | | +**users** | **List[str]** | | [optional] +**groups** | **List[str]** | | [optional] + +## Example + +```python +from authress.models.invite_statement import InviteStatement + +# TODO update the JSON string below +json = "{}" +# create an instance of InviteStatement from a JSON string +invite_statement_instance = InviteStatement.from_json(json) +# print the JSON string representation of the object +print InviteStatement.to_json() + +# convert the object into a dict +invite_statement_dict = invite_statement_instance.to_dict() +# create an instance of InviteStatement from a dict +invite_statement_from_dict = InviteStatement.from_dict(invite_statement_dict) +``` +[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) + + diff --git a/docs/InvitesApi.md b/docs/InvitesApi.md index e865610..cc5ebd7 100644 --- a/docs/InvitesApi.md +++ b/docs/InvitesApi.md @@ -1,4 +1,6 @@ # authress.InvitesApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_invite**](InvitesApi.md#create_invite) | **POST** /v1/invites | Create user invite @@ -27,7 +29,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -50,7 +52,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **invite** | [**Invite**](Invite.md)| | + **invite** | [**Invite**](Invite.md)| | ### Return type @@ -70,7 +72,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Invite created | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have the permissions to create an invite. They may have specified too many permissions in the invite. | - | +**403** | Forbidden. The user doesn't have the permissions to create an invite. They may have specified too many permissions in the invite. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -93,7 +95,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -114,7 +116,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **invite_id** | **str**| The identifier of the invite. | + **invite_id** | **str**| The identifier of the invite. | ### Return type @@ -134,8 +136,8 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. Invite deleted. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete the invite. | - | -**404** | Not found. The user doesn't have any permissions to the invite. | - | +**403** | Forbidden. The user doesn't have permission to delete the invite. | - | +**404** | Not found. The user doesn't have any permissions to the invite. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -159,7 +161,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -182,7 +184,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **invite_id** | **str**| The identifier of the invite. | + **invite_id** | **str**| The identifier of the invite. | ### Return type @@ -202,8 +204,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to this invite, but they have other permissions to the same account. | - | -**404** | Not found. The user doesn't have any permissions to the invite or the invite does not exist. | - | +**403** | Forbidden. The user doesn't have permission to this invite, but they have other permissions to the same account. | - | +**404** | Not found. The user doesn't have any permissions to the invite or the invite does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -227,7 +229,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -250,7 +252,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **invite_id** | **str**| The identifier of the invite. | + **invite_id** | **str**| The identifier of the invite. | ### Return type @@ -270,8 +272,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. Invite accepted. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update the access record. | - | -**404** | Not found. The user doesn't have any permissions to the access record. | - | +**403** | Forbidden. The user doesn't have permission to update the access record. | - | +**404** | Not found. The user doesn't have any permissions to the access record. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/Link.md b/docs/Link.md index 0041865..b52ca7d 100644 --- a/docs/Link.md +++ b/docs/Link.md @@ -5,8 +5,8 @@ A url linking object that complies to application/links+json RFC. Either is an I ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**href** | **str** | The absolute url pointing to the reference resource. | -**rel** | **str** | Optional property indicating the type of link if it is not a default IANA approved global link relation. | [optional] +**href** | **str** | The absolute url pointing to the reference resource. | +**rel** | **str** | Optional property indicating the type of link if it is not a default IANA approved global link relation. | [optional] ## Example @@ -23,7 +23,7 @@ print Link.to_json() # convert the object into a dict link_dict = link_instance.to_dict() # create an instance of Link from a dict -link_form_dict = link.from_dict(link_dict) +link_from_dict = Link.from_dict(link_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/LinkedGroup.md b/docs/LinkedGroup.md index 0763d42..f892907 100644 --- a/docs/LinkedGroup.md +++ b/docs/LinkedGroup.md @@ -5,7 +5,7 @@ The referenced group ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**group_id** | **str** | | +**group_id** | **str** | Unique identifier for the groupId, can be specified on record creation. Must begin with grp_. | ## Example @@ -22,7 +22,7 @@ print LinkedGroup.to_json() # convert the object into a dict linked_group_dict = linked_group_instance.to_dict() # create an instance of LinkedGroup from a dict -linked_group_form_dict = linked_group.from_dict(linked_group_dict) +linked_group_from_dict = LinkedGroup.from_dict(linked_group_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Links.md b/docs/Links.md index 66aec30..d0f630e 100644 --- a/docs/Links.md +++ b/docs/Links.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**var_self** | [**Link**](Link.md) | | +**var_self** | [**Link**](Link.md) | | ## Example @@ -21,7 +21,7 @@ print Links.to_json() # convert the object into a dict links_dict = links_instance.to_dict() # create an instance of Links from a dict -links_form_dict = links.from_dict(links_dict) +links_from_dict = Links.from_dict(links_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/MetadataObject.md b/docs/MetadataObject.md deleted file mode 100644 index 7ce4de8..0000000 --- a/docs/MetadataObject.md +++ /dev/null @@ -1,31 +0,0 @@ -# MetadataObject - -Metadata and additional properties relevant. - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**account** | [**MetadataObjectAccount**](MetadataObjectAccount.md) | | [optional] -**user_id** | **str** | | -**metadata** | **object** | A JSON object limited to 10KB. The owner identified by the sub will always have access to read and update this data. Service clients may have access if the related property on the client is set. Access is restricted to authorized users. | - -## Example - -```python -from authress.models.metadata_object import MetadataObject - -# TODO update the JSON string below -json = "{}" -# create an instance of MetadataObject from a JSON string -metadata_object_instance = MetadataObject.from_json(json) -# print the JSON string representation of the object -print MetadataObject.to_json() - -# convert the object into a dict -metadata_object_dict = metadata_object_instance.to_dict() -# create an instance of MetadataObject from a dict -metadata_object_form_dict = metadata_object.from_dict(metadata_object_dict) -``` -[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) - - diff --git a/docs/MetadataObjectAccount.md b/docs/MetadataObjectAccount.md deleted file mode 100644 index dd40cb6..0000000 --- a/docs/MetadataObjectAccount.md +++ /dev/null @@ -1,28 +0,0 @@ -# MetadataObjectAccount - - -## Properties -Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- -**account_id** | **str** | | [optional] - -## Example - -```python -from authress.models.metadata_object_account import MetadataObjectAccount - -# TODO update the JSON string below -json = "{}" -# create an instance of MetadataObjectAccount from a JSON string -metadata_object_account_instance = MetadataObjectAccount.from_json(json) -# print the JSON string representation of the object -print MetadataObjectAccount.to_json() - -# convert the object into a dict -metadata_object_account_dict = metadata_object_account_instance.to_dict() -# create an instance of MetadataObjectAccount from a dict -metadata_object_account_form_dict = metadata_object_account.from_dict(metadata_object_account_dict) -``` -[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) - - diff --git a/docs/OAuthAuthorizeResponse.md b/docs/OAuthAuthorizeResponse.md index a7d8b27..8e674fd 100644 --- a/docs/OAuthAuthorizeResponse.md +++ b/docs/OAuthAuthorizeResponse.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**code** | **str** | The authorization code to be used with the /tokens endpoint to retrieve an access_token. | +**code** | **str** | The authorization code to be used with the /tokens endpoint to retrieve an access_token. | ## Example @@ -21,7 +21,7 @@ print OAuthAuthorizeResponse.to_json() # convert the object into a dict o_auth_authorize_response_dict = o_auth_authorize_response_instance.to_dict() # create an instance of OAuthAuthorizeResponse from a dict -o_auth_authorize_response_form_dict = o_auth_authorize_response.from_dict(o_auth_authorize_response_dict) +o_auth_authorize_response_from_dict = OAuthAuthorizeResponse.from_dict(o_auth_authorize_response_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/OAuthTokenRequest.md b/docs/OAuthTokenRequest.md index 68cd864..a1f7fce 100644 --- a/docs/OAuthTokenRequest.md +++ b/docs/OAuthTokenRequest.md @@ -5,13 +5,13 @@ The OAuth 2.1 token request that follows [RFC 6749](https://www.rfc-editor.org/r ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**client_id** | **str** | The client identifier to constrain the token to. | -**client_secret** | **str** | The secret associated with the client that authorizes the generation of token it's behalf. (Either the `client_secret` or the `code_verifier` is required) | [optional] -**code_verifier** | **str** | The code verifier is the the value used in the generation of the OAuth authorization request `code_challenge` property. (Either the `client_secret` or the `code_verifier` is required) | [optional] -**grant_type** | **str** | A suggestion to the token generation which type of credentials are being provided. | [optional] -**username** | **str** | When using the user password grant_type, specify the username. Authress recommends this should always be an email address. | [optional] -**password** | **str** | When using the user password grant_type, specify the user's password. | [optional] -**type** | **str** | Enables additional configuration of the grant_type. In the case of user password grant_type, set this to **signup**, to enable the creation of users. Set this to **update**, force update the password associated with the user. | [optional] +**client_id** | **str** | The client identifier to constrain the token to. | +**client_secret** | **str** | The secret associated with the client that authorizes the generation of token it's behalf. (Either the `client_secret` or the `code_verifier` is required) | [optional] +**code_verifier** | **str** | The code verifier is the the value used in the generation of the OAuth authorization request `code_challenge` property. (Either the `client_secret` or the `code_verifier` is required) | [optional] +**grant_type** | **str** | A suggestion to the token generation which type of credentials are being provided. | [optional] +**username** | **str** | When using the user password grant_type, specify the username. Authress recommends this should always be an email address. | [optional] +**password** | **str** | When using the user password grant_type, specify the user's password. | [optional] +**type** | **str** | Enables additional configuration of the grant_type. In the case of user password grant_type, set this to **signup**, to enable the creation of users. Set this to **update**, force update the password associated with the user. | [optional] ## Example @@ -28,7 +28,7 @@ print OAuthTokenRequest.to_json() # convert the object into a dict o_auth_token_request_dict = o_auth_token_request_instance.to_dict() # create an instance of OAuthTokenRequest from a dict -o_auth_token_request_form_dict = o_auth_token_request.from_dict(o_auth_token_request_dict) +o_auth_token_request_from_dict = OAuthTokenRequest.from_dict(o_auth_token_request_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/OAuthTokenResponse.md b/docs/OAuthTokenResponse.md index e2871a2..c7c0c47 100644 --- a/docs/OAuthTokenResponse.md +++ b/docs/OAuthTokenResponse.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**access_token** | **str** | An expiring access token that can be used to access either Authress or any platform service. | +**access_token** | **str** | An expiring access token that can be used to access either Authress or any platform service. | ## Example @@ -21,7 +21,7 @@ print OAuthTokenResponse.to_json() # convert the object into a dict o_auth_token_response_dict = o_auth_token_response_instance.to_dict() # create an instance of OAuthTokenResponse from a dict -o_auth_token_response_form_dict = o_auth_token_response.from_dict(o_auth_token_response_dict) +o_auth_token_response_from_dict = OAuthTokenResponse.from_dict(o_auth_token_response_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Pagination.md b/docs/Pagination.md index 2620203..5dc45f4 100644 --- a/docs/Pagination.md +++ b/docs/Pagination.md @@ -5,7 +5,7 @@ Details containing how to pagination through the collection. Consists of an opti ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**next** | [**PaginationNext**](PaginationNext.md) | | [optional] +**next** | [**PaginationNext**](PaginationNext.md) | | [optional] ## Example @@ -22,7 +22,7 @@ print Pagination.to_json() # convert the object into a dict pagination_dict = pagination_instance.to_dict() # create an instance of Pagination from a dict -pagination_form_dict = pagination.from_dict(pagination_dict) +pagination_from_dict = Pagination.from_dict(pagination_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/PaginationNext.md b/docs/PaginationNext.md index 8fd366d..0e11df7 100644 --- a/docs/PaginationNext.md +++ b/docs/PaginationNext.md @@ -5,7 +5,7 @@ A reference to the next page in the collection, pass the cursor as a query param ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**cursor** | **str** | | +**cursor** | **str** | | ## Example @@ -22,7 +22,7 @@ print PaginationNext.to_json() # convert the object into a dict pagination_next_dict = pagination_next_instance.to_dict() # create an instance of PaginationNext from a dict -pagination_next_form_dict = pagination_next.from_dict(pagination_next_dict) +pagination_next_from_dict = PaginationNext.from_dict(pagination_next_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/PermissionCollection.md b/docs/PermissionCollection.md index ce6171e..e3004fd 100644 --- a/docs/PermissionCollection.md +++ b/docs/PermissionCollection.md @@ -5,9 +5,9 @@ A collect of permissions that the user has to a resource. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**account** | [**PermissionCollectionAccount**](PermissionCollectionAccount.md) | | [optional] -**user_id** | **str** | | -**permissions** | [**List[PermissionObject]**](PermissionObject.md) | A list of the permissions | +**account** | [**PermissionCollectionAccount**](PermissionCollectionAccount.md) | | [optional] +**user_id** | **str** | | +**permissions** | [**List[PermissionObject]**](PermissionObject.md) | A list of the permissions | ## Example @@ -24,7 +24,7 @@ print PermissionCollection.to_json() # convert the object into a dict permission_collection_dict = permission_collection_instance.to_dict() # create an instance of PermissionCollection from a dict -permission_collection_form_dict = permission_collection.from_dict(permission_collection_dict) +permission_collection_from_dict = PermissionCollection.from_dict(permission_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/PermissionCollectionAccount.md b/docs/PermissionCollectionAccount.md index beeba6c..9b6e285 100644 --- a/docs/PermissionCollectionAccount.md +++ b/docs/PermissionCollectionAccount.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**account_id** | **str** | | [optional] +**account_id** | **str** | | [optional] ## Example @@ -21,7 +21,7 @@ print PermissionCollectionAccount.to_json() # convert the object into a dict permission_collection_account_dict = permission_collection_account_instance.to_dict() # create an instance of PermissionCollectionAccount from a dict -permission_collection_account_form_dict = permission_collection_account.from_dict(permission_collection_account_dict) +permission_collection_account_from_dict = PermissionCollectionAccount.from_dict(permission_collection_account_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/PermissionObject.md b/docs/PermissionObject.md index dc0c333..12e0c6b 100644 --- a/docs/PermissionObject.md +++ b/docs/PermissionObject.md @@ -5,10 +5,10 @@ The collective action and associate grants on a permission ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**action** | **str** | The action the permission grants, can be scoped using `:` and parent actions imply sub-resource permissions, action:* or action implies action:sub-action. This property is case-insensitive, it will always be cast to lowercase before comparing actions to user permissions. | -**allow** | **bool** | Does this permission grant the user the ability to execute the action? | -**grant** | **bool** | Allows the user to give the permission to others without being able to execute the action. | -**delegate** | **bool** | Allows delegating or granting the permission to others without being able to execute the action. | +**action** | **str** | The action the permission grants, can be scoped using `:` and parent actions imply sub-resource permissions, action:* or action implies action:sub-action. This property is case-insensitive, it will always be cast to lowercase before comparing actions to user permissions. | +**allow** | **bool** | Does this permission grant the user the ability to execute the action? | +**grant** | **bool** | Allows the user to give the permission to others without being able to execute the action. | +**delegate** | **bool** | Allows delegating or granting the permission to others without being able to execute the action. | ## Example @@ -25,7 +25,7 @@ print PermissionObject.to_json() # convert the object into a dict permission_object_dict = permission_object_instance.to_dict() # create an instance of PermissionObject from a dict -permission_object_form_dict = permission_object.from_dict(permission_object_dict) +permission_object_from_dict = PermissionObject.from_dict(permission_object_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/PermissionedResource.md b/docs/PermissionedResource.md index 8a088f9..6ab693d 100644 --- a/docs/PermissionedResource.md +++ b/docs/PermissionedResource.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**permissions** | [**List[ResourcePermission]**](ResourcePermission.md) | | +**permissions** | [**List[ResourcePermission]**](ResourcePermission.md) | | ## Example @@ -21,7 +21,7 @@ print PermissionedResource.to_json() # convert the object into a dict permissioned_resource_dict = permissioned_resource_instance.to_dict() # create an instance of PermissionedResource from a dict -permissioned_resource_form_dict = permissioned_resource.from_dict(permissioned_resource_dict) +permissioned_resource_from_dict = PermissionedResource.from_dict(permissioned_resource_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/PermissionedResourceCollection.md b/docs/PermissionedResourceCollection.md index e6a7742..a775f18 100644 --- a/docs/PermissionedResourceCollection.md +++ b/docs/PermissionedResourceCollection.md @@ -5,9 +5,9 @@ A collection of resource permissions that have been defined. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**resources** | [**List[PermissionedResource]**](PermissionedResource.md) | | -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**resources** | [**List[PermissionedResource]**](PermissionedResource.md) | | +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print PermissionedResourceCollection.to_json() # convert the object into a dict permissioned_resource_collection_dict = permissioned_resource_collection_instance.to_dict() # create an instance of PermissionedResourceCollection from a dict -permissioned_resource_collection_form_dict = permissioned_resource_collection.from_dict(permissioned_resource_collection_dict) +permissioned_resource_collection_from_dict = PermissionedResourceCollection.from_dict(permissioned_resource_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/README.md b/docs/README.md index 1da4e93..13d0e8f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -68,6 +68,7 @@ Class | Method | HTTP request | Description `authress.tenants` | [**get_tenant**](./TenantsApi.md#get_tenant) | **GET** /v1/tenants/{tenantId} | Retrieve tenant `authress.tenants` | [**get_tenants**](./TenantsApi.md#get_tenants) | **GET** /v1/tenants | List tenants `authress.tenants` | [**update_tenant**](./TenantsApi.md#update_tenant) | **PUT** /v1/tenants/{tenantId} | Update tenant +`authress.tenants` | [**link_tenant_user**](./TenantsApi.md#link_tenant_user) | **PATCH** /v1/tenants/{tenantId} | Link tenant user `authress.user_permissions` | [**authorize_user**](./UserPermissionsApi.md#authorize_user) | **GET** /v1/users/{userId}/resources/{resourceUri}/permissions/{permission} | Verify user authorization `authress.user_permissions` | [**get_user_permissions_for_resource**](./UserPermissionsApi.md#get_user_permissions_for_resource) | **GET** /v1/users/{userId}/resources/{resourceUri}/permissions | Get user permissions for resource `authress.user_permissions` | [**get_user_resources**](./UserPermissionsApi.md#get_user_resources) | **GET** /v1/users/{userId}/resources | List user resources diff --git a/docs/Resource.md b/docs/Resource.md index e3029b2..f941760 100644 --- a/docs/Resource.md +++ b/docs/Resource.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**resource_uri** | **str** | A resource path which can be top level, fully qualified, or end with a *. Parent resources imply permissions to sub-resources. | +**resource_uri** | **str** | A resource path which can be top level, fully qualified, or end with a *. Parent resources imply permissions to sub-resources. | ## Example @@ -21,7 +21,7 @@ print Resource.to_json() # convert the object into a dict resource_dict = resource_instance.to_dict() # create an instance of Resource from a dict -resource_form_dict = resource.from_dict(resource_dict) +resource_from_dict = Resource.from_dict(resource_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ResourcePermission.md b/docs/ResourcePermission.md index 0d06df7..2f5d300 100644 --- a/docs/ResourcePermission.md +++ b/docs/ResourcePermission.md @@ -4,8 +4,8 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**action** | **str** | | -**allow** | **bool** | | +**action** | **str** | | +**allow** | **bool** | | ## Example @@ -22,7 +22,7 @@ print ResourcePermission.to_json() # convert the object into a dict resource_permission_dict = resource_permission_instance.to_dict() # create an instance of ResourcePermission from a dict -resource_permission_form_dict = resource_permission.from_dict(resource_permission_dict) +resource_permission_from_dict = ResourcePermission.from_dict(resource_permission_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/ResourcePermissionsApi.md b/docs/ResourcePermissionsApi.md index 43f8e75..f5f0939 100644 --- a/docs/ResourcePermissionsApi.md +++ b/docs/ResourcePermissionsApi.md @@ -1,4 +1,6 @@ # authress.ResourcePermissionsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**get_permissioned_resource**](ResourcePermissionsApi.md#get_permissioned_resource) | **GET** /v1/resources/{resourceUri} | Retrieve resource configuration @@ -27,7 +29,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -50,7 +52,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | + **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | ### Return type @@ -70,7 +72,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**404** | Not found. The user doesn't have permission to the resource. | - | +**404** | Not found. The user doesn't have permission to the resource. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -79,7 +81,7 @@ Name | Type | Description | Notes List all resource configurations -Permissions can be set globally at a resource level. Lists any resources with a globally set resource policy. +Permissions can be set globally at a resource level. This endpoint returns a list of resources with globally set resource permissions. ### Example @@ -94,7 +96,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -156,7 +158,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -181,9 +183,9 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | + **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | **limit** | **int**| Max number of results to return | [optional] [default to 20] - **cursor** | **str**| Continuation cursor for paging | [optional] + **cursor** | **str**| Continuation cursor for paging | [optional] ### Return type @@ -226,7 +228,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -248,8 +250,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | - **permissioned_resource** | [**PermissionedResource**](PermissionedResource.md)| The contents of the permission to set on the resource. Overwrites existing data. | + **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | + **permissioned_resource** | [**PermissionedResource**](PermissionedResource.md)| The contents of the permission to set on the resource. Overwrites existing data. | ### Return type @@ -269,8 +271,8 @@ void (empty response body) |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the resource, but they have other permissions to the same resource. | - | -**404** | Not found. The user doesn't have permission to the resource. | - | +**403** | Forbidden. The user doesn't have permission to the resource, but they have other permissions to the same resource. | - | +**404** | Not found. The user doesn't have permission to the resource. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/ResourceUsersCollection.md b/docs/ResourceUsersCollection.md index 919e400..613ff66 100644 --- a/docs/ResourceUsersCollection.md +++ b/docs/ResourceUsersCollection.md @@ -5,9 +5,9 @@ A collection of users with explicit permission to a resource. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**users** | [**List[UserRoleCollection]**](UserRoleCollection.md) | A list of users | -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**users** | [**List[UserRoleCollection]**](UserRoleCollection.md) | A list of users | +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print ResourceUsersCollection.to_json() # convert the object into a dict resource_users_collection_dict = resource_users_collection_instance.to_dict() # create an instance of ResourceUsersCollection from a dict -resource_users_collection_form_dict = resource_users_collection.from_dict(resource_users_collection_dict) +resource_users_collection_from_dict = ResourceUsersCollection.from_dict(resource_users_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Role.md b/docs/Role.md index 38e5815..b7b3d67 100644 --- a/docs/Role.md +++ b/docs/Role.md @@ -5,10 +5,10 @@ The role which contains a list of permissions. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**role_id** | **str** | Unique identifier for the role, can be specified on creation, and used by records to map to permissions. | -**name** | **str** | A helpful name for this role | -**description** | **str** | A description for when to the user as well as additional information. | [optional] -**permissions** | [**List[PermissionObject]**](PermissionObject.md) | A list of the permissions | +**role_id** | **str** | Unique identifier for the role, can be specified on creation, and used by records to map to permissions. | [optional] +**name** | **str** | A helpful name for this role | +**description** | **str** | A description for when to the user as well as additional information. | [optional] +**permissions** | [**List[PermissionObject]**](PermissionObject.md) | A list of the permissions | ## Example @@ -25,7 +25,7 @@ print Role.to_json() # convert the object into a dict role_dict = role_instance.to_dict() # create an instance of Role from a dict -role_form_dict = role.from_dict(role_dict) +role_from_dict = Role.from_dict(role_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/RoleCollection.md b/docs/RoleCollection.md index 6f5977e..ca599b8 100644 --- a/docs/RoleCollection.md +++ b/docs/RoleCollection.md @@ -5,9 +5,9 @@ A collection of roles ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**roles** | [**List[Role]**](Role.md) | A list of roles | -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**roles** | [**List[Role]**](Role.md) | A list of roles | +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print RoleCollection.to_json() # convert the object into a dict role_collection_dict = role_collection_instance.to_dict() # create an instance of RoleCollection from a dict -role_collection_form_dict = role_collection.from_dict(role_collection_dict) +role_collection_from_dict = RoleCollection.from_dict(role_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/RolesApi.md b/docs/RolesApi.md index 8a0b5ea..63c8480 100644 --- a/docs/RolesApi.md +++ b/docs/RolesApi.md @@ -1,8 +1,10 @@ # authress.RolesApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_role**](RolesApi.md#create_role) | **POST** /v1/roles | Create role -[**delete_role**](RolesApi.md#delete_role) | **DELETE** /v1/roles/{roleId} | Deletes role +[**delete_role**](RolesApi.md#delete_role) | **DELETE** /v1/roles/{roleId} | Delete role [**get_role**](RolesApi.md#get_role) | **GET** /v1/roles/{roleId} | Retrieve role [**get_roles**](RolesApi.md#get_roles) | **GET** /v1/roles | List roles [**update_role**](RolesApi.md#update_role) | **PUT** /v1/roles/{roleId} | Update role @@ -28,7 +30,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -51,7 +53,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **role** | [**Role**](Role.md)| | + **role** | [**Role**](Role.md)| | ### Return type @@ -71,7 +73,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Role created. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the role, but they have other permissions to the same account. | - | +**403** | Forbidden. The user doesn't have permission to the role, but they have other permissions to the same account. | - | **409** | RoleAlreadyExists. A role with this identifier already exists | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -79,7 +81,7 @@ Name | Type | Description | Notes # **delete_role** > delete_role(role_id) -Deletes role +Delete role Remove a role. If a record references the role, that record will not be modified. @@ -95,7 +97,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -116,7 +118,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **role_id** | **str**| The identifier of the role. | + **role_id** | **str**| The identifier of the role. | ### Return type @@ -136,8 +138,8 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. The role has been deleted | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete the role. | - | -**404** | Not found. The user doesn't have any permissions to the resource or the role no longer exists. | - | +**403** | Forbidden. The user doesn't have permission to delete the role. | - | +**404** | Not found. The user doesn't have any permissions to the resource or the role no longer exists. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -161,7 +163,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -184,7 +186,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **role_id** | **str**| The identifier of the role. | + **role_id** | **str**| The identifier of the role. | ### Return type @@ -204,13 +206,13 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the role, but they have other permissions to the same account. | - | -**404** | Not found. The user doesn't have any permissions to the role or this role does not exist. | - | +**403** | Forbidden. The user doesn't have permission to the role, but they have other permissions to the same account. | - | +**404** | Not found. The user doesn't have any permissions to the role or this role does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) # **get_roles** -> RoleCollection get_roles() +> RoleCollection get_roles(limit=limit, cursor=cursor, filter=filter) List roles @@ -229,7 +231,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -248,7 +250,12 @@ except Exception as e: ### Parameters -This endpoint does not need any parameter. + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **limit** | **int**| Max number of results to return. | [optional] [default to 100] + **cursor** | **str**| Continuation cursor for paging. | [optional] + **filter** | **str**| Filter to search roles by. This is a case insensitive search. | [optional] ### Return type @@ -268,7 +275,7 @@ This endpoint does not need any parameter. |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to account roles, but they have other permissions to the same account. | - | +**403** | Forbidden. The user doesn't have permission to account roles, but they have other permissions to the same account. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -292,7 +299,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -316,8 +323,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **role_id** | **str**| The identifier of the role. | - **role** | [**Role**](Role.md)| | + **role_id** | **str**| The identifier of the role. | + **role** | [**Role**](Role.md)| | ### Return type @@ -337,8 +344,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. Role updated. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the role, but they have other permissions to the same account. | - | -**404** | Not found. The user doesn't have any permissions to the role or this role does not exist. | - | +**403** | Forbidden. The user doesn't have permission to the role, but they have other permissions to the same account. | - | +**404** | Not found. The user doesn't have any permissions to the role or this role does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/ServiceClientsApi.md b/docs/ServiceClientsApi.md index bccfdf8..b7384ad 100644 --- a/docs/ServiceClientsApi.md +++ b/docs/ServiceClientsApi.md @@ -1,4 +1,6 @@ # authress.ServiceClientsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_client**](ServiceClientsApi.md#create_client) | **POST** /v1/clients | Create service client @@ -30,7 +32,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -53,7 +55,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **client** | [**Client**](Client.md)| | + **client** | [**Client**](Client.md)| | ### Return type @@ -95,7 +97,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -117,8 +119,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **client_id** | **str**| The unique identifier of the client. | - **key_id** | **str**| The ID of the access key to remove from the client. | + **client_id** | **str**| The unique identifier of the client. | + **key_id** | **str**| The ID of the access key to remove from the client. | ### Return type @@ -138,8 +140,8 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. The access key has been deleted. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete access keys from a client. | - | -**404** | Not found. The user doesn't have any permissions to the client or the client does not exist. | - | +**403** | Forbidden. The user doesn't have permission to delete access keys from a client. | - | +**404** | Not found. The user doesn't have any permissions to the client or the client does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -162,7 +164,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -183,7 +185,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **client_id** | **str**| The unique identifier for the client. | + **client_id** | **str**| The unique identifier for the client. | ### Return type @@ -203,8 +205,8 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. The client was deleted. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete the client. | - | -**404** | Not found. The user doesn't have any permission to the client or the client does not exist | - | +**403** | Forbidden. The user doesn't have permission to delete the client. | - | +**404** | Not found. The user doesn't have any permission to the client or the client does not exist | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -228,7 +230,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -251,7 +253,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **client_id** | **str**| The unique identifier for the client. | + **client_id** | **str**| The unique identifier for the client. | ### Return type @@ -271,7 +273,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**404** | Not found. The user doesn't have permissions to the client or the client does not exist. | - | +**404** | Not found. The user doesn't have permissions to the client or the client does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -295,7 +297,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -320,7 +322,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **limit** | **int**| Max number of results to return | [optional] [default to 20] - **cursor** | **str**| Continuation cursor for paging. | [optional] + **cursor** | **str**| Continuation cursor for paging. | [optional] ### Return type @@ -340,7 +342,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to the resource, but they have other permissions to the same resource. | - | +**403** | Forbidden. The user doesn't have permission to the resource, but they have other permissions to the same resource. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -349,7 +351,7 @@ Name | Type | Description | Notes Generate service client access key -Create a new access key for the client so that a service can authenticate with Authress as that client. Using the client will allow delegation of permission checking of users. (Limited to 5 Active keys per client) +Create a new access key for the client or upload a compliant public key, so that a service can authenticate with Authress as that client. Using the client will allow delegation of permission checking of users. Enables machine-to-machine authentication between your services and with your end users. (There is a limit of 5 Active keys per client) ### Example @@ -364,7 +366,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -387,7 +389,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **client_id** | **str**| The unique identifier of the client. | + **client_id** | **str**| The unique identifier of the client. | ### Return type @@ -407,8 +409,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to create access keys for the client. | - | -**404** | Not found. The user doesn't have any permissions to client or the client does not exist. | - | +**403** | Forbidden. The user doesn't have permission to create access keys for the client. | - | +**404** | Not found. The user doesn't have any permissions to client or the client does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -432,7 +434,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -456,8 +458,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **client_id** | **str**| The unique identifier for the client. | - **client** | [**Client**](Client.md)| | + **client_id** | **str**| The unique identifier for the client. | + **client** | [**Client**](Client.md)| | ### Return type @@ -477,8 +479,8 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. The client was updated | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update the client. | - | -**404** | Not found. The user doesn't have permission to the account or the client does not exist. | - | +**403** | Forbidden. The user doesn't have permission to update the client. | - | +**404** | Not found. The user doesn't have permission to the account or the client does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/Statement.md b/docs/Statement.md index 2bbd07c..65882c6 100644 --- a/docs/Statement.md +++ b/docs/Statement.md @@ -4,10 +4,10 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**roles** | **List[str]** | | -**resources** | [**List[Resource]**](Resource.md) | | -**users** | [**List[User]**](User.md) | The list of users this statement applies to. Users and groups can be set at either the statement level or the record level, but not both. | [optional] -**groups** | [**List[LinkedGroup]**](LinkedGroup.md) | The list of groups this statement applies to. Users in these groups will be receive access to the resources listed. Users and groups can be set at either the statement level or the record level, but not both. | [optional] +**roles** | **List[str]** | | +**resources** | [**List[Resource]**](Resource.md) | | +**users** | [**List[User]**](User.md) | The list of users this statement applies to. Users and groups can be set at either the statement level or the record level, but not both. | [optional] +**groups** | [**List[LinkedGroup]**](LinkedGroup.md) | The list of groups this statement applies to. Users in these groups will be receive access to the resources listed. Users and groups can be set at either the statement level or the record level, but not both. | [optional] ## Example @@ -24,7 +24,7 @@ print Statement.to_json() # convert the object into a dict statement_dict = statement_instance.to_dict() # create an instance of Statement from a dict -statement_form_dict = statement.from_dict(statement_dict) +statement_from_dict = Statement.from_dict(statement_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/Tenant.md b/docs/Tenant.md index f273f69..0e2f792 100644 --- a/docs/Tenant.md +++ b/docs/Tenant.md @@ -4,11 +4,12 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**tenant_id** | **str** | | -**tenant_lookup_identifier** | **str** | | [optional] -**data** | [**TenantData**](TenantData.md) | | [optional] -**connection** | [**TenantConnection**](TenantConnection.md) | | [optional] -**created_time** | **datetime** | | [optional] [readonly] +**tenant_id** | **str** | | [optional] +**tenant_lookup_identifier** | **str** | | [optional] +**data** | [**TenantData**](TenantData.md) | | [optional] +**domains** | [**List[TenantDomain]**](TenantDomain.md) | The associated user email domains that are mapped to this tenant. When a user starts the authentication process, if they are using SSO, Authress will use their specified email address to identify which Authress Tenant to log the user in with. | [optional] +**connection** | [**TenantConnection**](TenantConnection.md) | | [optional] +**created_time** | **datetime** | | [optional] [readonly] ## Example @@ -25,7 +26,7 @@ print Tenant.to_json() # convert the object into a dict tenant_dict = tenant_instance.to_dict() # create an instance of Tenant from a dict -tenant_form_dict = tenant.from_dict(tenant_dict) +tenant_from_dict = Tenant.from_dict(tenant_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/TenantCollection.md b/docs/TenantCollection.md index beea472..be5575b 100644 --- a/docs/TenantCollection.md +++ b/docs/TenantCollection.md @@ -5,8 +5,8 @@ A collection of tenants. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**tenants** | [**List[Tenant]**](Tenant.md) | | -**pagination** | [**Pagination**](Pagination.md) | | [optional] +**tenants** | [**List[Tenant]**](Tenant.md) | | +**pagination** | [**Pagination**](Pagination.md) | | [optional] ## Example @@ -23,7 +23,7 @@ print TenantCollection.to_json() # convert the object into a dict tenant_collection_dict = tenant_collection_instance.to_dict() # create an instance of TenantCollection from a dict -tenant_collection_form_dict = tenant_collection.from_dict(tenant_collection_dict) +tenant_collection_from_dict = TenantCollection.from_dict(tenant_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/TenantConnection.md b/docs/TenantConnection.md index 67270c0..797ab17 100644 --- a/docs/TenantConnection.md +++ b/docs/TenantConnection.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**connection_id** | **str** | | [optional] +**connection_id** | **str** | | [optional] ## Example @@ -21,7 +21,7 @@ print TenantConnection.to_json() # convert the object into a dict tenant_connection_dict = tenant_connection_instance.to_dict() # create an instance of TenantConnection from a dict -tenant_connection_form_dict = tenant_connection.from_dict(tenant_connection_dict) +tenant_connection_from_dict = TenantConnection.from_dict(tenant_connection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/TenantData.md b/docs/TenantData.md index 7971bdb..fc82f91 100644 --- a/docs/TenantData.md +++ b/docs/TenantData.md @@ -4,7 +4,7 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**name** | **str** | | [optional] +**name** | **str** | | [optional] ## Example @@ -21,7 +21,7 @@ print TenantData.to_json() # convert the object into a dict tenant_data_dict = tenant_data_instance.to_dict() # create an instance of TenantData from a dict -tenant_data_form_dict = tenant_data.from_dict(tenant_data_dict) +tenant_data_from_dict = TenantData.from_dict(tenant_data_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/TenantDomain.md b/docs/TenantDomain.md new file mode 100644 index 0000000..084e201 --- /dev/null +++ b/docs/TenantDomain.md @@ -0,0 +1,29 @@ +# TenantDomain + +The tenant linked domain configuration. + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**domain** | **str** | The tenant linked domain. | + +## Example + +```python +from authress.models.tenant_domain import TenantDomain + +# TODO update the JSON string below +json = "{}" +# create an instance of TenantDomain from a JSON string +tenant_domain_instance = TenantDomain.from_json(json) +# print the JSON string representation of the object +print TenantDomain.to_json() + +# convert the object into a dict +tenant_domain_dict = tenant_domain_instance.to_dict() +# create an instance of TenantDomain from a dict +tenant_domain_from_dict = TenantDomain.from_dict(tenant_domain_dict) +``` +[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) + + diff --git a/docs/TenantUser.md b/docs/TenantUser.md new file mode 100644 index 0000000..a3f3bb5 --- /dev/null +++ b/docs/TenantUser.md @@ -0,0 +1,28 @@ +# TenantUser + + +## Properties +Name | Type | Description | Notes +------------ | ------------- | ------------- | ------------- +**user_id** | **str** | | [optional] + +## Example + +```python +from authress.models.tenant_user import TenantUser + +# TODO update the JSON string below +json = "{}" +# create an instance of TenantUser from a JSON string +tenant_user_instance = TenantUser.from_json(json) +# print the JSON string representation of the object +print TenantUser.to_json() + +# convert the object into a dict +tenant_user_dict = tenant_user_instance.to_dict() +# create an instance of TenantUser from a dict +tenant_user_from_dict = TenantUser.from_dict(tenant_user_dict) +``` +[[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) + + diff --git a/docs/TenantsApi.md b/docs/TenantsApi.md index c3f550f..2b9161d 100644 --- a/docs/TenantsApi.md +++ b/docs/TenantsApi.md @@ -1,10 +1,13 @@ # authress.TenantsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**create_tenant**](TenantsApi.md#create_tenant) | **POST** /v1/tenants | Create tenant [**delete_tenant**](TenantsApi.md#delete_tenant) | **DELETE** /v1/tenants/{tenantId} | Delete tenant [**get_tenant**](TenantsApi.md#get_tenant) | **GET** /v1/tenants/{tenantId} | Retrieve tenant [**get_tenants**](TenantsApi.md#get_tenants) | **GET** /v1/tenants | List tenants +[**link_tenant_user**](TenantsApi.md#link_tenant_user) | **PATCH** /v1/tenants/{tenantId}/users | Link tenant user [**update_tenant**](TenantsApi.md#update_tenant) | **PUT** /v1/tenants/{tenantId} | Update tenant @@ -28,7 +31,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -51,7 +54,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **tenant** | [**Tenant**](Tenant.md)| | + **tenant** | [**Tenant**](Tenant.md)| | ### Return type @@ -71,7 +74,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **201** | Success. Tenant created | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to create tenants. | - | +**403** | Forbidden. The user doesn't have permission to create tenants. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -95,7 +98,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -115,7 +118,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **tenant_id** | **str**| The tenantId. | + **tenant_id** | **str**| The tenantId. | ### Return type @@ -135,7 +138,7 @@ void (empty response body) |-------------|-------------|------------------| **204** | Success. Tenant deleted | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete tenant. | - | +**403** | Forbidden. The user doesn't have permission to delete tenant. | - | **404** | Not found. The tenant does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -161,7 +164,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -184,7 +187,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **tenant_id** | **str**| The tenantId. | + **tenant_id** | **str**| The tenantId. | ### Return type @@ -204,7 +207,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to get the tenant. | - | +**403** | Forbidden. The user doesn't have permission to get the tenant. | - | **404** | Not found. The tenant does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -229,7 +232,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -267,7 +270,76 @@ This endpoint does not need any parameter. |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to fetch account tenants, but has other account permissions. | - | +**403** | Forbidden. The user doesn't have permission to fetch account tenants, but has other account permissions. | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **link_tenant_user** +> link_tenant_user(tenant_id, tenant_user) + +Link tenant user + +Links an existing user to an existing tenant. This allows the user to log in via that tenant. Users that are linked with a tenant, will also be returned when fetching all the users linked with that tenant via the getUsers endpoint. + +### Example + +* Bearer (JWT) Authentication (oauth2): +```python +import time +import os +import authress +from authress.models.tenant import Tenant +from authress.rest import ApiException +from pprint import pprint + + +# Authress custom domain or if there isn't one yet, use the authress account specific url +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" + +# The Service Client Access Key for your service client. +service_client_access_key = "sc_key_001" +authress_client = AuthressClient(authress_api_url=authress_api_url , service_client_access_key=service_client_access_key) + +tenant = authress.Tenant() # Tenant | + +try: + # Link tenant user + api_response = authress_client.tenants.link_tenant_user(tenant_id, tenant_user) + print("The response of TenantsApi->create_tenant:\n") + pprint(api_response) +except Exception as e: + print("Exception when calling TenantsApi->create_tenant: %s\n" % e) +``` + + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tenant_id** | **str**| The tenantId. | + **tenant_user** | [**TenantUser**](TenantUser.md)| | + +### Return type + +void (empty response body) + +### Authorization + +[oauth2](../README.md#oauth2) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**204** | Success. User added to tenant. | - | +**401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | +**403** | Forbidden. The user doesn't have permission to update tenant. | - | +**404** | Not found. The tenant does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -292,7 +364,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -316,8 +388,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **tenant_id** | **str**| The tenantId. | - **tenant** | [**Tenant**](Tenant.md)| | + **tenant_id** | **str**| The tenantId. | + **tenant** | [**Tenant**](Tenant.md)| | ### Return type @@ -337,7 +409,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. Tenant updated | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to update tenant. | - | +**403** | Forbidden. The user doesn't have permission to update tenant. | - | **404** | Not found. The tenant does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/TokenRequest.md b/docs/TokenRequest.md index 6afb450..a5120b0 100644 --- a/docs/TokenRequest.md +++ b/docs/TokenRequest.md @@ -4,8 +4,8 @@ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**statements** | [**List[Statement]**](Statement.md) | A list of statements which match roles to resources. The token will have all statements apply to it. | -**expires** | **datetime** | The ISO8601 datetime when the token will expire. Default is 24 hours from now. | +**statements** | [**List[Statement]**](Statement.md) | A list of statements which match roles to resources. The token will have all statements apply to it. | +**expires** | **datetime** | The ISO8601 datetime when the token will expire. Default is 24 hours from now. | ## Example @@ -22,7 +22,7 @@ print TokenRequest.to_json() # convert the object into a dict token_request_dict = token_request_instance.to_dict() # create an instance of TokenRequest from a dict -token_request_form_dict = token_request.from_dict(token_request_dict) +token_request_from_dict = TokenRequest.from_dict(token_request_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/User.md b/docs/User.md index 8887f79..ee383f2 100644 --- a/docs/User.md +++ b/docs/User.md @@ -5,7 +5,7 @@ A user object that identifies a user. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**user_id** | **str** | | +**user_id** | **str** | | ## Example @@ -22,7 +22,7 @@ print User.to_json() # convert the object into a dict user_dict = user_instance.to_dict() # create an instance of User from a dict -user_form_dict = user.from_dict(user_dict) +user_from_dict = User.from_dict(user_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UserConnectionCredentials.md b/docs/UserConnectionCredentials.md index a602b1e..d8476cc 100644 --- a/docs/UserConnectionCredentials.md +++ b/docs/UserConnectionCredentials.md @@ -5,7 +5,7 @@ The user credentials for this connection which can be used to access the connect ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**access_token** | **str** | The access token. | +**access_token** | **str** | The access token. | ## Example @@ -22,7 +22,7 @@ print UserConnectionCredentials.to_json() # convert the object into a dict user_connection_credentials_dict = user_connection_credentials_instance.to_dict() # create an instance of UserConnectionCredentials from a dict -user_connection_credentials_form_dict = user_connection_credentials.from_dict(user_connection_credentials_dict) +user_connection_credentials_from_dict = UserConnectionCredentials.from_dict(user_connection_credentials_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UserIdentity.md b/docs/UserIdentity.md index c8de8e8..3cf386f 100644 --- a/docs/UserIdentity.md +++ b/docs/UserIdentity.md @@ -5,10 +5,10 @@ The composite user identity stored in Authress sourced by the customer SSO/SAML/ ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**user_id** | **str** | The user identifier. | -**name** | **str** | The user's formatted display name. | [optional] -**picture** | **str** | A url that resolves to a picture that can be rendered. | [optional] -**email** | **str** | The user's verified email address sourced from their SSO IdP. | [optional] +**user_id** | **str** | | +**name** | **str** | The user's formatted display name. | [optional] +**picture** | **str** | A url that resolves to a picture that can be rendered. | [optional] +**email** | **str** | The user's verified email address sourced from their SSO IdP. | [optional] ## Example @@ -25,7 +25,7 @@ print UserIdentity.to_json() # convert the object into a dict user_identity_dict = user_identity_instance.to_dict() # create an instance of UserIdentity from a dict -user_identity_form_dict = user_identity.from_dict(user_identity_dict) +user_identity_from_dict = UserIdentity.from_dict(user_identity_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UserIdentityCollection.md b/docs/UserIdentityCollection.md index 46f0cb8..0e8c7f6 100644 --- a/docs/UserIdentityCollection.md +++ b/docs/UserIdentityCollection.md @@ -5,9 +5,9 @@ A collection of user identities ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**users** | [**List[UserIdentity]**](UserIdentity.md) | A list of users | -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**users** | [**List[UserIdentity]**](UserIdentity.md) | A list of users | +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -24,7 +24,7 @@ print UserIdentityCollection.to_json() # convert the object into a dict user_identity_collection_dict = user_identity_collection_instance.to_dict() # create an instance of UserIdentityCollection from a dict -user_identity_collection_form_dict = user_identity_collection.from_dict(user_identity_collection_dict) +user_identity_collection_from_dict = UserIdentityCollection.from_dict(user_identity_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UserPermissionsApi.md b/docs/UserPermissionsApi.md index 0a17dc6..8a9ae72 100644 --- a/docs/UserPermissionsApi.md +++ b/docs/UserPermissionsApi.md @@ -1,4 +1,6 @@ # authress.UserPermissionsApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**authorize_user**](UserPermissionsApi.md#authorize_user) | **GET** /v1/users/{userId}/resources/{resourceUri}/permissions/{permission} | Verify user authorization @@ -28,7 +30,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -51,9 +53,9 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| The user to check permissions on | - **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed, the resource must be a full path. | - **permission** | **str** | Permission to check, '*' and scoped permissions can also be checked here. | + **user_id** | **str**| The user identifier to check and verify the permissions of. | + **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed, the resource must be a full path. | + **permission** | **str**| Permission to check, '*' and scoped permissions can also be checked here. | ### Return type @@ -73,8 +75,8 @@ void (empty response body) |-------------|-------------|------------------| **200** | Success. The user has permissions | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The requestor of the authorization check doesn't have the required permission to check the user's authorization. | - | -**404** | Not found. The user doesn't have any permissions to the resource including the one requested. | - | +**403** | Forbidden. The requestor of the authorization check doesn't have the required permission to check the user's authorization. | - | +**404** | Not found. The user doesn't have any permissions to the resource including the one requested. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -83,7 +85,7 @@ void (empty response body) Get user permissions for resource -Get a summary of the permissions a user has to a particular resource. +Get a summary of the permissions a user has to a particular resource. For real time authorization checks, specify the permission. ### Example @@ -99,7 +101,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -123,8 +125,8 @@ authress_client = AuthressClient(authress_api_url=authress_api_url , service_cli Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| The user to check permissions on | - **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | + **user_id** | **str**| The user identifier for the user to check permissions. | + **resource_uri** | **str**| The uri path of a resource to validate, must be URL encoded, uri segments are allowed. | ### Return type @@ -144,7 +146,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. The user has permissions | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**404** | Not found. The user doesn't have any permissions to the resource. | - | +**404** | Not found. The user doesn't have any permissions to the resource. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -170,7 +172,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -198,12 +200,12 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| The user to check permissions on | - **resource_uri** | **str**| The top level uri path of a resource to query for. Will only match explicit or nested sub-resources. Will not partial match resource names. | [optional] - **collection_configuration** | **str**| `TOP_LEVEL_ONLY` - returns only directly nested resources under the resourceUri. A query to `resourceUri=Collection` will return `Collection/resource_1`.<br>`INCLUDE_NESTED` - will return all sub-resources as well as deeply nested resources that the user has the specified permission to. A query to `resourceUri=Collection` will return `Collection/namespaces/ns/resources/resource_1`.<br><br>To return matching resources for nested resources, set this parameter to `INCLUDE_NESTED`. | [optional] [default to 'TOP_LEVEL_ONLY'] - **permissions** | **str**| Permission to check, '*' and scoped permissions can also be checked here. By default if the user has any permission explicitly to a resource, it will be included in the list. | [optional] + **user_id** | **str**| The user identifier for which to list all accessible resources. | + **resource_uri** | **str**| The top level uri path of a resource to query for. Will only match explicit or nested sub-resources. Will not partial match resource names. | [optional] + **collection_configuration** | **str**| `TOP_LEVEL_ONLY` - returns only directly nested resources under the resourceUri. A query to `resourceUri=Collection` will return `Collection/resource_1`.<br>`INCLUDE_NESTED` - will return all sub-resources as well as deeply nested resources that the user has the specified permission to. A query to `resourceUri=Collection` will return `Collection/namespaces/ns/resources/resource_1`.<br><br>To return matching resources for nested resources, set this parameter to `INCLUDE_NESTED`. | [optional] [default to 'TOP_LEVEL_ONLY'] + **permissions** | **str**| Permission to check, '*' and scoped permissions can also be checked here. By default if the user has any permission explicitly to a resource, it will be included in the list. | [optional] **limit** | **int**| Max number of results to return | [optional] [default to 20] - **cursor** | **str**| Continuation cursor for paging | [optional] + **cursor** | **str**| Continuation cursor for paging | [optional] ### Return type @@ -231,7 +233,7 @@ Name | Type | Description | Notes Get user roles for resource -Get a summary of the roles a user has to a particular resource. Users can be assigned roles from multiple access records, this may cause the same role to appear in the list more than once. +Get a summary of the roles a user has to a particular resource. Users can be assigned roles from multiple access records, this may cause the same role to appear in the list more than once. Only contains explicity roles assigned to the user for the specified resources. Roles granted to the user for the resource due to a parent resource assignment are not returned. For real time authorization checks, use the /permission endpoint and specify the explicit permission. ### Example @@ -247,7 +249,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -271,8 +273,8 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| The user to get roles for. | - **resource_uri** | **str**| The uri path of a resource to get roles for, must be URL encoded. Checks for explicit resource roles, roles attached to parent resources are not returned. | + **user_id** | **str**| The user to get roles for. | + **resource_uri** | **str**| The uri path of a resource to get roles for, must be URL encoded. Checks for explicit resource roles, roles attached to parent resources are not returned. | ### Return type @@ -292,7 +294,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. The user has roles | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**404** | Not found. The user doesn't have any permissions to the resource. | - | +**404** | Not found. The user doesn't have any roles to the resource. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/docs/UserResourcesCollection.md b/docs/UserResourcesCollection.md index 1220dba..4ccddb6 100644 --- a/docs/UserResourcesCollection.md +++ b/docs/UserResourcesCollection.md @@ -5,11 +5,11 @@ A collect of permissions that the user has to a resource. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**account** | [**PermissionCollectionAccount**](PermissionCollectionAccount.md) | | [optional] -**user_id** | **str** | | -**resources** | [**List[Resource]**](Resource.md) | A list of the resources the user has some permission to. | [optional] -**pagination** | [**Pagination**](Pagination.md) | | [optional] -**links** | [**CollectionLinks**](CollectionLinks.md) | | +**account** | [**PermissionCollectionAccount**](PermissionCollectionAccount.md) | | [optional] +**user_id** | **str** | | +**resources** | [**List[Resource]**](Resource.md) | A list of the resources the user has some permission to. | [optional] +**pagination** | [**Pagination**](Pagination.md) | | [optional] +**links** | [**CollectionLinks**](CollectionLinks.md) | | ## Example @@ -26,7 +26,7 @@ print UserResourcesCollection.to_json() # convert the object into a dict user_resources_collection_dict = user_resources_collection_instance.to_dict() # create an instance of UserResourcesCollection from a dict -user_resources_collection_form_dict = user_resources_collection.from_dict(user_resources_collection_dict) +user_resources_collection_from_dict = UserResourcesCollection.from_dict(user_resources_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UserRole.md b/docs/UserRole.md index 64789a2..4889761 100644 --- a/docs/UserRole.md +++ b/docs/UserRole.md @@ -5,7 +5,7 @@ A role with associated role data. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**role_id** | **str** | | +**role_id** | **str** | Unique identifier for the role, can be specified on creation, and used by records to map to permissions. | ## Example @@ -22,7 +22,7 @@ print UserRole.to_json() # convert the object into a dict user_role_dict = user_role_instance.to_dict() # create an instance of UserRole from a dict -user_role_form_dict = user_role.from_dict(user_role_dict) +user_role_from_dict = UserRole.from_dict(user_role_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UserRoleCollection.md b/docs/UserRoleCollection.md index e9362bc..5ea0b9f 100644 --- a/docs/UserRoleCollection.md +++ b/docs/UserRoleCollection.md @@ -5,8 +5,8 @@ A collect of roles that the user has to a resource. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**user_id** | **str** | | -**roles** | [**List[UserRole]**](UserRole.md) | A list of the roles | +**user_id** | **str** | | +**roles** | [**List[UserRole]**](UserRole.md) | A list of the roles | ## Example @@ -23,7 +23,7 @@ print UserRoleCollection.to_json() # convert the object into a dict user_role_collection_dict = user_role_collection_instance.to_dict() # create an instance of UserRoleCollection from a dict -user_role_collection_form_dict = user_role_collection.from_dict(user_role_collection_dict) +user_role_collection_from_dict = UserRoleCollection.from_dict(user_role_collection_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UserToken.md b/docs/UserToken.md index 8db9789..74ac895 100644 --- a/docs/UserToken.md +++ b/docs/UserToken.md @@ -5,11 +5,11 @@ A JWT token with represents the user. ## Properties Name | Type | Description | Notes ------------ | ------------- | ------------- | ------------- -**account** | [**PermissionCollectionAccount**](PermissionCollectionAccount.md) | | [optional] -**user_id** | **str** | | -**token_id** | **str** | The unique identifier for the token | -**token** | **str** | The access token | -**links** | [**AccountLinks**](AccountLinks.md) | | [optional] +**account** | [**PermissionCollectionAccount**](PermissionCollectionAccount.md) | | [optional] +**user_id** | **str** | | +**token_id** | **str** | The unique identifier for the token | +**token** | **str** | The access token | +**links** | [**AccountLinks**](AccountLinks.md) | | [optional] ## Example @@ -26,7 +26,7 @@ print UserToken.to_json() # convert the object into a dict user_token_dict = user_token_instance.to_dict() # create an instance of UserToken from a dict -user_token_form_dict = user_token.from_dict(user_token_dict) +user_token_from_dict = UserToken.from_dict(user_token_dict) ``` [[API Models]](./README.md#documentation-for-models) ☆ [[API Endpoints]](./README.md#documentation-for-api-endpoints) ☆ [[Back to Repo]](../README.md) diff --git a/docs/UsersApi.md b/docs/UsersApi.md index 85a8b66..e2c48a5 100644 --- a/docs/UsersApi.md +++ b/docs/UsersApi.md @@ -1,9 +1,12 @@ # authress.UsersApi + + Method | HTTP request | Description ------------- | ------------- | ------------- [**delete_user**](UsersApi.md#delete_user) | **DELETE** /v1/users/{userId} | Delete a user [**get_user**](UsersApi.md#get_user) | **GET** /v1/users/{userId} | Retrieve a user [**get_users**](UsersApi.md#get_users) | **GET** /v1/users | List users +[**link_tenant_user**](UsersApi.md#link_tenant_user) | **PATCH** /v1/tenants/{tenantId}/users | Link tenant user # **delete_user** @@ -26,7 +29,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -47,7 +50,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| The user identifier. | + **user_id** | **str**| The user identifier. | ### Return type @@ -67,7 +70,7 @@ void (empty response body) |-------------|-------------|------------------| **202** | Success. User will be deleted. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to delete users. | - | +**403** | Forbidden. The user doesn't have permission to delete users. | - | **404** | Not found. The user does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -93,7 +96,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -116,7 +119,7 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- - **user_id** | **str**| The user identifier. | + **user_id** | **str**| The user identifier. | ### Return type @@ -136,7 +139,7 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to get user data. | - | +**403** | Forbidden. The user doesn't have permission to get user data. | - | **404** | Not found. The user does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) @@ -162,7 +165,7 @@ from pprint import pprint # Authress custom domain or if there isn't one yet, use the authress account specific url -authress_api_url = "https://authress.company.com" # or "https://ACCOUNT_ID.api.authress.io" +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" # The Service Client Access Key for your service client. service_client_access_key = "sc_key_001" @@ -189,9 +192,9 @@ except Exception as e: Name | Type | Description | Notes ------------- | ------------- | ------------- | ------------- **limit** | **int**| Max number of results to return | [optional] [default to 100] - **cursor** | **str**| Continuation cursor for paging | [optional] - **filter** | **str**| Filter to search users by. This is a case insensitive search through every text field. | [optional] - **tenant_id** | **str**| Return only users that are part of the specified tenant. Users can only be part of one tenant, using this parameter will limit returned users that have logged into this tenant. | [optional] + **cursor** | **str**| Continuation cursor for paging | [optional] + **filter** | **str**| Filter to search users by. This is a case insensitive search through every text field. | [optional] + **tenant_id** | **str**| Return only users that are part of the specified tenant. Users can only be part of one tenant, using this parameter will limit returned users that have logged into this tenant. | [optional] ### Return type @@ -211,7 +214,76 @@ Name | Type | Description | Notes |-------------|-------------|------------------| **200** | Success. | - | **401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | -**403** | Forbidden. The user doesn't have permission to fetch users for the specified, but has other account permissions | - | +**403** | Forbidden. The user doesn't have permission to fetch users for the specified, but has other account permissions | - | + +[[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) + +# **link_tenant_user** +> link_tenant_user(tenant_id, tenant_user) + +Link tenant user + +Links an existing user to an existing tenant. This allows the user to log in via that tenant. Users that are linked with a tenant, will also be returned when fetching all the users linked with that tenant via the getUsers endpoint. + +### Example + +* Bearer (JWT) Authentication (oauth2): +```python +import time +import os +import authress +from authress.models.tenant import Tenant +from authress.rest import ApiException +from pprint import pprint + + +# Authress custom domain or if there isn't one yet, use the authress account specific url +authress_api_url = "https://authress.yourdomain.com" # or "https://ACCOUNT_ID.api.authress.io" + +# The Service Client Access Key for your service client. +service_client_access_key = "sc_key_001" +authress_client = AuthressClient(authress_api_url=authress_api_url , service_client_access_key=service_client_access_key) + +tenant = authress.Tenant() # Tenant | + +try: + # Link tenant user + api_response = authress_client.users.link_tenant_user(tenant_id, tenant_user) + print("The response of TenantsApi->create_tenant:\n") + pprint(api_response) +except Exception as e: + print("Exception when calling TenantsApi->create_tenant: %s\n" % e) +``` + + + +### Parameters + +Name | Type | Description | Notes +------------- | ------------- | ------------- | ------------- + **tenant_id** | **str**| The tenantId. | + **tenant_user** | [**TenantUser**](TenantUser.md)| | + +### Return type + +void (empty response body) + +### Authorization + +[oauth2](../README.md#oauth2) + +### HTTP request headers + + - **Content-Type**: application/json + - **Accept**: Not defined + +### HTTP response details +| Status code | Description | Response headers | +|-------------|-------------|------------------| +**204** | Success. User added to tenant. | - | +**401** | Unauthorized. The request JWT found in the Authorization header is no longer valid. | - | +**403** | Forbidden. The user doesn't have permission to update tenant. | - | +**404** | Not found. The tenant does not exist. | - | [[Back to top]](#) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to Model list]](../README.md#documentation-for-models) [[Back to README]](../README.md) diff --git a/test/test_access_record.py b/test/test_access_record.py index 15ee7c1..137b10f 100644 --- a/test/test_access_record.py +++ b/test/test_access_record.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.access_record import AccessRecord # noqa: E501 -from authress.rest import ApiException class TestAccessRecord(unittest.TestCase): """AccessRecord unit test stubs""" @@ -29,40 +27,40 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccessRecord: """Test AccessRecord include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccessRecord` """ - model = authress.models.access_record.AccessRecord() # noqa: E501 - if include_optional : + model = AccessRecord() # noqa: E501 + if include_optional: return AccessRecord( - record_id = 'C0', - name = '0', - description = '', - capacity = 0, - last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - status = 'ACTIVE', + record_id = 'C0', + name = '0', + description = '', + capacity = 0, + last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + status = 'ACTIVE', account = authress.models.access_record_account.AccessRecord_account( - account_id = '', ), + account_id = '', ), users = [ authress.models.user.User( user_id = 'oauth|userId', ) - ], + ], admins = [ authress.models.user.User( user_id = 'oauth|userId', ) - ], + ], groups = [ authress.models.linked_group.LinkedGroup( group_id = None, ) - ], + ], statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -76,22 +74,20 @@ def make_instance(self, include_optional): authress.models.linked_group.LinkedGroup( group_id = None, ) ], ) - ], + ], links = authress.models.account_links.Account_links( self = authress.models.link.Link( href = '', - rel = '', ), ), + rel = '', ), ), tags = {"environment":"production"} ) - else : + else: return AccessRecord( name = '0', - account = authress.models.access_record_account.AccessRecord_account( - account_id = '', ), statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -106,10 +102,6 @@ def make_instance(self, include_optional): group_id = None, ) ], ) ], - links = authress.models.account_links.Account_links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ) """ diff --git a/test/test_access_record_account.py b/test/test_access_record_account.py index cafc3d9..da23b51 100644 --- a/test/test_access_record_account.py +++ b/test/test_access_record_account.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.access_record_account import AccessRecordAccount # noqa: E501 -from authress.rest import ApiException class TestAccessRecordAccount(unittest.TestCase): """AccessRecordAccount unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccessRecordAccount: """Test AccessRecordAccount include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccessRecordAccount` """ - model = authress.models.access_record_account.AccessRecordAccount() # noqa: E501 - if include_optional : + model = AccessRecordAccount() # noqa: E501 + if include_optional: return AccessRecordAccount( account_id = '' ) - else : + else: return AccessRecordAccount( account_id = '', ) diff --git a/test/test_access_record_collection.py b/test/test_access_record_collection.py index c26a122..6e423d9 100644 --- a/test/test_access_record_collection.py +++ b/test/test_access_record_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.access_record_collection import AccessRecordCollection # noqa: E501 -from authress.rest import ApiException class TestAccessRecordCollection(unittest.TestCase): """AccessRecordCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccessRecordCollection: """Test AccessRecordCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccessRecordCollection` """ - model = authress.models.access_record_collection.AccessRecordCollection() # noqa: E501 - if include_optional : + model = AccessRecordCollection() # noqa: E501 + if include_optional: return AccessRecordCollection( records = [ authress.models.access_record.AccessRecord( @@ -64,7 +62,7 @@ def make_instance(self, include_optional): statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -76,10 +74,10 @@ def make_instance(self, include_optional): href = '', rel = '', ), ), tags = {"environment":"production"}, ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -88,7 +86,7 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return AccessRecordCollection( records = [ authress.models.access_record.AccessRecord( @@ -115,7 +113,7 @@ def make_instance(self, include_optional): statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( diff --git a/test/test_access_records_api.py b/test/test_access_records_api.py index af19d6c..d0c3d1a 100644 --- a/test/test_access_records_api.py +++ b/test/test_access_records_api.py @@ -3,103 +3,101 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.access_records_api import AccessRecordsApi # noqa: E501 -from authress.rest import ApiException class TestAccessRecordsApi(unittest.TestCase): """AccessRecordsApi unit test stubs""" - def setUp(self): - self.api = authress.api.access_records_api.AccessRecordsApi() # noqa: E501 + def setUp(self) -> None: + self.api = AccessRecordsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_claim(self): + def test_create_claim(self) -> None: """Test case for create_claim Create resource Claim # noqa: E501 """ pass - def test_create_record(self): + def test_create_record(self) -> None: """Test case for create_record Create access record # noqa: E501 """ pass - def test_create_request(self): + def test_create_request(self) -> None: """Test case for create_request Create access request # noqa: E501 """ pass - def test_delete_record(self): + def test_delete_record(self) -> None: """Test case for delete_record - Deletes access record # noqa: E501 + Delete access record # noqa: E501 """ pass - def test_delete_request(self): + def test_delete_request(self) -> None: """Test case for delete_request - Deletes access request # noqa: E501 + Delete access request # noqa: E501 """ pass - def test_get_record(self): + def test_get_record(self) -> None: """Test case for get_record Retrieve access record # noqa: E501 """ pass - def test_get_records(self): + def test_get_records(self) -> None: """Test case for get_records List access records # noqa: E501 """ pass - def test_get_request(self): + def test_get_request(self) -> None: """Test case for get_request Retrieve access request # noqa: E501 """ pass - def test_get_requests(self): + def test_get_requests(self) -> None: """Test case for get_requests List access requests # noqa: E501 """ pass - def test_respond_to_access_request(self): + def test_respond_to_access_request(self) -> None: """Test case for respond_to_access_request Approve or deny access request # noqa: E501 """ pass - def test_update_record(self): + def test_update_record(self) -> None: """Test case for update_record Update access record # noqa: E501 diff --git a/test/test_access_request.py b/test/test_access_request.py index b59b453..0f6ae2b 100644 --- a/test/test_access_request.py +++ b/test/test_access_request.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.access_request import AccessRequest # noqa: E501 -from authress.rest import ApiException class TestAccessRequest(unittest.TestCase): """AccessRequest unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccessRequest: """Test AccessRequest include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccessRequest` """ - model = authress.models.access_request.AccessRequest() # noqa: E501 - if include_optional : + model = AccessRequest() # noqa: E501 + if include_optional: return AccessRequest( - request_id = 'C0', - last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - status = 'OPEN', + request_id = 'C0', + last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + status = 'OPEN', access = authress.models.access_template.AccessTemplate( users = [ authress.models.user.User( @@ -50,7 +48,7 @@ def make_instance(self, include_optional): statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -60,14 +58,14 @@ def make_instance(self, include_optional): authress.models.linked_group.LinkedGroup( group_id = None, ) ], ) - ], ), + ], ), links = authress.models.account_links.Account_links( self = authress.models.link.Link( href = '', - rel = '', ), ), + rel = '', ), ), tags = {"environment":"production"} ) - else : + else: return AccessRequest( request_id = 'C0', access = authress.models.access_template.AccessTemplate( @@ -78,7 +76,7 @@ def make_instance(self, include_optional): statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -89,10 +87,6 @@ def make_instance(self, include_optional): group_id = None, ) ], ) ], ), - links = authress.models.account_links.Account_links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ) """ diff --git a/test/test_access_request_collection.py b/test/test_access_request_collection.py index 3b4cb14..3a0d057 100644 --- a/test/test_access_request_collection.py +++ b/test/test_access_request_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.access_request_collection import AccessRequestCollection # noqa: E501 -from authress.rest import ApiException class TestAccessRequestCollection(unittest.TestCase): """AccessRequestCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccessRequestCollection: """Test AccessRequestCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccessRequestCollection` """ - model = authress.models.access_request_collection.AccessRequestCollection() # noqa: E501 - if include_optional : + model = AccessRequestCollection() # noqa: E501 + if include_optional: return AccessRequestCollection( records = [ authress.models.access_request.AccessRequest( @@ -52,7 +50,7 @@ def make_instance(self, include_optional): statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -68,10 +66,10 @@ def make_instance(self, include_optional): href = '', rel = '', ), ), tags = {"environment":"production"}, ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -80,7 +78,7 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return AccessRequestCollection( links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( diff --git a/test/test_access_request_response.py b/test/test_access_request_response.py index 1d989af..cd29738 100644 --- a/test/test_access_request_response.py +++ b/test/test_access_request_response.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.access_request_response import AccessRequestResponse # noqa: E501 -from authress.rest import ApiException class TestAccessRequestResponse(unittest.TestCase): """AccessRequestResponse unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccessRequestResponse: """Test AccessRequestResponse include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccessRequestResponse` """ - model = authress.models.access_request_response.AccessRequestResponse() # noqa: E501 - if include_optional : + model = AccessRequestResponse() # noqa: E501 + if include_optional: return AccessRequestResponse( status = 'APPROVED' ) - else : + else: return AccessRequestResponse( status = 'APPROVED', ) diff --git a/test/test_access_template.py b/test/test_access_template.py index cf4224c..d463f1f 100644 --- a/test/test_access_template.py +++ b/test/test_access_template.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.access_template import AccessTemplate # noqa: E501 -from authress.rest import ApiException class TestAccessTemplate(unittest.TestCase): """AccessTemplate unit test stubs""" @@ -29,24 +27,24 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccessTemplate: """Test AccessTemplate include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccessTemplate` """ - model = authress.models.access_template.AccessTemplate() # noqa: E501 - if include_optional : + model = AccessTemplate() # noqa: E501 + if include_optional: return AccessTemplate( users = [ authress.models.user.User( user_id = 'oauth|userId', ) - ], + ], statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -62,7 +60,7 @@ def make_instance(self, include_optional): ], ) ] ) - else : + else: return AccessTemplate( users = [ authress.models.user.User( @@ -71,7 +69,7 @@ def make_instance(self, include_optional): statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( diff --git a/test/test_account.py b/test/test_account.py index 7fcb98c..577bd0a 100644 --- a/test/test_account.py +++ b/test/test_account.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.account import Account # noqa: E501 -from authress.rest import ApiException class TestAccount(unittest.TestCase): """Account unit test stubs""" @@ -29,34 +27,30 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Account: """Test Account include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Account` """ - model = authress.models.account.Account() # noqa: E501 - if include_optional : + model = Account() # noqa: E501 + if include_optional: return Account( - account_id = '0', - created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - name = '', - company = None, + account_id = '0', + created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + name = '', + company = None, links = authress.models.account_links.Account_links( self = authress.models.link.Link( href = '', rel = '', ), ) ) - else : + else: return Account( account_id = '0', created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), company = None, - links = authress.models.account_links.Account_links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ) """ diff --git a/test/test_account_collection.py b/test/test_account_collection.py index 786b1fa..88ad5a6 100644 --- a/test/test_account_collection.py +++ b/test/test_account_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.account_collection import AccountCollection # noqa: E501 -from authress.rest import ApiException class TestAccountCollection(unittest.TestCase): """AccountCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccountCollection: """Test AccountCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccountCollection` """ - model = authress.models.account_collection.AccountCollection() # noqa: E501 - if include_optional : + model = AccountCollection() # noqa: E501 + if include_optional: return AccountCollection( accounts = authress.models.account.Account( account_id = '0', @@ -49,7 +47,7 @@ def make_instance(self, include_optional): href = '', rel = '', ), ), ) ) - else : + else: return AccountCollection( accounts = authress.models.account.Account( account_id = '0', diff --git a/test/test_account_links.py b/test/test_account_links.py index 424ff74..38fba76 100644 --- a/test/test_account_links.py +++ b/test/test_account_links.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.account_links import AccountLinks # noqa: E501 -from authress.rest import ApiException class TestAccountLinks(unittest.TestCase): """AccountLinks unit test stubs""" @@ -29,21 +27,21 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> AccountLinks: """Test AccountLinks include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `AccountLinks` """ - model = authress.models.account_links.AccountLinks() # noqa: E501 - if include_optional : + model = AccountLinks() # noqa: E501 + if include_optional: return AccountLinks( var_self = authress.models.link.Link( href = '', rel = '', ) ) - else : + else: return AccountLinks( var_self = authress.models.link.Link( href = '', diff --git a/test/test_accounts_api.py b/test/test_accounts_api.py index 1a893dd..d901d29 100644 --- a/test/test_accounts_api.py +++ b/test/test_accounts_api.py @@ -3,54 +3,52 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.accounts_api import AccountsApi # noqa: E501 -from authress.rest import ApiException class TestAccountsApi(unittest.TestCase): """AccountsApi unit test stubs""" - def setUp(self): - self.api = authress.api.accounts_api.AccountsApi() # noqa: E501 + def setUp(self) -> None: + self.api = AccountsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_delegate_authentication(self): + def test_delegate_authentication(self) -> None: """Test case for delegate_authentication Link external provider # noqa: E501 """ pass - def test_get_account(self): + def test_get_account(self) -> None: """Test case for get_account Retrieve account information # noqa: E501 """ pass - def test_get_account_identities(self): + def test_get_account_identities(self) -> None: """Test case for get_account_identities List linked external providers # noqa: E501 """ pass - def test_get_accounts(self): + def test_get_accounts(self) -> None: """Test case for get_accounts List user Authress accounts # noqa: E501 diff --git a/test/test_application_delegation.py b/test/test_application_delegation.py index 720b386..9500b13 100644 --- a/test/test_application_delegation.py +++ b/test/test_application_delegation.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.application_delegation import ApplicationDelegation # noqa: E501 -from authress.rest import ApiException class TestApplicationDelegation(unittest.TestCase): """ApplicationDelegation unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ApplicationDelegation: """Test ApplicationDelegation include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ApplicationDelegation` """ - model = authress.models.application_delegation.ApplicationDelegation() # noqa: E501 - if include_optional : + model = ApplicationDelegation() # noqa: E501 + if include_optional: return ApplicationDelegation( authentication_url = '' ) - else : + else: return ApplicationDelegation( authentication_url = '', ) diff --git a/test/test_applications_api.py b/test/test_applications_api.py index bed6f31..0169bd0 100644 --- a/test/test_applications_api.py +++ b/test/test_applications_api.py @@ -3,33 +3,31 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.applications_api import ApplicationsApi # noqa: E501 -from authress.rest import ApiException class TestApplicationsApi(unittest.TestCase): """ApplicationsApi unit test stubs""" - def setUp(self): - self.api = authress.api.applications_api.ApplicationsApi() # noqa: E501 + def setUp(self) -> None: + self.api = ApplicationsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_delegate_user_login(self): + def test_delegate_user_login(self) -> None: """Test case for delegate_user_login Log user into third-party application # noqa: E501 diff --git a/test/test_claim_request.py b/test/test_claim_request.py index 5a303ca..709fa1e 100644 --- a/test/test_claim_request.py +++ b/test/test_claim_request.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.claim_request import ClaimRequest # noqa: E501 -from authress.rest import ApiException class TestClaimRequest(unittest.TestCase): """ClaimRequest unit test stubs""" @@ -29,20 +27,20 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ClaimRequest: """Test ClaimRequest include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ClaimRequest` """ - model = authress.models.claim_request.ClaimRequest() # noqa: E501 - if include_optional : + model = ClaimRequest() # noqa: E501 + if include_optional: return ClaimRequest( - collection_resource = '0', + collection_resource = '0', resource_id = '0' ) - else : + else: return ClaimRequest( collection_resource = '0', resource_id = '0', diff --git a/test/test_client.py b/test/test_client.py index 37c03a9..a050f5f 100644 --- a/test/test_client.py +++ b/test/test_client.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.client import Client # noqa: E501 -from authress.rest import ApiException class TestClient(unittest.TestCase): """Client unit test stubs""" @@ -29,33 +27,39 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Client: """Test Client include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Client` """ - model = authress.models.client.Client() # noqa: E501 - if include_optional : + model = Client() # noqa: E501 + if include_optional: return Client( - client_id = '', - created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - name = '0', + client_id = '', + created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + name = '', options = authress.models.client_options.Client_options( grant_user_permissions_access = False, - grant_token_generation = False, ), + grant_token_generation = False, ), + rate_limits = [ + authress.models.client_rate_limit.ClientRateLimit( + duration = 'PT0S', + quota = 100, ) + ], verification_keys = [ authress.models.client_access_key.ClientAccessKey( key_id = '', client_id = '', + public_key = '', generation_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), client_secret = '', access_key = '', ) - ], + ], tags = {"environment":"production"} ) - else : + else: return Client( client_id = '', created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), diff --git a/test/test_client_access_key.py b/test/test_client_access_key.py index 2ba8cd8..586a80e 100644 --- a/test/test_client_access_key.py +++ b/test/test_client_access_key.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.client_access_key import ClientAccessKey # noqa: E501 -from authress.rest import ApiException class TestClientAccessKey(unittest.TestCase): """ClientAccessKey unit test stubs""" @@ -29,23 +27,24 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ClientAccessKey: """Test ClientAccessKey include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ClientAccessKey` """ - model = authress.models.client_access_key.ClientAccessKey() # noqa: E501 - if include_optional : + model = ClientAccessKey() # noqa: E501 + if include_optional: return ClientAccessKey( - key_id = '', - client_id = '', - generation_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - client_secret = '', + key_id = '', + client_id = '', + public_key = '', + generation_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + client_secret = '', access_key = '' ) - else : + else: return ClientAccessKey( client_id = '', ) diff --git a/test/test_client_collection.py b/test/test_client_collection.py index 4aa468e..0ed22ee 100644 --- a/test/test_client_collection.py +++ b/test/test_client_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.client_collection import ClientCollection # noqa: E501 -from authress.rest import ApiException class TestClientCollection(unittest.TestCase): """ClientCollection unit test stubs""" @@ -29,37 +27,43 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ClientCollection: """Test ClientCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ClientCollection` """ - model = authress.models.client_collection.ClientCollection() # noqa: E501 - if include_optional : + model = ClientCollection() # noqa: E501 + if include_optional: return ClientCollection( clients = [ authress.models.client.Client( client_id = '', created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - name = '0', + name = '', options = authress.models.client_options.Client_options( grant_user_permissions_access = False, grant_token_generation = False, ), + rate_limits = [ + authress.models.client_rate_limit.ClientRateLimit( + duration = 'PT0S', + quota = 100, ) + ], verification_keys = [ authress.models.client_access_key.ClientAccessKey( key_id = '', client_id = '', + public_key = '', generation_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), client_secret = '', access_key = '', ) ], tags = {"environment":"production"}, ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -68,20 +72,26 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return ClientCollection( clients = [ authress.models.client.Client( client_id = '', created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - name = '0', + name = '', options = authress.models.client_options.Client_options( grant_user_permissions_access = False, grant_token_generation = False, ), + rate_limits = [ + authress.models.client_rate_limit.ClientRateLimit( + duration = 'PT0S', + quota = 100, ) + ], verification_keys = [ authress.models.client_access_key.ClientAccessKey( key_id = '', client_id = '', + public_key = '', generation_date = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), client_secret = '', access_key = '', ) diff --git a/test/test_client_options.py b/test/test_client_options.py index 6d915f6..48ccf5d 100644 --- a/test/test_client_options.py +++ b/test/test_client_options.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.client_options import ClientOptions # noqa: E501 -from authress.rest import ApiException class TestClientOptions(unittest.TestCase): """ClientOptions unit test stubs""" @@ -29,20 +27,20 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ClientOptions: """Test ClientOptions include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ClientOptions` """ - model = authress.models.client_options.ClientOptions() # noqa: E501 - if include_optional : + model = ClientOptions() # noqa: E501 + if include_optional: return ClientOptions( - grant_user_permissions_access = False, + grant_user_permissions_access = False, grant_token_generation = False ) - else : + else: return ClientOptions( ) """ diff --git a/test/test_metadata_object_account.py b/test/test_client_rate_limit.py similarity index 64% rename from test/test_metadata_object_account.py rename to test/test_client_rate_limit.py index 15282d7..d59f85d 100644 --- a/test/test_metadata_object_account.py +++ b/test/test_client_rate_limit.py @@ -3,25 +3,23 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress -from authress.models.metadata_object_account import MetadataObjectAccount # noqa: E501 -from authress.rest import ApiException +from authress.models.client_rate_limit import ClientRateLimit # noqa: E501 -class TestMetadataObjectAccount(unittest.TestCase): - """MetadataObjectAccount unit test stubs""" +class TestClientRateLimit(unittest.TestCase): + """ClientRateLimit unit test stubs""" def setUp(self): pass @@ -29,25 +27,28 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): - """Test MetadataObjectAccount + def make_instance(self, include_optional) -> ClientRateLimit: + """Test ClientRateLimit include_option is a boolean, when False only required params are included, when True both required and optional params are included """ - # uncomment below to create an instance of `MetadataObjectAccount` + # uncomment below to create an instance of `ClientRateLimit` """ - model = authress.models.metadata_object_account.MetadataObjectAccount() # noqa: E501 - if include_optional : - return MetadataObjectAccount( - account_id = '' + model = ClientRateLimit() # noqa: E501 + if include_optional: + return ClientRateLimit( + duration = 'PT0S', + quota = 100 ) - else : - return MetadataObjectAccount( + else: + return ClientRateLimit( + duration = 'PT0S', + quota = 100, ) """ - def testMetadataObjectAccount(self): - """Test MetadataObjectAccount""" + def testClientRateLimit(self): + """Test ClientRateLimit""" # inst_req_only = self.make_instance(include_optional=False) # inst_req_and_optional = self.make_instance(include_optional=True) diff --git a/test/test_collection_links.py b/test/test_collection_links.py index 32d0908..1b62e8c 100644 --- a/test/test_collection_links.py +++ b/test/test_collection_links.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.collection_links import CollectionLinks # noqa: E501 -from authress.rest import ApiException class TestCollectionLinks(unittest.TestCase): """CollectionLinks unit test stubs""" @@ -29,24 +27,24 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> CollectionLinks: """Test CollectionLinks include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `CollectionLinks` """ - model = authress.models.collection_links.CollectionLinks() # noqa: E501 - if include_optional : + model = CollectionLinks() # noqa: E501 + if include_optional: return CollectionLinks( var_self = authress.models.link.Link( href = '', - rel = '', ), + rel = '', ), next = authress.models.link.Link( href = '', rel = '', ) ) - else : + else: return CollectionLinks( var_self = authress.models.link.Link( href = '', diff --git a/test/test_connection.py b/test/test_connection.py index e9bad85..7c3c38a 100644 --- a/test/test_connection.py +++ b/test/test_connection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.connection import Connection # noqa: E501 -from authress.rest import ApiException class TestConnection(unittest.TestCase): """Connection unit test stubs""" @@ -29,35 +27,48 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Connection: """Test Connection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Connection` """ - model = authress.models.connection.Connection() # noqa: E501 - if include_optional : + model = Connection() # noqa: E501 + if include_optional: return Connection( - type = 'OAUTH2', - connection_id = '00', - authentication_url = '0', - token_url = '0', - issuer_url = '0', - provider_certificate = '0', - client_id = '0', - client_secret = '0', + type = 'OAUTH2', + connection_id = '', + authentication_url = '0', + token_url = '', + issuer_url = '', + provider_certificate = '', + client_id = '', + client_secret_id = '', + client_secret = '', + user_data_configuration = authress.models.connection_user_data_configuration.ConnectionUserDataConfiguration( + location = 'ZAF', ), data = authress.models.connection_data.Connection_data( tenant_id = None, - name = '0', - supported_content_type = 'application/json', ), + developer_account_id = '', + name = '', + supported_content_type = 'application/json', + oidc_user_endpoint_url = '', + user_id_expression = '{sub}', + trust_identity_user_id = True, ), default_connection_properties = { 'key' : '' - }, - created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + }, + conditions = authress.models.connection_conditions.Connection_conditions( + require_business_account = False, ), + linking_configuration = authress.models.connection_linking_configuration.Connection_linkingConfiguration( + type = 'EXPLICIT', ), + created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + is_active_connection = True, tags = {"environment":"production"} ) - else : + else: return Connection( ) """ diff --git a/test/test_connection_collection.py b/test/test_connection_collection.py index 0e1e71b..6103459 100644 --- a/test/test_connection_collection.py +++ b/test/test_connection_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.connection_collection import ConnectionCollection # noqa: E501 -from authress.rest import ApiException class TestConnectionCollection(unittest.TestCase): """ConnectionCollection unit test stubs""" @@ -29,60 +27,86 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ConnectionCollection: """Test ConnectionCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ConnectionCollection` """ - model = authress.models.connection_collection.ConnectionCollection() # noqa: E501 - if include_optional : + model = ConnectionCollection() # noqa: E501 + if include_optional: return ConnectionCollection( connections = [ authress.models.connection.Connection( type = 'OAUTH2', - connection_id = '00', + connection_id = '', authentication_url = '0', - token_url = '0', - issuer_url = '0', - provider_certificate = '0', - client_id = '0', - client_secret = '0', + token_url = '', + issuer_url = '', + provider_certificate = '', + client_id = '', + client_secret_id = '', + client_secret = '', + user_data_configuration = authress.models.connection_user_data_configuration.ConnectionUserDataConfiguration( + location = 'ZAF', ), data = authress.models.connection_data.Connection_data( tenant_id = None, - name = '0', - supported_content_type = 'application/json', ), + developer_account_id = '', + name = '', + supported_content_type = 'application/json', + oidc_user_endpoint_url = '', + user_id_expression = '{sub}', + trust_identity_user_id = True, ), default_connection_properties = { 'key' : '' }, + conditions = authress.models.connection_conditions.Connection_conditions( + require_business_account = False, ), + linking_configuration = authress.models.connection_linking_configuration.Connection_linkingConfiguration( + type = 'EXPLICIT', ), created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + is_active_connection = True, tags = {"environment":"production"}, ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( cursor = '', ), ) ) - else : + else: return ConnectionCollection( connections = [ authress.models.connection.Connection( type = 'OAUTH2', - connection_id = '00', + connection_id = '', authentication_url = '0', - token_url = '0', - issuer_url = '0', - provider_certificate = '0', - client_id = '0', - client_secret = '0', + token_url = '', + issuer_url = '', + provider_certificate = '', + client_id = '', + client_secret_id = '', + client_secret = '', + user_data_configuration = authress.models.connection_user_data_configuration.ConnectionUserDataConfiguration( + location = 'ZAF', ), data = authress.models.connection_data.Connection_data( tenant_id = None, - name = '0', - supported_content_type = 'application/json', ), + developer_account_id = '', + name = '', + supported_content_type = 'application/json', + oidc_user_endpoint_url = '', + user_id_expression = '{sub}', + trust_identity_user_id = True, ), default_connection_properties = { 'key' : '' }, + conditions = authress.models.connection_conditions.Connection_conditions( + require_business_account = False, ), + linking_configuration = authress.models.connection_linking_configuration.Connection_linkingConfiguration( + type = 'EXPLICIT', ), created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + is_active_connection = True, tags = {"environment":"production"}, ) ], ) diff --git a/test/test_metadata_object.py b/test/test_connection_conditions.py similarity index 60% rename from test/test_metadata_object.py rename to test/test_connection_conditions.py index 2297459..a7dddd4 100644 --- a/test/test_metadata_object.py +++ b/test/test_connection_conditions.py @@ -3,25 +3,23 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress -from authress.models.metadata_object import MetadataObject # noqa: E501 -from authress.rest import ApiException +from authress.models.connection_conditions import ConnectionConditions # noqa: E501 -class TestMetadataObject(unittest.TestCase): - """MetadataObject unit test stubs""" +class TestConnectionConditions(unittest.TestCase): + """ConnectionConditions unit test stubs""" def setUp(self): pass @@ -29,30 +27,25 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): - """Test MetadataObject + def make_instance(self, include_optional) -> ConnectionConditions: + """Test ConnectionConditions include_option is a boolean, when False only required params are included, when True both required and optional params are included """ - # uncomment below to create an instance of `MetadataObject` + # uncomment below to create an instance of `ConnectionConditions` """ - model = authress.models.metadata_object.MetadataObject() # noqa: E501 - if include_optional : - return MetadataObject( - account = authress.models.metadata_object_account.MetadataObject_account( - account_id = '', ), - user_id = None, - metadata = {} + model = ConnectionConditions() # noqa: E501 + if include_optional: + return ConnectionConditions( + require_business_account = False ) - else : - return MetadataObject( - user_id = None, - metadata = {}, + else: + return ConnectionConditions( ) """ - def testMetadataObject(self): - """Test MetadataObject""" + def testConnectionConditions(self): + """Test ConnectionConditions""" # inst_req_only = self.make_instance(include_optional=False) # inst_req_and_optional = self.make_instance(include_optional=True) diff --git a/test/test_connection_data.py b/test/test_connection_data.py index 0e2cab1..08b7525 100644 --- a/test/test_connection_data.py +++ b/test/test_connection_data.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.connection_data import ConnectionData # noqa: E501 -from authress.rest import ApiException class TestConnectionData(unittest.TestCase): """ConnectionData unit test stubs""" @@ -29,21 +27,25 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ConnectionData: """Test ConnectionData include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ConnectionData` """ - model = authress.models.connection_data.ConnectionData() # noqa: E501 - if include_optional : + model = ConnectionData() # noqa: E501 + if include_optional: return ConnectionData( - tenant_id = None, - name = '0', - supported_content_type = 'application/json' + tenant_id = '', + developer_account_id = '', + name = '', + supported_content_type = 'application/json', + oidc_user_endpoint_url = '', + user_id_expression = '{sub}', + trust_identity_user_id = True ) - else : + else: return ConnectionData( ) """ diff --git a/test/test_connection_default_connection_properties.py b/test/test_connection_default_connection_properties.py index 100ac8f..2e9bc10 100644 --- a/test/test_connection_default_connection_properties.py +++ b/test/test_connection_default_connection_properties.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.connection_default_connection_properties import ConnectionDefaultConnectionProperties # noqa: E501 -from authress.rest import ApiException class TestConnectionDefaultConnectionProperties(unittest.TestCase): """ConnectionDefaultConnectionProperties unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ConnectionDefaultConnectionProperties: """Test ConnectionDefaultConnectionProperties include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ConnectionDefaultConnectionProperties` """ - model = authress.models.connection_default_connection_properties.ConnectionDefaultConnectionProperties() # noqa: E501 - if include_optional : + model = ConnectionDefaultConnectionProperties() # noqa: E501 + if include_optional: return ConnectionDefaultConnectionProperties( scope = 'profile email openid' ) - else : + else: return ConnectionDefaultConnectionProperties( ) """ diff --git a/test/test_connection_linking_configuration.py b/test/test_connection_linking_configuration.py new file mode 100644 index 0000000..6a81267 --- /dev/null +++ b/test/test_connection_linking_configuration.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from authress.models.connection_linking_configuration import ConnectionLinkingConfiguration # noqa: E501 + +class TestConnectionLinkingConfiguration(unittest.TestCase): + """ConnectionLinkingConfiguration unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> ConnectionLinkingConfiguration: + """Test ConnectionLinkingConfiguration + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `ConnectionLinkingConfiguration` + """ + model = ConnectionLinkingConfiguration() # noqa: E501 + if include_optional: + return ConnectionLinkingConfiguration( + type = 'EXPLICIT' + ) + else: + return ConnectionLinkingConfiguration( + ) + """ + + def testConnectionLinkingConfiguration(self): + """Test ConnectionLinkingConfiguration""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_connection_user_data_configuration.py b/test/test_connection_user_data_configuration.py new file mode 100644 index 0000000..5a38d59 --- /dev/null +++ b/test/test_connection_user_data_configuration.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from authress.models.connection_user_data_configuration import ConnectionUserDataConfiguration # noqa: E501 + +class TestConnectionUserDataConfiguration(unittest.TestCase): + """ConnectionUserDataConfiguration unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> ConnectionUserDataConfiguration: + """Test ConnectionUserDataConfiguration + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `ConnectionUserDataConfiguration` + """ + model = ConnectionUserDataConfiguration() # noqa: E501 + if include_optional: + return ConnectionUserDataConfiguration( + location = 'ZAF' + ) + else: + return ConnectionUserDataConfiguration( + ) + """ + + def testConnectionUserDataConfiguration(self): + """Test ConnectionUserDataConfiguration""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_connections_api.py b/test/test_connections_api.py index ca01026..9193761 100644 --- a/test/test_connections_api.py +++ b/test/test_connections_api.py @@ -3,68 +3,66 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.connections_api import ConnectionsApi # noqa: E501 -from authress.rest import ApiException class TestConnectionsApi(unittest.TestCase): """ConnectionsApi unit test stubs""" - def setUp(self): - self.api = authress.api.connections_api.ConnectionsApi() # noqa: E501 + def setUp(self) -> None: + self.api = ConnectionsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_connection(self): + def test_create_connection(self) -> None: """Test case for create_connection Create SSO connection # noqa: E501 """ pass - def test_delete_connection(self): + def test_delete_connection(self) -> None: """Test case for delete_connection Delete SSO connection # noqa: E501 """ pass - def test_get_connection(self): + def test_get_connection(self) -> None: """Test case for get_connection Retrieve SSO connection # noqa: E501 """ pass - def test_get_connection_credentials(self): + def test_get_connection_credentials(self) -> None: """Test case for get_connection_credentials Retrieve user connection credentials # noqa: E501 """ pass - def test_get_connections(self): + def test_get_connections(self) -> None: """Test case for get_connections List SSO connections # noqa: E501 """ pass - def test_update_connection(self): + def test_update_connection(self) -> None: """Test case for update_connection Update SSO connection # noqa: E501 diff --git a/test/test_extension.py b/test/test_extension.py index 468a960..1acff90 100644 --- a/test/test_extension.py +++ b/test/test_extension.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.extension import Extension # noqa: E501 -from authress.rest import ApiException class TestExtension(unittest.TestCase): """Extension unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Extension: """Test Extension include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Extension` """ - model = authress.models.extension.Extension() # noqa: E501 - if include_optional : + model = Extension() # noqa: E501 + if include_optional: return Extension( - extension_id = '0', - name = 'Extension: third party example', - created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + extension_id = '0', + name = 'Extension: third party example', + created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), application = authress.models.extension_application.ExtensionApplication( application_id = '', redirect_urls = [ @@ -50,25 +48,24 @@ def make_instance(self, include_optional): links = authress.models.links.Links( self = authress.models.link.Link( href = '', - rel = '', ), ), ), + rel = '', ), ), ), client = authress.models.extension_client.ExtensionClient( client_id = '', + rate_limits = [ + authress.models.client_rate_limit.ClientRateLimit( + duration = 'PT0S', + quota = 100, ) + ], links = authress.models.links.Links( self = authress.models.link.Link( href = '', - rel = '', ), ), ), + rel = '', ), ), ), tags = {"environment":"production"} ) - else : + else: return Extension( extension_id = '0', created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), - client = authress.models.extension_client.ExtensionClient( - client_id = '', - links = authress.models.links.Links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ), ) """ diff --git a/test/test_extension_application.py b/test/test_extension_application.py index aeeb6d8..cd60cd3 100644 --- a/test/test_extension_application.py +++ b/test/test_extension_application.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.extension_application import ExtensionApplication # noqa: E501 -from authress.rest import ApiException class TestExtensionApplication(unittest.TestCase): """ExtensionApplication unit test stubs""" @@ -29,32 +27,28 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ExtensionApplication: """Test ExtensionApplication include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ExtensionApplication` """ - model = authress.models.extension_application.ExtensionApplication() # noqa: E501 - if include_optional : + model = ExtensionApplication() # noqa: E501 + if include_optional: return ExtensionApplication( - application_id = '', + application_id = '', redirect_urls = [ '' - ], + ], links = authress.models.links.Links( self = authress.models.link.Link( href = '', rel = '', ), ) ) - else : + else: return ExtensionApplication( application_id = '', - links = authress.models.links.Links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ) """ diff --git a/test/test_extension_client.py b/test/test_extension_client.py index 4335ae9..05f3455 100644 --- a/test/test_extension_client.py +++ b/test/test_extension_client.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.extension_client import ExtensionClient # noqa: E501 -from authress.rest import ApiException class TestExtensionClient(unittest.TestCase): """ExtensionClient unit test stubs""" @@ -29,29 +27,30 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ExtensionClient: """Test ExtensionClient include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ExtensionClient` """ - model = authress.models.extension_client.ExtensionClient() # noqa: E501 - if include_optional : + model = ExtensionClient() # noqa: E501 + if include_optional: return ExtensionClient( - client_id = '', + client_id = '', + rate_limits = [ + authress.models.client_rate_limit.ClientRateLimit( + duration = 'PT0S', + quota = 100, ) + ], links = authress.models.links.Links( self = authress.models.link.Link( href = '', rel = '', ), ) ) - else : + else: return ExtensionClient( client_id = '', - links = authress.models.links.Links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ) """ diff --git a/test/test_extension_collection.py b/test/test_extension_collection.py index d652732..ea541f6 100644 --- a/test/test_extension_collection.py +++ b/test/test_extension_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.extension_collection import ExtensionCollection # noqa: E501 -from authress.rest import ApiException class TestExtensionCollection(unittest.TestCase): """ExtensionCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ExtensionCollection: """Test ExtensionCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ExtensionCollection` """ - model = authress.models.extension_collection.ExtensionCollection() # noqa: E501 - if include_optional : + model = ExtensionCollection() # noqa: E501 + if include_optional: return ExtensionCollection( extensions = [ authress.models.extension.Extension( @@ -55,17 +53,18 @@ def make_instance(self, include_optional): rel = '', ), ), ), client = authress.models.extension_client.ExtensionClient( client_id = '', - links = authress.models.links.Links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ), + rate_limits = [ + authress.models.client_rate_limit.ClientRateLimit( + duration = 'PT0S', + quota = 100, ) + ], ), tags = {"environment":"production"}, ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( cursor = '', ), ) ) - else : + else: return ExtensionCollection( extensions = [ authress.models.extension.Extension( @@ -83,10 +82,11 @@ def make_instance(self, include_optional): rel = '', ), ), ), client = authress.models.extension_client.ExtensionClient( client_id = '', - links = authress.models.links.Links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ), + rate_limits = [ + authress.models.client_rate_limit.ClientRateLimit( + duration = 'PT0S', + quota = 100, ) + ], ), tags = {"environment":"production"}, ) ], ) diff --git a/test/test_extensions_api.py b/test/test_extensions_api.py index 9c3c144..e509cb4 100644 --- a/test/test_extensions_api.py +++ b/test/test_extensions_api.py @@ -3,75 +3,73 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.extensions_api import ExtensionsApi # noqa: E501 -from authress.rest import ApiException class TestExtensionsApi(unittest.TestCase): """ExtensionsApi unit test stubs""" - def setUp(self): - self.api = authress.api.extensions_api.ExtensionsApi() # noqa: E501 + def setUp(self) -> None: + self.api = ExtensionsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_extension(self): + def test_create_extension(self) -> None: """Test case for create_extension Create extension # noqa: E501 """ pass - def test_delete_extension(self): + def test_delete_extension(self) -> None: """Test case for delete_extension Delete extension # noqa: E501 """ pass - def test_get_extension(self): + def test_get_extension(self) -> None: """Test case for get_extension Retrieve extension # noqa: E501 """ pass - def test_get_extensions(self): + def test_get_extensions(self) -> None: """Test case for get_extensions List extensions # noqa: E501 """ pass - def test_login(self): + def test_login(self) -> None: """Test case for login OAuth Authorize # noqa: E501 """ pass - def test_request_token(self): + def test_request_token(self) -> None: """Test case for request_token OAuth Token # noqa: E501 """ pass - def test_update_extension(self): + def test_update_extension(self) -> None: """Test case for update_extension Update extension # noqa: E501 diff --git a/test/test_group.py b/test/test_group.py index e1f4892..8ddfb01 100644 --- a/test/test_group.py +++ b/test/test_group.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.group import Group # noqa: E501 -from authress.rest import ApiException class TestGroup(unittest.TestCase): """Group unit test stubs""" @@ -29,34 +27,34 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Group: """Test Group include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Group` """ - model = authress.models.group.Group() # noqa: E501 - if include_optional : + model = Group() # noqa: E501 + if include_optional: return Group( - group_id = 'grp_user_group_001', - name = '0', - last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), + group_id = 'grp_user_group_001', + name = '0', + last_updated = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), users = [ authress.models.user.User( user_id = 'oauth|userId', ) - ], + ], admins = [ authress.models.user.User( user_id = 'oauth|userId', ) - ], + ], links = authress.models.account_links.Account_links( self = authress.models.link.Link( href = '', - rel = '', ), ), + rel = '', ), ), tags = {"environment":"production"} ) - else : + else: return Group( name = '0', users = [ @@ -67,10 +65,6 @@ def make_instance(self, include_optional): authress.models.user.User( user_id = 'oauth|userId', ) ], - links = authress.models.account_links.Account_links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ) """ diff --git a/test/test_group_collection.py b/test/test_group_collection.py index 26ce7e5..6f90707 100644 --- a/test/test_group_collection.py +++ b/test/test_group_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.group_collection import GroupCollection # noqa: E501 -from authress.rest import ApiException class TestGroupCollection(unittest.TestCase): """GroupCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> GroupCollection: """Test GroupCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `GroupCollection` """ - model = authress.models.group_collection.GroupCollection() # noqa: E501 - if include_optional : + model = GroupCollection() # noqa: E501 + if include_optional: return GroupCollection( groups = [ authress.models.group.Group( @@ -57,10 +55,10 @@ def make_instance(self, include_optional): href = '', rel = '', ), ), tags = {"environment":"production"}, ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -69,7 +67,7 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return GroupCollection( groups = [ authress.models.group.Group( diff --git a/test/test_groups_api.py b/test/test_groups_api.py index b5b5c10..71d4ce1 100644 --- a/test/test_groups_api.py +++ b/test/test_groups_api.py @@ -3,61 +3,59 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.groups_api import GroupsApi # noqa: E501 -from authress.rest import ApiException class TestGroupsApi(unittest.TestCase): """GroupsApi unit test stubs""" - def setUp(self): - self.api = authress.api.groups_api.GroupsApi() # noqa: E501 + def setUp(self) -> None: + self.api = GroupsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_group(self): + def test_create_group(self) -> None: """Test case for create_group Create group # noqa: E501 """ pass - def test_delete_group(self): + def test_delete_group(self) -> None: """Test case for delete_group - Deletes group # noqa: E501 + Delete group # noqa: E501 """ pass - def test_get_group(self): + def test_get_group(self) -> None: """Test case for get_group Retrieve group # noqa: E501 """ pass - def test_get_groups(self): + def test_get_groups(self) -> None: """Test case for get_groups List groups # noqa: E501 """ pass - def test_update_group(self): + def test_update_group(self) -> None: """Test case for update_group Update a group # noqa: E501 diff --git a/test/test_identity.py b/test/test_identity.py index eecfa3b..5a88bb2 100644 --- a/test/test_identity.py +++ b/test/test_identity.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.identity import Identity # noqa: E501 -from authress.rest import ApiException class TestIdentity(unittest.TestCase): """Identity unit test stubs""" @@ -29,20 +27,21 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Identity: """Test Identity include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Identity` """ - model = authress.models.identity.Identity() # noqa: E501 - if include_optional : + model = Identity() # noqa: E501 + if include_optional: return Identity( - issuer = '', - audience = '' + issuer = '', + audience = '', + user_id_expression = '{sub}' ) - else : + else: return Identity( issuer = '', audience = '', diff --git a/test/test_identity_collection.py b/test/test_identity_collection.py index dc68da4..0b2d8e5 100644 --- a/test/test_identity_collection.py +++ b/test/test_identity_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.identity_collection import IdentityCollection # noqa: E501 -from authress.rest import ApiException class TestIdentityCollection(unittest.TestCase): """IdentityCollection unit test stubs""" @@ -29,28 +27,30 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> IdentityCollection: """Test IdentityCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `IdentityCollection` """ - model = authress.models.identity_collection.IdentityCollection() # noqa: E501 - if include_optional : + model = IdentityCollection() # noqa: E501 + if include_optional: return IdentityCollection( identities = [ authress.models.identity.Identity( issuer = '', - audience = '', ) + audience = '', + user_id_expression = '{sub}', ) ] ) - else : + else: return IdentityCollection( identities = [ authress.models.identity.Identity( issuer = '', - audience = '', ) + audience = '', + user_id_expression = '{sub}', ) ], ) """ diff --git a/test/test_identity_request.py b/test/test_identity_request.py index 3d7ff28..57217c0 100644 --- a/test/test_identity_request.py +++ b/test/test_identity_request.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.identity_request import IdentityRequest # noqa: E501 -from authress.rest import ApiException class TestIdentityRequest(unittest.TestCase): """IdentityRequest unit test stubs""" @@ -29,21 +27,22 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> IdentityRequest: """Test IdentityRequest include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `IdentityRequest` """ - model = authress.models.identity_request.IdentityRequest() # noqa: E501 - if include_optional : + model = IdentityRequest() # noqa: E501 + if include_optional: return IdentityRequest( - jwt = '', - issuer = '', - preferred_audience = '*' + jwt = '', + issuer = '', + preferred_audience = '*', + user_id_expression = '{sub}' ) - else : + else: return IdentityRequest( ) """ diff --git a/test/test_invite.py b/test/test_invite.py index fc2608a..10a7823 100644 --- a/test/test_invite.py +++ b/test/test_invite.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.invite import Invite # noqa: E501 -from authress.rest import ApiException class TestInvite(unittest.TestCase): """Invite unit test stubs""" @@ -29,66 +27,58 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Invite: """Test Invite include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Invite` """ - model = authress.models.invite.Invite() # noqa: E501 - if include_optional : + model = Invite() # noqa: E501 + if include_optional: return Invite( - invite_id = '', - tenant_id = None, + invite_id = '', + tenant_id = '', statements = [ - authress.models.statement.Statement( + authress.models.invite_statement.InviteStatement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( resource_uri = '/organizations/org_a/documents/doc_1', ) ], users = [ - authress.models.user.User( - user_id = 'oauth|userId', ) + '' ], groups = [ - authress.models.linked_group.LinkedGroup( - group_id = None, ) + '' ], ) - ], + ], links = authress.models.account_links.Account_links( self = authress.models.link.Link( href = '', rel = '', ), ) ) - else : + else: return Invite( invite_id = '', statements = [ - authress.models.statement.Statement( + authress.models.invite_statement.InviteStatement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( resource_uri = '/organizations/org_a/documents/doc_1', ) ], users = [ - authress.models.user.User( - user_id = 'oauth|userId', ) + '' ], groups = [ - authress.models.linked_group.LinkedGroup( - group_id = None, ) + '' ], ) ], - links = authress.models.account_links.Account_links( - self = authress.models.link.Link( - href = '', - rel = '', ), ), ) """ diff --git a/test/test_invite_statement.py b/test/test_invite_statement.py new file mode 100644 index 0000000..7514f16 --- /dev/null +++ b/test/test_invite_statement.py @@ -0,0 +1,72 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from authress.models.invite_statement import InviteStatement # noqa: E501 + +class TestInviteStatement(unittest.TestCase): + """InviteStatement unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> InviteStatement: + """Test InviteStatement + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `InviteStatement` + """ + model = InviteStatement() # noqa: E501 + if include_optional: + return InviteStatement( + roles = [ + None + ], + resources = [ + authress.models.resource.Resource( + resource_uri = '/organizations/org_a/documents/doc_1', ) + ], + users = [ + '' + ], + groups = [ + '' + ] + ) + else: + return InviteStatement( + roles = [ + None + ], + resources = [ + authress.models.resource.Resource( + resource_uri = '/organizations/org_a/documents/doc_1', ) + ], + ) + """ + + def testInviteStatement(self): + """Test InviteStatement""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_invites_api.py b/test/test_invites_api.py index 2890056..71e810a 100644 --- a/test/test_invites_api.py +++ b/test/test_invites_api.py @@ -3,54 +3,52 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.invites_api import InvitesApi # noqa: E501 -from authress.rest import ApiException class TestInvitesApi(unittest.TestCase): """InvitesApi unit test stubs""" - def setUp(self): - self.api = authress.api.invites_api.InvitesApi() # noqa: E501 + def setUp(self) -> None: + self.api = InvitesApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_invite(self): + def test_create_invite(self) -> None: """Test case for create_invite Create user invite # noqa: E501 """ pass - def test_delete_invite(self): + def test_delete_invite(self) -> None: """Test case for delete_invite Delete invite # noqa: E501 """ pass - def test_get_invite(self): + def test_get_invite(self) -> None: """Test case for get_invite Retrieve invite # noqa: E501 """ pass - def test_respond_to_invite(self): + def test_respond_to_invite(self) -> None: """Test case for respond_to_invite Accept invite # noqa: E501 diff --git a/test/test_link.py b/test/test_link.py index 8f351d7..7e78e91 100644 --- a/test/test_link.py +++ b/test/test_link.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.link import Link # noqa: E501 -from authress.rest import ApiException class TestLink(unittest.TestCase): """Link unit test stubs""" @@ -29,20 +27,20 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Link: """Test Link include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Link` """ - model = authress.models.link.Link() # noqa: E501 - if include_optional : + model = Link() # noqa: E501 + if include_optional: return Link( - href = '', + href = '', rel = '' ) - else : + else: return Link( href = '', ) diff --git a/test/test_linked_group.py b/test/test_linked_group.py index 5677e7f..f2dec2e 100644 --- a/test/test_linked_group.py +++ b/test/test_linked_group.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.linked_group import LinkedGroup # noqa: E501 -from authress.rest import ApiException class TestLinkedGroup(unittest.TestCase): """LinkedGroup unit test stubs""" @@ -29,21 +27,21 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> LinkedGroup: """Test LinkedGroup include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `LinkedGroup` """ - model = authress.models.linked_group.LinkedGroup() # noqa: E501 - if include_optional : + model = LinkedGroup() # noqa: E501 + if include_optional: return LinkedGroup( - group_id = None + group_id = 'grp_user_group_001' ) - else : + else: return LinkedGroup( - group_id = None, + group_id = 'grp_user_group_001', ) """ diff --git a/test/test_links.py b/test/test_links.py index c243108..1f39756 100644 --- a/test/test_links.py +++ b/test/test_links.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.links import Links # noqa: E501 -from authress.rest import ApiException class TestLinks(unittest.TestCase): """Links unit test stubs""" @@ -29,21 +27,21 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Links: """Test Links include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Links` """ - model = authress.models.links.Links() # noqa: E501 - if include_optional : + model = Links() # noqa: E501 + if include_optional: return Links( var_self = authress.models.link.Link( href = '', rel = '', ) ) - else : + else: return Links( var_self = authress.models.link.Link( href = '', diff --git a/test/test_o_auth_authorize_response.py b/test/test_o_auth_authorize_response.py index c400f24..26629ce 100644 --- a/test/test_o_auth_authorize_response.py +++ b/test/test_o_auth_authorize_response.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.o_auth_authorize_response import OAuthAuthorizeResponse # noqa: E501 -from authress.rest import ApiException class TestOAuthAuthorizeResponse(unittest.TestCase): """OAuthAuthorizeResponse unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> OAuthAuthorizeResponse: """Test OAuthAuthorizeResponse include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `OAuthAuthorizeResponse` """ - model = authress.models.o_auth_authorize_response.OAuthAuthorizeResponse() # noqa: E501 - if include_optional : + model = OAuthAuthorizeResponse() # noqa: E501 + if include_optional: return OAuthAuthorizeResponse( code = '' ) - else : + else: return OAuthAuthorizeResponse( code = '', ) diff --git a/test/test_o_auth_token_request.py b/test/test_o_auth_token_request.py index bdd19b4..cb8b25a 100644 --- a/test/test_o_auth_token_request.py +++ b/test/test_o_auth_token_request.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.o_auth_token_request import OAuthTokenRequest # noqa: E501 -from authress.rest import ApiException class TestOAuthTokenRequest(unittest.TestCase): """OAuthTokenRequest unit test stubs""" @@ -29,25 +27,25 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> OAuthTokenRequest: """Test OAuthTokenRequest include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `OAuthTokenRequest` """ - model = authress.models.o_auth_token_request.OAuthTokenRequest() # noqa: E501 - if include_optional : + model = OAuthTokenRequest() # noqa: E501 + if include_optional: return OAuthTokenRequest( - client_id = '', - client_secret = '', - code_verifier = '', - grant_type = 'client_credentials', - username = '', - password = '', + client_id = '', + client_secret = '', + code_verifier = '', + grant_type = 'client_credentials', + username = '', + password = '', type = 'signup' ) - else : + else: return OAuthTokenRequest( client_id = '', ) diff --git a/test/test_o_auth_token_response.py b/test/test_o_auth_token_response.py index 734c798..afcb850 100644 --- a/test/test_o_auth_token_response.py +++ b/test/test_o_auth_token_response.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.o_auth_token_response import OAuthTokenResponse # noqa: E501 -from authress.rest import ApiException class TestOAuthTokenResponse(unittest.TestCase): """OAuthTokenResponse unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> OAuthTokenResponse: """Test OAuthTokenResponse include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `OAuthTokenResponse` """ - model = authress.models.o_auth_token_response.OAuthTokenResponse() # noqa: E501 - if include_optional : + model = OAuthTokenResponse() # noqa: E501 + if include_optional: return OAuthTokenResponse( access_token = '' ) - else : + else: return OAuthTokenResponse( access_token = '', ) diff --git a/test/test_pagination.py b/test/test_pagination.py index 55b15d7..30553be 100644 --- a/test/test_pagination.py +++ b/test/test_pagination.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.pagination import Pagination # noqa: E501 -from authress.rest import ApiException class TestPagination(unittest.TestCase): """Pagination unit test stubs""" @@ -29,20 +27,20 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Pagination: """Test Pagination include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Pagination` """ - model = authress.models.pagination.Pagination() # noqa: E501 - if include_optional : + model = Pagination() # noqa: E501 + if include_optional: return Pagination( next = authress.models.pagination_next.Pagination_next( cursor = '', ) ) - else : + else: return Pagination( ) """ diff --git a/test/test_pagination_next.py b/test/test_pagination_next.py index 858354d..d4e994d 100644 --- a/test/test_pagination_next.py +++ b/test/test_pagination_next.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.pagination_next import PaginationNext # noqa: E501 -from authress.rest import ApiException class TestPaginationNext(unittest.TestCase): """PaginationNext unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> PaginationNext: """Test PaginationNext include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `PaginationNext` """ - model = authress.models.pagination_next.PaginationNext() # noqa: E501 - if include_optional : + model = PaginationNext() # noqa: E501 + if include_optional: return PaginationNext( cursor = '' ) - else : + else: return PaginationNext( cursor = '', ) diff --git a/test/test_permission_collection.py b/test/test_permission_collection.py index 5109066..b32db73 100644 --- a/test/test_permission_collection.py +++ b/test/test_permission_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.permission_collection import PermissionCollection # noqa: E501 -from authress.rest import ApiException class TestPermissionCollection(unittest.TestCase): """PermissionCollection unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> PermissionCollection: """Test PermissionCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `PermissionCollection` """ - model = authress.models.permission_collection.PermissionCollection() # noqa: E501 - if include_optional : + model = PermissionCollection() # noqa: E501 + if include_optional: return PermissionCollection( account = authress.models.permission_collection_account.PermissionCollection_account( - account_id = '', ), - user_id = None, + account_id = '', ), + user_id = 'oauth|userId', permissions = [ authress.models.permission_object.PermissionObject( action = 'documents:read', @@ -50,9 +48,9 @@ def make_instance(self, include_optional): delegate = True, ) ] ) - else : + else: return PermissionCollection( - user_id = None, + user_id = 'oauth|userId', permissions = [ authress.models.permission_object.PermissionObject( action = 'documents:read', diff --git a/test/test_permission_collection_account.py b/test/test_permission_collection_account.py index 58f1860..0e6fcb1 100644 --- a/test/test_permission_collection_account.py +++ b/test/test_permission_collection_account.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.permission_collection_account import PermissionCollectionAccount # noqa: E501 -from authress.rest import ApiException class TestPermissionCollectionAccount(unittest.TestCase): """PermissionCollectionAccount unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> PermissionCollectionAccount: """Test PermissionCollectionAccount include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `PermissionCollectionAccount` """ - model = authress.models.permission_collection_account.PermissionCollectionAccount() # noqa: E501 - if include_optional : + model = PermissionCollectionAccount() # noqa: E501 + if include_optional: return PermissionCollectionAccount( account_id = '' ) - else : + else: return PermissionCollectionAccount( ) """ diff --git a/test/test_permission_object.py b/test/test_permission_object.py index 665ae21..00e33e2 100644 --- a/test/test_permission_object.py +++ b/test/test_permission_object.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.permission_object import PermissionObject # noqa: E501 -from authress.rest import ApiException class TestPermissionObject(unittest.TestCase): """PermissionObject unit test stubs""" @@ -29,22 +27,22 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> PermissionObject: """Test PermissionObject include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `PermissionObject` """ - model = authress.models.permission_object.PermissionObject() # noqa: E501 - if include_optional : + model = PermissionObject() # noqa: E501 + if include_optional: return PermissionObject( - action = 'documents:read', - allow = True, - grant = True, + action = 'documents:read', + allow = True, + grant = True, delegate = True ) - else : + else: return PermissionObject( action = 'documents:read', allow = True, diff --git a/test/test_permissioned_resource.py b/test/test_permissioned_resource.py index 10e670c..76dd94e 100644 --- a/test/test_permissioned_resource.py +++ b/test/test_permissioned_resource.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.permissioned_resource import PermissionedResource # noqa: E501 -from authress.rest import ApiException class TestPermissionedResource(unittest.TestCase): """PermissionedResource unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> PermissionedResource: """Test PermissionedResource include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `PermissionedResource` """ - model = authress.models.permissioned_resource.PermissionedResource() # noqa: E501 - if include_optional : + model = PermissionedResource() # noqa: E501 + if include_optional: return PermissionedResource( permissions = [ authress.models.resource_permission.ResourcePermission( @@ -45,7 +43,7 @@ def make_instance(self, include_optional): allow = True, ) ] ) - else : + else: return PermissionedResource( permissions = [ authress.models.resource_permission.ResourcePermission( diff --git a/test/test_permissioned_resource_collection.py b/test/test_permissioned_resource_collection.py index ab9f470..e52ea12 100644 --- a/test/test_permissioned_resource_collection.py +++ b/test/test_permissioned_resource_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.permissioned_resource_collection import PermissionedResourceCollection # noqa: E501 -from authress.rest import ApiException class TestPermissionedResourceCollection(unittest.TestCase): """PermissionedResourceCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> PermissionedResourceCollection: """Test PermissionedResourceCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `PermissionedResourceCollection` """ - model = authress.models.permissioned_resource_collection.PermissionedResourceCollection() # noqa: E501 - if include_optional : + model = PermissionedResourceCollection() # noqa: E501 + if include_optional: return PermissionedResourceCollection( resources = [ authress.models.permissioned_resource.PermissionedResource( @@ -46,10 +44,10 @@ def make_instance(self, include_optional): action = 'CLAIM', allow = True, ) ], ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -58,7 +56,7 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return PermissionedResourceCollection( resources = [ authress.models.permissioned_resource.PermissionedResource( diff --git a/test/test_resource.py b/test/test_resource.py index 1840b6a..25f6377 100644 --- a/test/test_resource.py +++ b/test/test_resource.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.resource import Resource # noqa: E501 -from authress.rest import ApiException class TestResource(unittest.TestCase): """Resource unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Resource: """Test Resource include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Resource` """ - model = authress.models.resource.Resource() # noqa: E501 - if include_optional : + model = Resource() # noqa: E501 + if include_optional: return Resource( resource_uri = '/organizations/org_a/documents/doc_1' ) - else : + else: return Resource( resource_uri = '/organizations/org_a/documents/doc_1', ) diff --git a/test/test_resource_permission.py b/test/test_resource_permission.py index c2a6b50..d97fa97 100644 --- a/test/test_resource_permission.py +++ b/test/test_resource_permission.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.resource_permission import ResourcePermission # noqa: E501 -from authress.rest import ApiException class TestResourcePermission(unittest.TestCase): """ResourcePermission unit test stubs""" @@ -29,20 +27,20 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ResourcePermission: """Test ResourcePermission include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ResourcePermission` """ - model = authress.models.resource_permission.ResourcePermission() # noqa: E501 - if include_optional : + model = ResourcePermission() # noqa: E501 + if include_optional: return ResourcePermission( - action = 'CLAIM', + action = 'CLAIM', allow = True ) - else : + else: return ResourcePermission( action = 'CLAIM', allow = True, diff --git a/test/test_resource_permissions_api.py b/test/test_resource_permissions_api.py index ceefdff..17687e2 100644 --- a/test/test_resource_permissions_api.py +++ b/test/test_resource_permissions_api.py @@ -3,54 +3,52 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.resource_permissions_api import ResourcePermissionsApi # noqa: E501 -from authress.rest import ApiException class TestResourcePermissionsApi(unittest.TestCase): """ResourcePermissionsApi unit test stubs""" - def setUp(self): - self.api = authress.api.resource_permissions_api.ResourcePermissionsApi() # noqa: E501 + def setUp(self) -> None: + self.api = ResourcePermissionsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_get_permissioned_resource(self): + def test_get_permissioned_resource(self) -> None: """Test case for get_permissioned_resource Retrieve resource configuration # noqa: E501 """ pass - def test_get_permissioned_resources(self): + def test_get_permissioned_resources(self) -> None: """Test case for get_permissioned_resources List all resource configurations # noqa: E501 """ pass - def test_get_resource_users(self): + def test_get_resource_users(self) -> None: """Test case for get_resource_users List users with resource access # noqa: E501 """ pass - def test_update_permissioned_resource(self): + def test_update_permissioned_resource(self) -> None: """Test case for update_permissioned_resource Update resource configuration # noqa: E501 diff --git a/test/test_resource_users_collection.py b/test/test_resource_users_collection.py index 88c395c..47eda4d 100644 --- a/test/test_resource_users_collection.py +++ b/test/test_resource_users_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.resource_users_collection import ResourceUsersCollection # noqa: E501 -from authress.rest import ApiException class TestResourceUsersCollection(unittest.TestCase): """ResourceUsersCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> ResourceUsersCollection: """Test ResourceUsersCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `ResourceUsersCollection` """ - model = authress.models.resource_users_collection.ResourceUsersCollection() # noqa: E501 - if include_optional : + model = ResourceUsersCollection() # noqa: E501 + if include_optional: return ResourceUsersCollection( users = [ authress.models.user_role_collection.UserRoleCollection( @@ -46,10 +44,10 @@ def make_instance(self, include_optional): authress.models.user_role.UserRole( role_id = None, ) ], ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -58,7 +56,7 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return ResourceUsersCollection( users = [ authress.models.user_role_collection.UserRoleCollection( diff --git a/test/test_role.py b/test/test_role.py index 34751d4..234ec92 100644 --- a/test/test_role.py +++ b/test/test_role.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.role import Role # noqa: E501 -from authress.rest import ApiException class TestRole(unittest.TestCase): """Role unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Role: """Test Role include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Role` """ - model = authress.models.role.Role() # noqa: E501 - if include_optional : + model = Role() # noqa: E501 + if include_optional: return Role( - role_id = 'A0', - name = '0', - description = '', + role_id = 'A0', + name = '0', + description = '', permissions = [ authress.models.permission_object.PermissionObject( action = 'documents:read', @@ -50,9 +48,8 @@ def make_instance(self, include_optional): delegate = True, ) ] ) - else : + else: return Role( - role_id = 'A0', name = '0', permissions = [ authress.models.permission_object.PermissionObject( diff --git a/test/test_role_collection.py b/test/test_role_collection.py index fb4c435..65582e8 100644 --- a/test/test_role_collection.py +++ b/test/test_role_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.role_collection import RoleCollection # noqa: E501 -from authress.rest import ApiException class TestRoleCollection(unittest.TestCase): """RoleCollection unit test stubs""" @@ -29,15 +27,15 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> RoleCollection: """Test RoleCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `RoleCollection` """ - model = authress.models.role_collection.RoleCollection() # noqa: E501 - if include_optional : + model = RoleCollection() # noqa: E501 + if include_optional: return RoleCollection( roles = [ authress.models.role.Role( @@ -51,10 +49,10 @@ def make_instance(self, include_optional): grant = True, delegate = True, ) ], ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -63,7 +61,7 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return RoleCollection( roles = [ authress.models.role.Role( diff --git a/test/test_roles_api.py b/test/test_roles_api.py index 8394a73..cfc6da5 100644 --- a/test/test_roles_api.py +++ b/test/test_roles_api.py @@ -3,61 +3,59 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.roles_api import RolesApi # noqa: E501 -from authress.rest import ApiException class TestRolesApi(unittest.TestCase): """RolesApi unit test stubs""" - def setUp(self): - self.api = authress.api.roles_api.RolesApi() # noqa: E501 + def setUp(self) -> None: + self.api = RolesApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_role(self): + def test_create_role(self) -> None: """Test case for create_role Create role # noqa: E501 """ pass - def test_delete_role(self): + def test_delete_role(self) -> None: """Test case for delete_role - Deletes role # noqa: E501 + Delete role # noqa: E501 """ pass - def test_get_role(self): + def test_get_role(self) -> None: """Test case for get_role Retrieve role # noqa: E501 """ pass - def test_get_roles(self): + def test_get_roles(self) -> None: """Test case for get_roles List roles # noqa: E501 """ pass - def test_update_role(self): + def test_update_role(self) -> None: """Test case for update_role Update role # noqa: E501 diff --git a/test/test_service_clients_api.py b/test/test_service_clients_api.py index 92bbc0a..68b023e 100644 --- a/test/test_service_clients_api.py +++ b/test/test_service_clients_api.py @@ -3,75 +3,73 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.service_clients_api import ServiceClientsApi # noqa: E501 -from authress.rest import ApiException class TestServiceClientsApi(unittest.TestCase): """ServiceClientsApi unit test stubs""" - def setUp(self): - self.api = authress.api.service_clients_api.ServiceClientsApi() # noqa: E501 + def setUp(self) -> None: + self.api = ServiceClientsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_client(self): + def test_create_client(self) -> None: """Test case for create_client Create service client # noqa: E501 """ pass - def test_delete_access_key(self): + def test_delete_access_key(self) -> None: """Test case for delete_access_key Delete service client access key # noqa: E501 """ pass - def test_delete_client(self): + def test_delete_client(self) -> None: """Test case for delete_client Delete service client # noqa: E501 """ pass - def test_get_client(self): + def test_get_client(self) -> None: """Test case for get_client Retrieve service client # noqa: E501 """ pass - def test_get_clients(self): + def test_get_clients(self) -> None: """Test case for get_clients List service clients # noqa: E501 """ pass - def test_request_access_key(self): + def test_request_access_key(self) -> None: """Test case for request_access_key Generate service client access key # noqa: E501 """ pass - def test_update_client(self): + def test_update_client(self) -> None: """Test case for update_client Update service client # noqa: E501 diff --git a/test/test_statement.py b/test/test_statement.py index 96ecf2a..6af1fd2 100644 --- a/test/test_statement.py +++ b/test/test_statement.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.statement import Statement # noqa: E501 -from authress.rest import ApiException class TestStatement(unittest.TestCase): """Statement unit test stubs""" @@ -29,36 +27,36 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Statement: """Test Statement include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Statement` """ - model = authress.models.statement.Statement() # noqa: E501 - if include_optional : + model = Statement() # noqa: E501 + if include_optional: return Statement( roles = [ - 'A0' - ], + None + ], resources = [ authress.models.resource.Resource( resource_uri = '/organizations/org_a/documents/doc_1', ) - ], + ], users = [ authress.models.user.User( user_id = 'oauth|userId', ) - ], + ], groups = [ authress.models.linked_group.LinkedGroup( group_id = None, ) ] ) - else : + else: return Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( diff --git a/test/test_tenant.py b/test/test_tenant.py index 3fe3878..d628a5e 100644 --- a/test/test_tenant.py +++ b/test/test_tenant.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.tenant import Tenant # noqa: E501 -from authress.rest import ApiException class TestTenant(unittest.TestCase): """Tenant unit test stubs""" @@ -29,27 +27,30 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> Tenant: """Test Tenant include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `Tenant` """ - model = authress.models.tenant.Tenant() # noqa: E501 - if include_optional : + model = Tenant() # noqa: E501 + if include_optional: return Tenant( - tenant_id = '00', - tenant_lookup_identifier = '00', + tenant_id = '', + tenant_lookup_identifier = '', data = authress.models.tenant_data.Tenant_data( - name = '0', ), + name = '', ), + domains = [ + authress.models.tenant_domain.TenantDomain( + domain = 'y0', ) + ], connection = authress.models.tenant_connection.Tenant_connection( - connection_id = '00', ), + connection_id = '', ), created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f') ) - else : + else: return Tenant( - tenant_id = '00', ) """ diff --git a/test/test_tenant_collection.py b/test/test_tenant_collection.py index aee5e09..6b5c0ad 100644 --- a/test/test_tenant_collection.py +++ b/test/test_tenant_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.tenant_collection import TenantCollection # noqa: E501 -from authress.rest import ApiException class TestTenantCollection(unittest.TestCase): """TenantCollection unit test stubs""" @@ -29,40 +27,48 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> TenantCollection: """Test TenantCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `TenantCollection` """ - model = authress.models.tenant_collection.TenantCollection() # noqa: E501 - if include_optional : + model = TenantCollection() # noqa: E501 + if include_optional: return TenantCollection( tenants = [ authress.models.tenant.Tenant( - tenant_id = '00', - tenant_lookup_identifier = '00', + tenant_id = '', + tenant_lookup_identifier = '', data = authress.models.tenant_data.Tenant_data( - name = '0', ), + name = '', ), + domains = [ + authress.models.tenant_domain.TenantDomain( + domain = 'y0', ) + ], connection = authress.models.tenant_connection.Tenant_connection( - connection_id = '00', ), + connection_id = '', ), created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( cursor = '', ), ) ) - else : + else: return TenantCollection( tenants = [ authress.models.tenant.Tenant( - tenant_id = '00', - tenant_lookup_identifier = '00', + tenant_id = '', + tenant_lookup_identifier = '', data = authress.models.tenant_data.Tenant_data( - name = '0', ), + name = '', ), + domains = [ + authress.models.tenant_domain.TenantDomain( + domain = 'y0', ) + ], connection = authress.models.tenant_connection.Tenant_connection( - connection_id = '00', ), + connection_id = '', ), created_time = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f'), ) ], ) diff --git a/test/test_tenant_connection.py b/test/test_tenant_connection.py index 0a67810..b48861b 100644 --- a/test/test_tenant_connection.py +++ b/test/test_tenant_connection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.tenant_connection import TenantConnection # noqa: E501 -from authress.rest import ApiException class TestTenantConnection(unittest.TestCase): """TenantConnection unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> TenantConnection: """Test TenantConnection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `TenantConnection` """ - model = authress.models.tenant_connection.TenantConnection() # noqa: E501 - if include_optional : + model = TenantConnection() # noqa: E501 + if include_optional: return TenantConnection( - connection_id = '00' + connection_id = '' ) - else : + else: return TenantConnection( ) """ diff --git a/test/test_tenant_data.py b/test/test_tenant_data.py index 9e5eb36..19704a7 100644 --- a/test/test_tenant_data.py +++ b/test/test_tenant_data.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.tenant_data import TenantData # noqa: E501 -from authress.rest import ApiException class TestTenantData(unittest.TestCase): """TenantData unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> TenantData: """Test TenantData include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `TenantData` """ - model = authress.models.tenant_data.TenantData() # noqa: E501 - if include_optional : + model = TenantData() # noqa: E501 + if include_optional: return TenantData( - name = '0' + name = '' ) - else : + else: return TenantData( ) """ diff --git a/test/test_tenant_domain.py b/test/test_tenant_domain.py new file mode 100644 index 0000000..c1e4276 --- /dev/null +++ b/test/test_tenant_domain.py @@ -0,0 +1,54 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from authress.models.tenant_domain import TenantDomain # noqa: E501 + +class TestTenantDomain(unittest.TestCase): + """TenantDomain unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> TenantDomain: + """Test TenantDomain + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `TenantDomain` + """ + model = TenantDomain() # noqa: E501 + if include_optional: + return TenantDomain( + domain = 'y0' + ) + else: + return TenantDomain( + domain = 'y0', + ) + """ + + def testTenantDomain(self): + """Test TenantDomain""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_tenant_user.py b/test/test_tenant_user.py new file mode 100644 index 0000000..922220b --- /dev/null +++ b/test/test_tenant_user.py @@ -0,0 +1,53 @@ +# coding: utf-8 + +""" + Authress + +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

+ + The version of the OpenAPI document: v1 + Contact: support@authress.io + Generated by OpenAPI Generator (https://openapi-generator.tech) + + Do not edit the class manually. +""" # noqa: E501 + + +import unittest +import datetime + +from authress.models.tenant_user import TenantUser # noqa: E501 + +class TestTenantUser(unittest.TestCase): + """TenantUser unit test stubs""" + + def setUp(self): + pass + + def tearDown(self): + pass + + def make_instance(self, include_optional) -> TenantUser: + """Test TenantUser + include_option is a boolean, when False only required + params are included, when True both required and + optional params are included """ + # uncomment below to create an instance of `TenantUser` + """ + model = TenantUser() # noqa: E501 + if include_optional: + return TenantUser( + user_id = 'oauth|userId' + ) + else: + return TenantUser( + ) + """ + + def testTenantUser(self): + """Test TenantUser""" + # inst_req_only = self.make_instance(include_optional=False) + # inst_req_and_optional = self.make_instance(include_optional=True) + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_tenants_api.py b/test/test_tenants_api.py index 3767d84..6242aef 100644 --- a/test/test_tenants_api.py +++ b/test/test_tenants_api.py @@ -3,61 +3,66 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.tenants_api import TenantsApi # noqa: E501 -from authress.rest import ApiException class TestTenantsApi(unittest.TestCase): """TenantsApi unit test stubs""" - def setUp(self): - self.api = authress.api.tenants_api.TenantsApi() # noqa: E501 + def setUp(self) -> None: + self.api = TenantsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_create_tenant(self): + def test_create_tenant(self) -> None: """Test case for create_tenant Create tenant # noqa: E501 """ pass - def test_delete_tenant(self): + def test_delete_tenant(self) -> None: """Test case for delete_tenant Delete tenant # noqa: E501 """ pass - def test_get_tenant(self): + def test_get_tenant(self) -> None: """Test case for get_tenant Retrieve tenant # noqa: E501 """ pass - def test_get_tenants(self): + def test_get_tenants(self) -> None: """Test case for get_tenants List tenants # noqa: E501 """ pass - def test_update_tenant(self): + def test_link_tenant_user(self) -> None: + """Test case for link_tenant_user + + Link tenant user # noqa: E501 + """ + pass + + def test_update_tenant(self) -> None: """Test case for update_tenant Update tenant # noqa: E501 diff --git a/test/test_token_request.py b/test/test_token_request.py index 71619af..d55e9a9 100644 --- a/test/test_token_request.py +++ b/test/test_token_request.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.token_request import TokenRequest # noqa: E501 -from authress.rest import ApiException class TestTokenRequest(unittest.TestCase): """TokenRequest unit test stubs""" @@ -29,20 +27,20 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> TokenRequest: """Test TokenRequest include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `TokenRequest` """ - model = authress.models.token_request.TokenRequest() # noqa: E501 - if include_optional : + model = TokenRequest() # noqa: E501 + if include_optional: return TokenRequest( statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( @@ -56,15 +54,15 @@ def make_instance(self, include_optional): authress.models.linked_group.LinkedGroup( group_id = None, ) ], ) - ], + ], expires = datetime.datetime.strptime('2013-10-20 19:20:30.00', '%Y-%m-%d %H:%M:%S.%f') ) - else : + else: return TokenRequest( statements = [ authress.models.statement.Statement( roles = [ - 'A0' + None ], resources = [ authress.models.resource.Resource( diff --git a/test/test_user.py b/test/test_user.py index 0e47ee3..77b3543 100644 --- a/test/test_user.py +++ b/test/test_user.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.user import User # noqa: E501 -from authress.rest import ApiException class TestUser(unittest.TestCase): """User unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> User: """Test User include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `User` """ - model = authress.models.user.User() # noqa: E501 - if include_optional : + model = User() # noqa: E501 + if include_optional: return User( user_id = 'oauth|userId' ) - else : + else: return User( user_id = 'oauth|userId', ) diff --git a/test/test_user_connection_credentials.py b/test/test_user_connection_credentials.py index 2e0a0de..53f1309 100644 --- a/test/test_user_connection_credentials.py +++ b/test/test_user_connection_credentials.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.user_connection_credentials import UserConnectionCredentials # noqa: E501 -from authress.rest import ApiException class TestUserConnectionCredentials(unittest.TestCase): """UserConnectionCredentials unit test stubs""" @@ -29,19 +27,19 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> UserConnectionCredentials: """Test UserConnectionCredentials include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `UserConnectionCredentials` """ - model = authress.models.user_connection_credentials.UserConnectionCredentials() # noqa: E501 - if include_optional : + model = UserConnectionCredentials() # noqa: E501 + if include_optional: return UserConnectionCredentials( access_token = '' ) - else : + else: return UserConnectionCredentials( access_token = '', ) diff --git a/test/test_user_identity.py b/test/test_user_identity.py index 2138b9b..0e10e6c 100644 --- a/test/test_user_identity.py +++ b/test/test_user_identity.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.user_identity import UserIdentity # noqa: E501 -from authress.rest import ApiException class TestUserIdentity(unittest.TestCase): """UserIdentity unit test stubs""" @@ -29,22 +27,22 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> UserIdentity: """Test UserIdentity include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `UserIdentity` """ - model = authress.models.user_identity.UserIdentity() # noqa: E501 - if include_optional : + model = UserIdentity() # noqa: E501 + if include_optional: return UserIdentity( - user_id = 'oauth|userId', - name = 'Example User', - picture = 'https://www.gravatar.com/avatar/userId', + user_id = 'oauth|userId', + name = 'Example User', + picture = 'https://www.gravatar.com/avatar/userId', email = 'user@company.com' ) - else : + else: return UserIdentity( user_id = 'oauth|userId', ) diff --git a/test/test_user_identity_collection.py b/test/test_user_identity_collection.py index dcee643..06e3f8a 100644 --- a/test/test_user_identity_collection.py +++ b/test/test_user_identity_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.user_identity_collection import UserIdentityCollection # noqa: E501 -from authress.rest import ApiException class TestUserIdentityCollection(unittest.TestCase): """UserIdentityCollection unit test stubs""" @@ -29,26 +27,26 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> UserIdentityCollection: """Test UserIdentityCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `UserIdentityCollection` """ - model = authress.models.user_identity_collection.UserIdentityCollection() # noqa: E501 - if include_optional : + model = UserIdentityCollection() # noqa: E501 + if include_optional: return UserIdentityCollection( users = [ authress.models.user_identity.UserIdentity( - user_id = 'oauth|userId', + user_id = None, name = 'Example User', picture = 'https://www.gravatar.com/avatar/userId', email = 'user@company.com', ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -57,11 +55,11 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return UserIdentityCollection( users = [ authress.models.user_identity.UserIdentity( - user_id = 'oauth|userId', + user_id = None, name = 'Example User', picture = 'https://www.gravatar.com/avatar/userId', email = 'user@company.com', ) diff --git a/test/test_user_permissions_api.py b/test/test_user_permissions_api.py index e32f0e2..309fac7 100644 --- a/test/test_user_permissions_api.py +++ b/test/test_user_permissions_api.py @@ -3,54 +3,52 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.user_permissions_api import UserPermissionsApi # noqa: E501 -from authress.rest import ApiException class TestUserPermissionsApi(unittest.TestCase): """UserPermissionsApi unit test stubs""" - def setUp(self): - self.api = authress.api.user_permissions_api.UserPermissionsApi() # noqa: E501 + def setUp(self) -> None: + self.api = UserPermissionsApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_authorize_user(self): + def test_authorize_user(self) -> None: """Test case for authorize_user Verify user authorization # noqa: E501 """ pass - def test_get_user_permissions_for_resource(self): + def test_get_user_permissions_for_resource(self) -> None: """Test case for get_user_permissions_for_resource Get user permissions for resource # noqa: E501 """ pass - def test_get_user_resources(self): + def test_get_user_resources(self) -> None: """Test case for get_user_resources List user resources # noqa: E501 """ pass - def test_get_user_roles_for_resource(self): + def test_get_user_roles_for_resource(self) -> None: """Test case for get_user_roles_for_resource Get user roles for resource # noqa: E501 diff --git a/test/test_user_resources_collection.py b/test/test_user_resources_collection.py index 4402956..2fd1493 100644 --- a/test/test_user_resources_collection.py +++ b/test/test_user_resources_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.user_resources_collection import UserResourcesCollection # noqa: E501 -from authress.rest import ApiException class TestUserResourcesCollection(unittest.TestCase): """UserResourcesCollection unit test stubs""" @@ -29,26 +27,26 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> UserResourcesCollection: """Test UserResourcesCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `UserResourcesCollection` """ - model = authress.models.user_resources_collection.UserResourcesCollection() # noqa: E501 - if include_optional : + model = UserResourcesCollection() # noqa: E501 + if include_optional: return UserResourcesCollection( account = authress.models.permission_collection_account.PermissionCollection_account( - account_id = '', ), - user_id = None, + account_id = '', ), + user_id = 'oauth|userId', resources = [ authress.models.resource.Resource( resource_uri = '/organizations/org_a/documents/doc_1', ) - ], + ], pagination = authress.models.pagination.Pagination( next = authress.models.pagination_next.Pagination_next( - cursor = '', ), ), + cursor = '', ), ), links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', @@ -57,9 +55,9 @@ def make_instance(self, include_optional): href = '', rel = '', ), ) ) - else : + else: return UserResourcesCollection( - user_id = None, + user_id = 'oauth|userId', links = authress.models.collection_links.CollectionLinks( self = authress.models.link.Link( href = '', diff --git a/test/test_user_role.py b/test/test_user_role.py index c4e1e60..5c3ed65 100644 --- a/test/test_user_role.py +++ b/test/test_user_role.py @@ -3,21 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest +import datetime -import authress from authress.models.user_role import UserRole # noqa: E501 -from authress.rest import ApiException class TestUserRole(unittest.TestCase): """UserRole unit test stubs""" @@ -28,21 +27,21 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> UserRole: """Test UserRole include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `UserRole` """ - model = authress.models.user_role.UserRole() # noqa: E501 - if include_optional : + model = UserRole() # noqa: E501 + if include_optional: return UserRole( - role_id = None + role_id = 'A0' ) - else : + else: return UserRole( - role_id = None, + role_id = 'A0', ) """ diff --git a/test/test_user_role_collection.py b/test/test_user_role_collection.py index 7c0822b..21e622b 100644 --- a/test/test_user_role_collection.py +++ b/test/test_user_role_collection.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.user_role_collection import UserRoleCollection # noqa: E501 -from authress.rest import ApiException class TestUserRoleCollection(unittest.TestCase): """UserRoleCollection unit test stubs""" @@ -29,25 +27,25 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> UserRoleCollection: """Test UserRoleCollection include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `UserRoleCollection` """ - model = authress.models.user_role_collection.UserRoleCollection() # noqa: E501 - if include_optional : + model = UserRoleCollection() # noqa: E501 + if include_optional: return UserRoleCollection( - user_id = None, + user_id = 'oauth|userId', roles = [ authress.models.user_role.UserRole( role_id = None, ) ] ) - else : + else: return UserRoleCollection( - user_id = None, + user_id = 'oauth|userId', roles = [ authress.models.user_role.UserRole( role_id = None, ) diff --git a/test/test_user_token.py b/test/test_user_token.py index ebd2ffc..bfb52ab 100644 --- a/test/test_user_token.py +++ b/test/test_user_token.py @@ -3,22 +3,20 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest import datetime -import authress from authress.models.user_token import UserToken # noqa: E501 -from authress.rest import ApiException class TestUserToken(unittest.TestCase): """UserToken unit test stubs""" @@ -29,29 +27,29 @@ def setUp(self): def tearDown(self): pass - def make_instance(self, include_optional): + def make_instance(self, include_optional) -> UserToken: """Test UserToken include_option is a boolean, when False only required params are included, when True both required and optional params are included """ # uncomment below to create an instance of `UserToken` """ - model = authress.models.user_token.UserToken() # noqa: E501 - if include_optional : + model = UserToken() # noqa: E501 + if include_optional: return UserToken( account = authress.models.permission_collection_account.PermissionCollection_account( - account_id = '', ), - user_id = None, - token_id = '', - token = '', + account_id = '', ), + user_id = 'oauth|userId', + token_id = '', + token = '', links = authress.models.account_links.Account_links( self = authress.models.link.Link( href = '', rel = '', ), ) ) - else : + else: return UserToken( - user_id = None, + user_id = 'oauth|userId', token_id = '', token = '', ) diff --git a/test/test_users_api.py b/test/test_users_api.py index 4511a03..ae3359d 100644 --- a/test/test_users_api.py +++ b/test/test_users_api.py @@ -3,53 +3,58 @@ """ Authress -

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

# noqa: E501 +

Introduction

Welcome to the Authress Authorization API.
The Authress REST API provides the operations and resources necessary to create records, assign permissions, and verify any user in your platform.

  • Manage multitenant platforms and create user tenants for SSO connections.
  • Create records to assign roles and resources to grant access for users.
  • Check user access control by calling the authorization API at the right time.
  • Configure service clients to securely access services in your platform.

For more in-depth scenarios check out the Authress knowledge base.

The version of the OpenAPI document: v1 Contact: support@authress.io Generated by OpenAPI Generator (https://openapi-generator.tech) Do not edit the class manually. -""" +""" # noqa: E501 import unittest -import authress from authress.api.users_api import UsersApi # noqa: E501 -from authress.rest import ApiException class TestUsersApi(unittest.TestCase): """UsersApi unit test stubs""" - def setUp(self): - self.api = authress.api.users_api.UsersApi() # noqa: E501 + def setUp(self) -> None: + self.api = UsersApi() # noqa: E501 - def tearDown(self): + def tearDown(self) -> None: pass - def test_delete_user(self): + def test_delete_user(self) -> None: """Test case for delete_user Delete a user # noqa: E501 """ pass - def test_get_user(self): + def test_get_user(self) -> None: """Test case for get_user Retrieve a user # noqa: E501 """ pass - def test_get_users(self): + def test_get_users(self) -> None: """Test case for get_users List users # noqa: E501 """ pass + def test_link_tenant_user(self) -> None: + """Test case for link_tenant_user + + Link tenant user # noqa: E501 + """ + pass + if __name__ == '__main__': unittest.main()