@rsksmart/express-did-auth
Version:
Authentication with Verifiable Credentials for Express.js
57 lines • 3.48 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.authenticationFactory = void 0;
const ethereumjs_util_1 = require("ethereumjs-util");
const errors_1 = require("../errors");
const jwt_utils_1 = require("../jwt-utils");
const cookies_1 = require("./cookies");
function authenticationFactory(challengeVerifier, state, sessionManagerFactory, requestCounterFactory, config, businessLogic) {
return function (req, res) {
return __awaiter(this, void 0, void 0, function* () {
try {
const { response } = req.body;
if (!response)
return res.status(401).send(errors_1.NO_RESPONSE);
const { sig, did } = response;
const { loginMessageHeader, useCookies, serviceUrl } = config;
const expectedMessage = loginMessageHeader
? `${loginMessageHeader}\nURL: ${serviceUrl}\nVerification code: ${challengeVerifier.get(did)}`
: `URL: ${serviceUrl}\nVerification code: ${challengeVerifier.get(did)}`;
const messageDigest = ethereumjs_util_1.hashPersonalMessage(Buffer.from(expectedMessage));
const ecdsaSignature = ethereumjs_util_1.fromRpcSig(sig);
const address = '0x' + ethereumjs_util_1.pubToAddress(ethereumjs_util_1.ecrecover(messageDigest, ecdsaSignature.v, ecdsaSignature.r, ecdsaSignature.s)).toString('hex');
if (address !== did.split(':').pop().toLowerCase())
return res.status(401).send(errors_1.INVALID_CHALLENGE_RESPONSE);
const isValid = businessLogic ? yield businessLogic(response) : true;
if (!isValid)
return res.status(401).send(errors_1.UNAUTHORIZED_USER);
const requestCounter = requestCounterFactory();
const sessionManager = sessionManagerFactory();
const accessToken = yield jwt_utils_1.generateAccessToken(did, config);
const refreshToken = sessionManager.createRefreshToken();
state.sessions[did] = { requestCounter, sessionManager };
state.refreshTokens[refreshToken] = did;
if (!useCookies)
return res.status(200).json({ accessToken, refreshToken });
cookies_1.setCookies(res, did, accessToken, refreshToken);
return res.status(200).send();
}
catch (err) {
if (err.message)
return res.status(401).send(escape(err.message));
return res.status(401).send('Unhandled error');
}
});
};
}
exports.authenticationFactory = authenticationFactory;
//# sourceMappingURL=authentication-factory.js.map