# IAM

> Manage Projects and Access Policies with IAM Service.

## Install Dependency

Package: affinidi_tdk_iam_client

```bash
pip install affinidi_tdk_iam_client
```

Check the latest version on the [PyPI repository](https://pypi.org/project/affinidi_tdk_iam_client/) or view the source on [GitHub](https://github.com/affinidi/affinidi-tdk/tree/main/clients/python/iam_client).

## Classes and Methods

### Projects API

Use the Projects API to manage your projects including providing access to other users on your projects.

#### add_principal_to_project

Adds a principal to the project.

Parameters

    add_user_to_project_input
    [AddUserToProjectInput](https://github.com/affinidi/affinidi-tdk/blob/main/clients/python/iam_client/docs/AddUserToProjectInput.md)
    Required
  Principal ID and principal type (user or token).

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['ProjectTokenAuth'] = projectScopedToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.ProjectsApi(api_client)

    request_json = {
        'principalId': '

',
        'principalType': 'token',
    }

    add_user_to_project_input = affinidi_tdk_iam_client.AddUserToProjectInput.from_dict(request_json)
    api_response = api_instance.add_principal_to_project(add_user_to_project_input=add_user_to_project_input)
```

#### create_project

Creates a project for your account.

Parameters

    create_project_input
    [CreateProjectInput](https://github.com/affinidi/affinidi-tdk/blob/main/clients/python/iam_client/docs/CreateProjectInput.md)
    Required
  Project name and description. Requires a user token (UserTokenAuth).

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.ProjectsApi(api_client)

    request_json = {
        'name': 'project_name',
        'description': 'project_description',
    }

    create_project_input = affinidi_tdk_iam_client.CreateProjectInput.from_dict(request_json)
    api_response = api_instance.create_project(create_project_input=create_project_input)
```

#### delete_principal_from_project

Removes a principal from the project.

Parameters

    principalId
    str
    Required
  ID of the user or Personal Access Token (PAT).

    principalType
    str
    Required
  Type of the principal: user for a user or token for a PAT.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['ProjectTokenAuth'] = projectScopedToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.ProjectsApi(api_client)
    api_response = api_instance.delete_principal_from_project('

', 'token')
```

#### list_principals_of_project

Returns the list of principals assigned to the project.

No parameters required.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['ProjectTokenAuth'] = projectScopedToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.ProjectsApi(api_client)
    api_response = api_instance.list_principals_of_project()
```

#### list_project

Returns the list of projects for the current account.

No parameters required.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.ProjectsApi(api_client)
    api_response = api_instance.list_project()
```

#### update_project

Updates the project details.

Parameters

    projectId
    str
    Required
  ID of the project to update.

    update_project_input
    [UpdateProjectInput](https://github.com/affinidi/affinidi-tdk/blob/main/clients/python/iam_client/docs/UpdateProjectInput.md)
    Required
  Updated project name and description. Requires a user token (UserTokenAuth).

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.ProjectsApi(api_client)

    request_json = {
        'name': 'project_name',
        'description': 'project_description',
    }

    update_project_input = affinidi_tdk_iam_client.UpdateProjectInput.from_dict(request_json)
    api_response = api_instance.update_project('

', update_project_input=update_project_input)
```

### Policies API

Use the Policies API to manage access to your projects and related resources for other users.

#### get_policies

Retrieves the policy attached to a principal.

Parameters

    principalId
    str
    Required
  ID of the user or Personal Access Token (PAT).

    principalType
    str
    Required
  Type of the principal: user for a user or token for a PAT.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['ProjectTokenAuth'] = projectScopedToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.PoliciesApi(api_client)
    api_response = api_instance.get_policies('

', 'token')
```

#### update_policies

Updates the policy for a principal.

Parameters

    principalId
    str
    Required
  ID of the user or Personal Access Token (PAT).

    principalType
    str
    Required
  Type of the principal: user for a user or token for a PAT.

    policy_dto
    [PolicyDto](https://github.com/affinidi/affinidi-tdk/blob/main/clients/python/iam_client/docs/PolicyDto.md)
    Required
  Policy document with version, statements, principals, actions, resources, and effect.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['ProjectTokenAuth'] = projectScopedToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.PoliciesApi(api_client)

    policy_info = {
        'version': '2022-12-15',
        'statement': [
            {
                'principal': ['

'],
                'action': [''],
                'resource': [''],
                'effect': 'Allow',
            }
        ],
    }

    api_response = api_instance.update_policies('

', 'token', policy_info)
```

### Secure Token Exchange (STS) API

Use the STS (Secure Token Exchange) API to create a Project Scoped Token and get the current session information.

#### create_project_scoped_token

Creates a project-scoped token to access resources in the project.

Parameters

    create_project_scoped_token_input
    [CreateProjectScopedTokenInput](https://github.com/affinidi/affinidi-tdk/blob/main/clients/python/iam_client/docs/CreateProjectScopedTokenInput.md)
    Required
  Project ID to generate the token for. Requires a user token (UserTokenAuth).

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.StsApi(api_client)

    request_json = {
        'projectId': '

',
    }

    create_project_scoped_token_input = affinidi_tdk_iam_client.CreateProjectScopedTokenInput.from_dict(request_json)
    api_response = api_instance.create_project_scoped_token(project_scoped_token_input=create_project_scoped_token_input)
```

#### whoami

Retrieves the principal information of the current session.

No parameters required.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.StsApi(api_client)
    api_response = api_instance.whoami()
```

### Tokens API

Use the Tokens API to create a Personal Access Token (PAT) to call Affinidi services on your behalf. Alternatively, use the Token command from Affinidi CLI.

#### create_token

Creates a Personal Access Token.

Parameters

    create_token_input
    [CreateTokenInput](https://github.com/affinidi/affinidi-tdk/blob/main/clients/python/iam_client/docs/CreateTokenInput.md)
    Required
  Token name, signing algorithm, and public key JWKs. Requires a user token (UserTokenAuth).

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.TokensApi(api_client)

    request_json = {
        'name': 'token_name',
        'authenticationMethod': {
            'type': 'PRIVATE_KEY',
            'signingAlgorithm': 'RS256',
            'publicKeyInfo': {
                'jwks': {
                    'keys': [
                        {
                            'kid': 'key-id',
                            'alg': 'RS256',
                            'use': 'sig',
                            'kty': 'RSA',
                            'n': '',
                            'e': 'AQAB',
                        }
                    ]
                }
            },
        },
    }

    create_token_input = affinidi_tdk_iam_client.CreateTokenInput.from_dict(request_json)
    api_response = api_instance.create_token(create_token_input=create_token_input)
```

#### delete_token

Deletes a Personal Access Token.

Parameters

    tokenId
    str
    Required
  ID of the Personal Access Token to delete.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.TokensApi(api_client)
    api_response = api_instance.delete_token('')
```

#### get_token

Retrieves the Personal Access Token details.

Parameters

    tokenId
    str
    Required
  ID of the Personal Access Token to retrieve.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.TokensApi(api_client)
    api_response = api_instance.get_token('')
```

#### list_token

Returns the list of Personal Access Tokens.

No parameters required.

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.TokensApi(api_client)
    api_response = api_instance.list_token()
```

#### update_token

Updates an existing Personal Access Token.

Parameters

    tokenId
    str
    Required
  ID of the Personal Access Token to update.

    update_token_input
    [UpdateTokenInput](https://github.com/affinidi/affinidi-tdk/blob/main/clients/python/iam_client/docs/UpdateTokenInput.md)
    Required
  Updated token name and public key JWKs. Requires a user token (UserTokenAuth).

Example

```python
import affinidi_tdk_iam_client

configuration = affinidi_tdk_iam_client.Configuration()
configuration.api_key['UserTokenAuth'] = userToken

with affinidi_tdk_iam_client.ApiClient(configuration) as api_client:
    api_instance = affinidi_tdk_iam_client.TokensApi(api_client)

    request_json = {
        'name': 'token_name',
        'authenticationMethod': {
            'type': 'PRIVATE_KEY',
            'signingAlgorithm': 'RS256',
            'publicKeyInfo': {
                'jwks': {
                    'keys': [
                        {
                            'kid': 'key-id',
                            'alg': 'RS256',
                            'use': 'sig',
                            'kty': 'RSA',
                            'n': '',
                            'e': 'AQAB',
                        }
                    ]
                }
            },
        },
    }

    update_token_input = affinidi_tdk_iam_client.UpdateTokenInput.from_dict(request_json)
    api_response = api_instance.update_token('', update_token_input=update_token_input)
```
