uport-project / ethr-did

Create ethr DIDs
Apache License 2.0
259 stars 53 forks source link

Failed to verify JWT #74

Closed m-yahya closed 3 years ago

m-yahya commented 3 years ago

Describe the bug Failed to verify JWT using ethrDid.verifyJWT() function. Error message:

did-jwt/lib/index.js:523
        throw new Error(`Unable to resolve DID document for ${issuer}: ${error}, ${message || ''}`);
              ^

Error: Unable to resolve DID document for 
did:ethr:rinkeby:0x02b8e69f6c71348ff837043b5b51e23b43a0dabbb2b634a8d2dc08c0b156daf7b1: 
unknownNetwork, The DID resolver does not have a configuration for network: rinkeby

To Reproduce

  1. Install dependencies
  2. $ node index.js

Expected behavior A verified output of JWT

Sample Code

const { EthrDID } = require("ethr-did");
const { Resolver } = require("did-resolver");
const { getResolver } = require("ethr-did-resolver");

const providerConfig = {
  rpcUrl: "https://rinkeby.infura.io/v3/<project id>",
  chainNameOrId: "rinkeby",
};

const ethrDidResolver = getResolver(providerConfig);
const didResolver = new Resolver(ethrDidResolver);

let createDid = async () => {
  const keypair = EthrDID.createKeyPair();

  // 1. create did
  const ethrDid = new EthrDID({
    ...keypair,
    ...providerConfig,
    resolver: didResolver,
  });

  // 2. sign jwt
  const jwt = await ethrDid.signJWT({ hello: "world" });

  // 3. verify jwt
  const { payload, issuer } = await ethrDid.verifyJWT(jwt, didResolver);

  console.log(payload);
  console.log(issuer);
};

createDid();

Additional context Dependencies:

"did-jwt": "^5.6.0",
"did-resolver": "^3.1.0",
"ethr-did": "^2.1.4",
"ethr-did-resolver": "^4.3.3",

any help what I'm missing here? Thanks

mirceanis commented 3 years ago

Hi @m-yahya, thanks for reporting this.

This happens because there is a difference in the config expected by new EthrDID(config) and getResolver(config) EthrDID looks for chainNameOrId while getResolver has 2 different fields: chainId and name. Yes, this is annoying and should probably be fixed in ethr-did-resolver to make use of a field called chainNameOrId.

Based on your example, here's a version that works:

const { EthrDID } = require("ethr-did");
const { Resolver } = require("did-resolver");
const { getResolver } = require("ethr-did-resolver");

const rpcUrl = "https://rinkeby.infura.io/v3/<project id>";
const ethrDidResolver = getResolver({ rpcUrl, name: "rinkeby" });
const didResolver = new Resolver(ethrDidResolver);

let createDid = async () => {
  const keypair = EthrDID.createKeyPair();

  // 1. create did
  const ethrDid = new EthrDID({
    ...keypair,
    rpcUrl,
    chainNameOrId: "rinkeby"
  });

  // 2. sign jwt
  const jwt = await ethrDid.signJWT({ hello: "world" });

  // 3. verify jwt
  const { payload, issuer } = await ethrDid.verifyJWT(jwt, didResolver);

  console.log(payload);
  console.log(issuer);
};

createDid();

I'm closing this. Please reopen if you're still having trouble or if you think there is more to be fixed.