# IAM

> Manage Projects and Access Policies with IAM Service.

## Install Dependency

Package: affinidi_tdk_iam_client

```bash
dart pub add affinidi_tdk_iam
```

Check the latest version on [pub.dev](https://pub.dev/packages/affinidi_tdk_iam_client) or view the source on [GitHub](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client).

## Classes and Methods

### Projects API

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

#### addPrincipalToProject

Add a principal to the project to get access.

Parameters

    addUserToProjectInput
    [AddUserToProjectInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client/doc/AddUserToProjectInput.md)
    Required
  Principal ID and principal type to add to the project.

Example

```dart
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';
import 'package:dio/dio.dart';

try {
    late ProjectsApi projectsApi;

    final dio = Dio(BaseOptions(
      baseUrl: AffinidiTdkIamClient.basePath,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 5),
    ));
    final apiClient = AffinidiTdkIamClient(
        dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);
    projectsApi = apiClient.getProjectsApi();

    final addUserToProjectInput = AddUserToProjectInputBuilder()
      ..principalId = "

"
      ..principalType = "token";

    final response = (await projectsApi.addPrincipalToProject(
        addUserToProjectInput: addUserToProjectInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### createProject

Create a project for your account.

Parameters

    createProjectInput
    [CreateProjectInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client/doc/CreateProjectInput.md)
    Required
  Project name and description.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late ProjectsApi projectsApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    projectsApi = apiClient.getProjectsApi();

    final createProjectInput =
        CreateProjectInputBuilder()
          ..name = "Project Name"
          ..description = "Project Description";
    final response = (await projectsApi.createProject(
      createProjectInput: createProjectInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### deletePrincipalFromProject

Delete a principal (user or PAT) from the project to remove access.

Parameters

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

    principalType
    String
    Required
  Type of the principal: user for user, token for Personal Access Token.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late ProjectsApi projectsApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    projectsApi = apiClient.getProjectsApi();

    final principalId = "

";
    final principalType = "token";

    final response = (await projectsApi.deletePrincipalFromProject(
      principalId: principaId,
      principalType: principalType,
      ));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### listPrincipalsOfProject

Get the list of principals assigned to the project.

Parameters

    limit
    Integer
    Optional
  Maximum number of principals to return.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late ProjectsApi projectsApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    projectsApi = apiClient.getProjectsApi();

    final int limit = 100;

    final response = (await projectsApi.listPrincipalsOfProject(
      limit : limit
    ));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### listProject

Get the list of projects.

Parameters

    limit
    Integer
    Optional
  Maximum number of projects to return.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late ProjectsApi projectsApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    projectsApi = apiClient.getProjectsApi();

    final int limit = 100;

    final response = (await projectsApi.listProject(
      limit : limit
    ));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### updateProject

Update the project details.

Parameters

    projectId
    String
    Required
  ID of the project to update.

    updateProjectInput
    [UpdateProjectInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client/doc/UpdateProjectInput.md)
    Required
  Project name and description to update.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late ProjectsApi projectsApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    projectsApi = apiClient.getProjectsApi();

    final updateProjectInput = UpdateProjectInputBuilder()
      ..name = "project_name"
      ..description = "project_description";

    final projectID = "

";

    final response = (await projectsApi.updateProject(projectId: projectID, updateProjectInput:  updateProjectInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Policies API

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

#### getPolicies

Retrieves the policy attached to a principal.

Parameters

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

    principalType
    String
    Required
  Type of the principal: user for user, token for Personal Access Token.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late PoliciesApi policiesApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    policiesApi = apiClient.getPoliciesApi();

    final principalId = "

";
    final principalType = "token";

    final response = (await policiesApi.getPolicies(
      principalId: principalId,
      principalType: principalType,
    ));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### updatePolicies

Update the policy for the principal.

Parameters

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

    principalType
    String
    Required
  Type of the principal: user for user, token for Personal Access Token.

    policyDto
    [PolicyDto](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client/doc/PolicyDto.md)
    Required
  Policy rules to apply.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late PoliciesApi policiesApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    policiesApi = apiClient.getPoliciesApi();

    final policyDto =
        PolicyDtoBuilder()
          ..version = '2022-12-15'
          ..statement = ListBuilder

([
            (PolicyStatementDtoBuilder()
                  ..action = ListBuilder([''])
                  ..effect = 'Allow'
                  ..principal = ListBuilder(['principals'])
                  ..resource = ListBuilder(['resources']))
                .build(),
          ]);

    final principalId = "

";
    final principalType = "token";

    final response =
        (await policiesApi.updatePolicies(
          principalId: principalId,
          principalType: principalType,
          policyDto: policyDto.build(),
        )).data;

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### Secure Token Exchange (STS) API

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

#### createProjectScopedToken

Create a project scoped token to access resources in the project.

Parameters

    createProjectScopedTokenInput
    [CreateProjectScopedTokenInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client/doc/CreateProjectScopedTokenInput.md)
    Required
  Project ID to generate the token for.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late StsApi stsApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    stsApi = apiClient.getStsApi();

    final createProjectScopedTokenInput =
        CreateProjectScopedTokenInputBuilder()..projectId = "

";

    final response =
        (await stsApi.createProjectScopedToken(
          createProjectScopedTokenInput: createProjectScopedTokenInput.build(),
        )).data;

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### whoami

Retrieve the principal information of the current user.

No parameters required.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late StsApi stsApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    stsApi = apiClient.getStsApi();

    final response =
        (await stsApi.whoami());

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

### 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.

#### createToken

Create a Personal Access Token.

Parameters

    createTokenInput
    [CreateTokenInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client/doc/CreateTokenInput.md)
    Required
  Details of the PAT including name and public key info.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late TokensApi tokensApi;

    final dio = Dio(
      BaseOptions(
        baseUrl: AffinidiTdkIamClient.basePath,
        connectTimeout: const Duration(seconds: 5),
        receiveTimeout: const Duration(seconds: 5),
      ),
    );
    final apiClient = AffinidiTdkIamClient(
      dio: dio,
      authTokenHook: authProvider.fetchProjectScopedToken,
    );
    tokensApi = apiClient.getTokensApi();

    final createTokenInput = CreateTokenInputBuilder()
      ..name = "token_name";

    final response = (await tokensApi.createToken(createTokenInput: createTokenInput.build())).data; 
    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### deleteToken

Delete a Personal Access Token.

Parameters

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

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late TokensApi tokensApi;

    final dio = Dio(BaseOptions(
      baseUrl: AffinidiTdkIamClient.basePath,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 5),
    ));
    final apiClient = AffinidiTdkIamClient(
        dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);
    tokensApi = apiClient.getTokensApi();

    final tokenId = "";

    final response = (await tokensApi.deleteToken(tokenId: tokenId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### getToken

Retrieve the Personal Access Token details.

Parameters

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

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late TokensApi tokensApi;

    final dio = Dio(BaseOptions(
      baseUrl: AffinidiTdkIamClient.basePath,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 5),
    ));
    final apiClient = AffinidiTdkIamClient(
        dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);
    tokensApi = apiClient.getTokensApi();

    final tokenId = "";

    final response = (await tokensApi.getToken(tokenId: tokenId));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### listToken

Get the list of Personal Access Tokens.

Parameters

    limit
    Integer
    Optional
  Maximum number of tokens to return.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late TokensApi tokensApi;

    final dio = Dio(BaseOptions(
      baseUrl: AffinidiTdkIamClient.basePath,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 5),
    ));
    final apiClient = AffinidiTdkIamClient(
        dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);
    tokensApi = apiClient.getTokensApi();

    final limit = 10;

    final response = (await tokensApi.listToken(limit: limit));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```

#### updateToken

Update an existing Personal Access Token.

Parameters

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

    updateTokenInput
    [UpdateTokenInput](https://github.com/affinidi/affinidi-tdk-dart/tree/main/clients/iam_client/doc/UpdateTokenInput.md)
    Required
  Details to update in the Personal Access Token.

Example

```dart
import 'package:dio/dio.dart';
import 'package:affinidi_tdk_auth_provider/affinidi_tdk_auth_provider.dart';
import 'package:affinidi_tdk_iam_client/affinidi_tdk_iam_client.dart';
import 'package:dotenv/dotenv.dart';

try {
    late TokensApi tokensApi;

    final dio = Dio(BaseOptions(
      baseUrl: AffinidiTdkIamClient.basePath,
      connectTimeout: const Duration(seconds: 5),
      receiveTimeout: const Duration(seconds: 5),
    ));
    final apiClient = AffinidiTdkIamClient(
        dio: dio, authTokenHook: authProvider.fetchProjectScopedToken);
    tokensApi = apiClient.getTokensApi();

    final tokenId = "";

    final updateTokenInput = UpdateTokenInputBuilder()
      ..name = "token_name";

    final response = (await tokensApi.updateToken(tokenId: tokenId , updateTokenInput: updateTokenInput.build()));

    print(response);
  } catch (e) {
    print('Exception: $e');
  }
```
