IAM Client Library is a TypeScript library to be used in decentralized applications for authentication and authorization using Decentralized Identifiers (DIDs) and Verifiable Credentials (VCs). DIDs and VCs are central components of self-sovereign identity, a paradigm that promotes user custody over their digital identity.
To read more about Decentralized Identifiers and Verifiable Credentials, and how they are used in the Energy Web tech stack, see our documentation here.
iam-client-lib
is a key dependency of Switchboard, the identity and access management (IAM) interface for the Energy Web Decentralized Operating System.
Using iam-client-lib
, Switchboard allows users to:
- Create self-sovereign Decentralized Identifiers (DID) for users and assets using a connection with a crypto wallet such as MetaMask. DIDs are anchored in a smart contract on the Energy Web Chain
- Define hierarchical, role-based structures for organizations, applications and assets that participate in grid activities
- Request and issue Verifiable Credentials that are required to take on roles within an organization or application that is registered on Switchboard
For documentation on iam-client-lib
modules and API:
The following is for installing and building iam-client-lib
directly. For guidance on how to integrate the library into an application, see Getting Started below.
Use npm
>= 7 to install dependencies.
npm install
To generate bundled JS files and types, use npm run build
. Generated files are located in the dist folder.
Tests are located in the /e2e directory. For testing, use npm run test:watch
.
The following is for integrating iam-client-lib
as a dependency in your application.
See source code examples for integrating iam-client-lib
into client applications here: iam-client-examples
React Demo / Angular Demo / Vue Demo
iam-client-lib
is written in TypeScript. Your application must use Node.js >= 10iam-client-lib
has a WebAssembly dependency. Some frameworks/bundlers do not support this out of the box, so additional action is required based on the framework you are using:
For Angular applications, add the following to package.json
:
"browser": { "fs": false, "os": false, "path": false }
For React applications:
-
Webpack 5 no longer pollyfills Node.js core modules automatically. You must install browser-compatible modules and specify them as fallbacks for Webpack. If you are using
create-react-app
that uses Webpack > 4 to bootstrap your React project, you will need to install @craco/craco or react-app-rewired, and specify the fallbacks in the Webpack configuration override file. For an example of how to do this, see the IAM Client Example for React applications here. This application uses Create React App Override (CRACO). -
You must have a Webpack resolver for
.wasm
file extensions. If you are usingcreate-react-app
that uses Webpack > 4 to bootstrap your React project, you will need to install @craco/craco or react-app-rewired to add a resolver for.wasm
file extensions in the Webpack configuration override file. For an example of how to to do this, see IAM Client Examples for React applications here.
To install the latest version of iam-client-lib
:
npm i iam-client-lib
To install the pre-release version of iam-client-lib
:
npm i iam-client-lib@canary
Note that some library dependencies require node.js
built-ins. When iam-client-lib
is used in browser applications, you must make sure these dependencies are polyfilled. If your application is bundled with Webpack, most dependencies can be polyfilled with node-polyfill-webpack-plugin.
Note: You can see a full implementation of initializing iam-client-lib
in the Switchboard application here.
Your application will need to initialize the library's modules. Because the library's modules have internal depenencies, modules must be initialized by the application in the correct order:
This will initialize staking and messaging services, and allow a connection to the cache server.
const { signerService, messagingService, connectToCacheServer } =
await initWithPrivateKeySigner(privateKey, rpcUrl);
Depending on the signer type (i.e. MetaMask, WalletConnect), a signature may be requested.
// IAM has builtin default settings for VOLTA CHAIN, which can overriden
// 1111 is an example of another ChainID (https://chainlist.org/)
setChainConfig(1111, {
didContractAddress: '0x3e2fb24edc3536d655720280b427c91bcb55f3d6',
ensRegistryAddress: '0xa372d665f83197a63bbe633ebe19c7bfd4943003',
ensResolverAddress: '0xe878bdcf5148307378043bfd2b584909aa48a227',
rpcUrl: 'http://some-rpc.com',
});
setMessagingConfig(1111, {
messagingMethod: MessagingMethod.Nats,
natsServerUrl: 'https://some-exchange-server.com',
});
setCacheConfig(1111, {
url: 'https://some-cache-server.com/',
cacheServerSupportsAuth: true,
});
const {
cacheClient,
domainsService,
connectToDidRegistry,
verifiableCredentialsService,
} = await connectToCacheServer();
const { didRegistry, claimsService } = await connectToDidRegistry();
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
For questions and support please use Energy Web's Discord channel
Or reach out to our contributing team members by posting an issue on this repository:
The Energy Web Decentralized Operating System is a blockchain-based, multi-layer digital infrastructure.
The purpose of EW-DOS is to develop and deploy an open and decentralized digital operating system for the energy sector in support of a low-carbon, customer-centric energy future.
We develop blockchain technology, full-stack applications and middleware packages that facilitate participation of Distributed Energy Resources on the grid, and create open market places for transparent and efficient renewable energy trading.
-
To learn about more about the EW-DOS tech stack, see our documentation.
-
For an overview of the energy-sector challenges our use cases address, go here.
For a deep-dive into the motivation and methodology behind our technical solutions, we encourage you to read our White Papers:
This project is licensed under the GNU General Public License v3.0 or later - see the LICENSE file for details