UNPKG

@rsksmart/express-did-auth

Version:

Authentication with Verifiable Credentials for Express.js

57 lines 3.48 kB
"use strict"; 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