跳到主要内容

请求签名

基本的流程与 快速开始 章节中一致,将 handler 中代码改为以下内容:

javascript
/* eslint-disable no-console */
const { toTypeInfo } = require('@arcblock/did');
const { fromPublicKey } = require('@ocap/wallet');
const { fromBase58 } = require('@ocap/util');
const { getRandomBytes } = require('@ocap/mcrypto');

const getRandomMessage = (len = 16) => {
  const hex = getRandomBytes(len);
  return hex.replace(/^0x/, '').toUpperCase();
};

const action = 'request-text-signature';
module.exports = {
  action,

onConnect() {

  return {

    signature: () => {

      const data = getRandomMessage();

      return {

        description: 'Please sign the text',

        type: 'mime:text/plain',

        data,

      };

    },

  };

},

  // eslint-disable-next-line consistent-return
  onAuth: ({ userDid, userPk, claims, updateSession }) => {
    const type = toTypeInfo(userDid);
    const user = fromPublicKey(userPk, type);
    const claim = claims.find((x) => x.type === 'signature');

    logger.info(`${action}.onAuth`, { userPk, userDid, claim });

    if (claim.origin) {
      if (user.verify(claim.origin, claim.sig, claim.method !== 'none') === false) {
        throw new Error('Origin signature error');
      }
    }

    updateSession({
      result: {
        origin: fromBase58(claim.origin).toString(),
        sig: claim.sig,
      },
    });
  },
};

将前端部分调用 DID Connect 代码改为以下内容:

javascript
connectApi.open({
  locale: 'zh',
  action: 'request-text-signature',
  onSuccess({ result }) {
    // signatue data will be in result
  },
  messages: {
    title: 'Request Text Signature',
    scan: 'Please sign some text to continue',
  },
});