Storage interface for did-auth

Usage no npm install needed!

<script type="module">
  import arcblockDidAuthStorage from 'https://cdn.skypack.dev/@arcblock/did-auth-storage';



styled with prettier

Interface for define a storage class that can be used by [@arcblock/did-auth].

Table of Contents

Motivation & Spec

Since tokens are used everywhere make achieve better QR code experience, we should allow users to customize how to generate/store/update token records.

Basic APIs that a token storage should support:

  • async init(), optional, should be called before creating any instance, open a database connection, creating a embed database on file system
  • async create(token, status = created), create a new token record, persist in data store
  • async exist?(token, did), check for token existense
  • async read(token), read a token from database,
  • async update(token, updates), update token record
  • async delete(token), remove a token record
  • async gc(), optional, run garbage collection on the token storage

Plan to support:

  • token-storage-mongo
  • token-storage-psql
  • token-storage-nedb
  • token-storage-memory


npm install @arcblock/did-auth-storage
// or
yarn add @arcblock/did-auth-storage


const StorageInterface = require('@arcblock/did-auth-storage');
const keystone = require('keystone');

module.exports = class KeystoneStorage extends StorageInterface {
  constructor() {
    this.model = keystone.list('LoginToken').model;

  create(token, status = 'created') {
    const LoginToken = this.model;
    const item = new LoginToken({ token, status });
    return item.save();

  read(token) {
    return this.model.findOne({ token });

  update(token, updates) {
    return this.model.findOneAndUpdate({ token }, updates);

  delete(token) {
    return this.model.remove({ token });

  exist(token, did) {
    return this.model.findOne({ token, did });


Name Website
wangshijun https://ocap.arcblock.io